From 19c9c55db3a6180fd1a5bc47d134bddf94ae3933 Mon Sep 17 00:00:00 2001 From: changwangss Date: Wed, 12 Jun 2024 03:29:13 -0700 Subject: [PATCH 01/22] migrate INC 1.x quantization api to 2.x Signed-off-by: changwangss --- docs/examples.md | 10 +- docs/export.md | 6 +- docs/metrics.md | 29 - docs/quantization.md | 48 +- .../multiple-choice/quantization/README.md | 8 +- .../multiple-choice/quantization/run_swag.py | 54 +- .../quantization/run_tuning.sh | 4 +- .../quantization/README.md | 17 +- .../quantization/ptq/run_tuning.sh | 44 +- .../quantization/qat/run_tuning.sh | 7 +- .../quantization/run_glue.py | 71 +- .../quantization/README.md | 6 +- .../quantization/run_glue.py | 6 +- .../transformers/trainer.py | 654 ++---------------- 14 files changed, 200 insertions(+), 764 deletions(-) delete mode 100644 docs/metrics.md diff --git a/docs/examples.md b/docs/examples.md index b6fe8b0e6af..5e833e9bbca 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -37,8 +37,8 @@ Intel Extension for Transformers is a powerful toolkit with multiple model optim Model Task Dataset - PostTrainingDynamic - PostTrainingStatic + dynamic + static @@ -177,7 +177,7 @@ Intel Extension for Transformers is a powerful toolkit with multiple model optim Model Task Dataset - QuantizationAwareTraining + qat No Trainer quantization @@ -206,7 +206,7 @@ Intel Extension for Transformers is a powerful toolkit with multiple model optim Model Task Dataset - PostTrainingStatic + static @@ -232,7 +232,7 @@ Intel Extension for Transformers is a powerful toolkit with multiple model optim Model Task Dataset - PostTrainingStatic + static diff --git a/docs/export.md b/docs/export.md index c0fda81a54a..619402e3b14 100644 --- a/docs/export.md +++ b/docs/export.md @@ -22,9 +22,9 @@ We support exporting PyTorch models into ONNX models with our well-designed API | Input Model | Export FP32 | Export BF16 | Export INT8 | | --- | --- | --- | --- | | FP32 PyTorch Model | ✔ | ✔ | / | -| INT8 PyTorch Model
(PostTrainingDynamic) | / | / | ✔ | -| INT8 PyTorch Model
(PostTrainingStatic) | / | / | ✔ | -| INT8 PyTorch Model
(QuantizationAwareTraining) | / | / | ✔ | +| INT8 PyTorch Model
(dynamic) | / | / | ✔ | +| INT8 PyTorch Model
(static) | / | / | ✔ | +| INT8 PyTorch Model
(qat) | / | / | ✔ | ## Examples diff --git a/docs/metrics.md b/docs/metrics.md deleted file mode 100644 index c1e81bde32f..00000000000 --- a/docs/metrics.md +++ /dev/null @@ -1,29 +0,0 @@ -Metrics -======= -1. [Introduction](#introduction) -2. [Supported Metric](#supported-metric) -3. [Metric Class Summary](#metric-class-summary) -4. [Get Start with Metrics](#get-start-with-metrics) - -## Introduction -In terms of evaluating the performance of a specific model, we should have general metrics to measure the performance of different models. The Metric defines which metric will be used to measure the performance of tuned models and how to use the metric, just like: greater is better, performance tolerance ... and so on. The Metric only provides the metric name, all metrics class is from [datasets](https://github.com/huggingface/datasets/tree/main/metrics). - -## Supported Metric -All metrics be provide by [Huggingface datasets](https://github.com/huggingface/datasets/tree/main/metrics). - -## Metric Class Summary -- arguments: - |Argument |Type |Description |Default value | - |:----------|:----------|:-----------------------------------------------|:----------------| - |name |string |Metric name which evaluates function returns, like:"eval_f1", "eval_accuracy"...| | - |greater_is_better|bool |Used to describe the usage of the metric, like: greater is better for f1, this parameter is only used for quantization.|True| - |is_relative|bool |Used in conjunction with "criterion". If "criterion" is 0.01, and "is_relative" is True, it means that we want to get an optimized model which metric drop <1% relative, if "is_relative" is False, means metric drop <1% absolute, this parameter is only used for quantization.|True | - |criterion |float |Used in conjunction with "is_relative". If "criterion" is 0.01, and "is_relative" is True, it means that we want to get an optimized model which metric drop <1% relative, if "criterion" is 0.02, means metric drop <2% relative, this parameter is only used for quantization.|0.01 | - |weight_ratio|float |Used when there are multiple metrics, for example: you want to focus on both f1 and accuracy, then you will create f1 instance and accuracy instance, and indicate their weight proportion. If weight_ratio of f1 is 0.3, and weight ratio of accuracy is 0.7, then the final metric to tune is f1*0.3 + accuracy*0.7, this parameter is only used for quantization.|None | - -## Get Start with Metrics -- example: - ```python - from intel_extension_for_transformers.transformers import metric - metric.Metric(name="eval_f1", greater_is_better=True, is_relative=True, criterion=0.01, weight_ratio=None) - ``` diff --git a/docs/quantization.md b/docs/quantization.md index 7d4ff061503..d3d1b0ea70e 100644 --- a/docs/quantization.md +++ b/docs/quantization.md @@ -134,33 +134,18 @@ Quantization methods include the following three types: ## Get Started ### Script: ```python -from intel_extension_for_transformers.transformers import metric, objectives, QuantizationConfig +from neural_compressor.config import PostTrainingConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer # Replace transformers.Trainer with NLPTrainer # trainer = transformers.Trainer(......) trainer = NLPTrainer(......) -metric = metrics.Metric( - name="eval_f1", is_relative=True, criterion=0.01 -) -objective = objectives.performance -q_config = QuantizationConfig( - approach="PostTrainingStatic", - metrics=[metric], - objectives=[objective] +q_config = PostTrainingConfig( + approach="static" ) model = trainer.quantize(quant_config=q_config) ``` Please refer to [quantization example](../examples/huggingface/pytorch/text-classification/quantization/run_glue.py) for the details. -### Create an Instance of Metric -The Metric defines which metric will be used to measure the performance of tuned models. -- example: - ```python - metric = metrics.Metric(name="eval_f1", greater_is_better=True, is_relative=True, criterion=0.01, weight_ratio=None) - ``` - - Please refer to [metrics document](metrics.md) for the details. - ### Create an Instance of Objective(Optional) In terms of evaluating the status of a specific model during tuning, we should have general objectives to measure the status of different models. @@ -178,19 +163,30 @@ The QuantizationConfig contains all the information related to the model quantiz |Argument |Type |Description |Default value | |:----------|:----------|:-----------------------------------------------|:----------------| -|framework |string |Which framework you used |"pytorch" | -|approach |string |Which quantization approach you used |"PostTrainingStatic"| +|approach |string |Which quantization approach you used |"static"| |timeout |integer |Tuning timeout(seconds), 0 means early stop; combine with max_trials field to decide when to exit|0 | |max_trials |integer |Max tune times |100 | -|metrics |list of Metric|Used to evaluate accuracy of tuning model, no need for NoTrainerOptimizer|None | -|objectives |list of Objective|Objective with accuracy constraint guaranteed|performance| +|objective |list of Objective|Objective with accuracy constraint guaranteed|performance| - example: ```python - q_config = QuantizationConfig( - approach="PostTrainingDynamic", - metrics=[metric], - objectives=[objective] + from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion + ) + + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative", # optional. Available values are "relative" and "absolute". + tolerable_loss=0.01, # optional. + ) + q_config = PostTrainingQuantConfig( + approach="dynamic", + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion ) ``` diff --git a/examples/huggingface/pytorch/multiple-choice/quantization/README.md b/examples/huggingface/pytorch/multiple-choice/quantization/README.md index d966319be83..040ea972ba9 100644 --- a/examples/huggingface/pytorch/multiple-choice/quantization/README.md +++ b/examples/huggingface/pytorch/multiple-choice/quantization/README.md @@ -9,19 +9,17 @@ This example shows the model quantization for multiple choice task. A multiple c ``` pip install intel-extension-for-transformers pip install -r requirements.txt -pip install transformers==4.34.1 ``` ->**Note**: Please use transformers no higher than 4.34.1 # Run -The script `run_swag.py` provides three quantization approaches (PostTrainingStatic, PostTrainingStatic and QuantizationAwareTraining) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). +The script `run_swag.py` provides three quantization approaches PostTrainingDynamic(dynamic), PostTrainingStatic(static) and QuantizationAwareTraining(qat) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). ``` python run_swag.py \ --model_name_or_path ehdwns1516/bert-base-uncased_SWAG \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --do_train \ --do_eval \ --pad_to_max_length \ @@ -31,6 +29,6 @@ python run_swag.py \ # Validated model list -|DATASET|Pretrained model|PostTrainingDynamic | PostTrainingStatic | QuantizationAwareTraining +|DATASET|Pretrained model|dynamic | static | qat |---|------------------------------------|---|---|--- |SWAG|ehdwns1516/bert-base-uncased_SWAG| ✅| ✅| ✅ diff --git a/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py b/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py index 511010f4da6..3bea53a93f8 100644 --- a/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py +++ b/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py @@ -28,7 +28,13 @@ from dataclasses import dataclass, field from datasets import load_dataset from itertools import chain -from intel_extension_for_transformers.transformers import metrics, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -215,9 +221,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="POSTTRAININGSTATIC", - metadata={"help": "Quantization approach. Supported approach are POSTTRAININGSTATIC, " - "POSTTRAININGDYNAMIC and QUANTIZATIONAWARETRAINING."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dyanmic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -473,26 +479,40 @@ def compute_metrics(eval_predictions): model.config.save_pretrained(training_args.output_dir) trainer.save_model(training_args.output_dir) - if optim_args.quantization_approach != "POSTTRAININGDYNAMIC": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) model.config.save_pretrained(training_args.output_dir) - if optim_args.quantization_approach == "QUANTIZATIONAWARETRAINING": - early_stopping_patience = 6 + + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ early_stopping_threshold)) - - tune_metric = metrics.Metric( - name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol - ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - metrics=[tune_metric], - sampling_size = len(train_dataset)//20 - ) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark_only: diff --git a/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh b/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh index 3a718e34f0e..f377eea06af 100644 --- a/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh @@ -11,7 +11,7 @@ function main { # init params function init_params { tuned_checkpoint="saved_results" - approach="PostTrainingStatic" + approach="static" batch_size=8 for var in "$@" do @@ -47,7 +47,7 @@ function run_tuning { approach="PostTrainingDynamic" elif [ "${topology}" = "bert_base_swag_qat" ]; then model_name_or_path="ehdwns1516/bert-base-uncased_SWAG" - approach="QuantizationAwareTraining" + approach="qat" extra_cmd=$extra_cmd" --learning_rate 1e-5 \ --num_train_epochs 6 \ --eval_steps 100 \ diff --git a/examples/huggingface/pytorch/text-classification/quantization/README.md b/examples/huggingface/pytorch/text-classification/quantization/README.md index d864de0263e..c851b4c165b 100644 --- a/examples/huggingface/pytorch/text-classification/quantization/README.md +++ b/examples/huggingface/pytorch/text-classification/quantization/README.md @@ -1,6 +1,6 @@ Step-by-Step​ ============ -The script `run_glue.py` provides three quantization approaches (PostTrainingStatic, PostTrainingStatic and QuantizationAwareTraining) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). +The script `run_glue.py` provides three quantization approaches (dynamic, static and qat) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). # Prerequisite​ ## 1. Create Environment​ @@ -8,9 +8,7 @@ Recommend python 3.9 or higher version. ```shell pip install intel-extension-for-transformers pip install -r requirements.txt -pip install transformers==4.34.1 ``` ->**Note**: Please use transformers no higher than 4.34.1 # Run @@ -23,7 +21,7 @@ python run_glue.py \ --model_name_or_path distilbert-base-uncased-finetuned-sst-2-english \ --task_name sst2 \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --do_train \ --do_eval \ --output_dir ./saved_result \ @@ -43,7 +41,7 @@ python run_glue.py \ ``` **Notes**: - - Choice of `quantization_approach` can be `PostTrainingDynamic`, `PostTrainingStatic`, and `QuantizationAwareTraining`. + - Choice of `quantization_approach` can be `dynamic`, `static`, and `qat`. - Choice of `task_name` can be `cola`, `sst2`, `mrpc`, `stsb`, `qqp`, `mnli`, `qnli`, `rte`, and `wnli`. ## 2. Distributed Data Parallel Support @@ -66,16 +64,17 @@ python -m torch.distributed.launch --master_addr= --nproc_per_no --model_name_or_path distilbert-base-uncased-finetuned-sst-2-english \ --task_name sst2 \ --tune \ - --quantization_approach QuantizationAwareTraining \ + --quantization_approach qat \ --do_train \ --do_eval \ --output_dir ./saved_result \ - --overwrite_output_dir + --overwrite_output_dir \ + --save_safetensors False ``` ## 3. Validated model list -|Task|Pretrained model|PostTrainingDynamic | PostTrainingStatic | QuantizationAwareTraining +|Task|Pretrained model| dynamic| static | qat |---|------------------------------------|---|---|--- |MRPC|textattack/bert-base-uncased-MRPC| ✅| ✅| ✅ |MRPC|textattack/albert-base-v2-MRPC| ✅| ✅| N/A @@ -107,7 +106,7 @@ python -m torch.distributed.launch --master_addr= --nproc_per_no bash run_benchmark.sh --topology=[topology] --config=./saved_int8 --mode=benchmark --int8=true ``` -### QuantizationAwareTraining +### qat - Topology: - BERT-MRPC: bert_base_mrpc diff --git a/examples/huggingface/pytorch/text-classification/quantization/ptq/run_tuning.sh b/examples/huggingface/pytorch/text-classification/quantization/ptq/run_tuning.sh index cc6a24cf325..6719dc50825 100755 --- a/examples/huggingface/pytorch/text-classification/quantization/ptq/run_tuning.sh +++ b/examples/huggingface/pytorch/text-classification/quantization/ptq/run_tuning.sh @@ -16,7 +16,7 @@ function init_params { batch_size=8 MAX_SEQ_LENGTH=128 model_type="bert" - approach="PostTrainingStatic" + approach="static" script="../run_glue.py" for var in "$@" do @@ -46,88 +46,88 @@ function init_params { function run_tuning { if [ "${topology}" = "bert_base_mrpc_static" ]; then model_name_or_path="textattack/bert-base-uncased-MRPC" - approach="PostTrainingStatic" + approach="static" extra_cmd=$extra_cmd" --task_name mrpc" elif [ "${topology}" = "bert_base_mrpc_dynamic" ]; then extra_cmd=$extra_cmd" --task_name mrpc" model_name_or_path="textattack/bert-base-uncased-MRPC" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "bert_base_SST-2_static" ]; then extra_cmd=$extra_cmd" --task_name sst2" model_name_or_path="echarlaix/bert-base-uncased-sst2-acc91.1-d37-hybrid" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "bert_base_SST-2_dynamic" ]; then extra_cmd=$extra_cmd" --task_name sst2" model_name_or_path="echarlaix/bert-base-uncased-sst2-acc91.1-d37-hybrid" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "bert_base_CoLA_static" ]; then extra_cmd=$extra_cmd" --task_name cola" model_name_or_path="textattack/bert-base-uncased-CoLA" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "bert_base_STS-B_static" ]; then extra_cmd=$extra_cmd" --task_name stsb" model_name_or_path="Contrastive-Tension/BERT-Base-CT-STSb" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "bert_base_RTE_static" ]; then extra_cmd=$extra_cmd" --task_name rte" model_name_or_path="textattack/bert-base-uncased-RTE" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "bert_large_RTE_static" ]; then extra_cmd=$extra_cmd" --task_name rte" model_name_or_path="yoshitomo-matsubara/bert-large-uncased-rte" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "bert_large_CoLA_static" ]; then extra_cmd=$extra_cmd" --task_name cola" model_name_or_path="yoshitomo-matsubara/bert-large-uncased-cola" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "bert_large_MRPC_static" ]; then extra_cmd=$extra_cmd" --task_name mrpc" model_name_or_path="yoshitomo-matsubara/bert-large-uncased-mrpc" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "bert_large_QNLI_static" ]; then extra_cmd=$extra_cmd" --task_name qnli" model_name_or_path="yoshitomo-matsubara/bert-large-uncased-qnli" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "camembert_base_XNLI_dynamic" ]; then model_name_or_path="BaptisteDoyen/camembert-base-xnli" - approach="PostTrainingDynamic" + approach="dynamic" extra_cmd=$extra_cmd" --dataset_name xnli --dataset_config_name fr" elif [ "${topology}" = "xlnet_base_SST-2_static" ]; then extra_cmd=$extra_cmd" --task_name sst2" model_name_or_path="textattack/xlnet-base-cased-SST-2" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "funnel_small_MRPC_static" ]; then extra_cmd=$extra_cmd" --task_name mrpc" model_name_or_path="funnel-transformer/small-base" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "roberta_base_SST-2_dynamic" ]; then extra_cmd=$extra_cmd" --task_name sst2" model_name_or_path="textattack/roberta-base-SST-2" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "distillbert_base_SST-2_static" ]; then extra_cmd=$extra_cmd" --task_name sst2" model_name_or_path="distilbert-base-uncased-finetuned-sst-2-english" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "distillbert_base_SST-2_dynamic" ]; then extra_cmd=$extra_cmd" --task_name sst2" model_name_or_path="distilbert-base-uncased-finetuned-sst-2-english" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "albert_base_MRPC_static" ]; then extra_cmd=$extra_cmd" --task_name mrpc" model_name_or_path="textattack/albert-base-v2-MRPC" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "albert_base_MRPC_dynamic" ]; then extra_cmd=$extra_cmd" --task_name mrpc" model_name_or_path="textattack/albert-base-v2-MRPC" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "xlm_roberta_large_XNLI_dynamic" ]; then extra_cmd=$extra_cmd" --dataset_name xnli --dataset_config_name en" model_name_or_path="joeddav/xlm-roberta-large-xnli" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "bert_base_SST-2_static_no_trainer" ]; then extra_cmd=" --task_name sst2" model_name_or_path="echarlaix/bert-base-uncased-sst2-acc91.1-d37-hybrid" - approach="PostTrainingStatic" + approach="static" script="../run_glue_no_trainer.py" fi diff --git a/examples/huggingface/pytorch/text-classification/quantization/qat/run_tuning.sh b/examples/huggingface/pytorch/text-classification/quantization/qat/run_tuning.sh index 3d5e71b0212..28aba1b27b7 100644 --- a/examples/huggingface/pytorch/text-classification/quantization/qat/run_tuning.sh +++ b/examples/huggingface/pytorch/text-classification/quantization/qat/run_tuning.sh @@ -18,7 +18,7 @@ function init_params { batch_size=8 MAX_SEQ_LENGTH=128 model_type="bert" - approach="PostTrainingStatic" + approach="static" for var in "$@" do case $var in @@ -49,7 +49,7 @@ function run_tuning { TASK_NAME="mrpc" model_name_or_path="bert-base-uncased" model_type="bert" - approach="QuantizationAwareTraining" + approach="qat" extra_cmd=$extra_cmd" --learning_rate 1e-5 \ --num_train_epochs 6 \ --eval_steps 100 \ @@ -59,7 +59,8 @@ function run_tuning { --evaluation_strategy steps \ --save_strategy steps \ --metric_for_best_model accuracy \ - --save_total_limit 1" + --save_total_limit 1 \ + --save_safetensors False" fi diff --git a/examples/huggingface/pytorch/text-classification/quantization/run_glue.py b/examples/huggingface/pytorch/text-classification/quantization/run_glue.py index 0c7df87abea..5825a1cb9be 100644 --- a/examples/huggingface/pytorch/text-classification/quantization/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/quantization/run_glue.py @@ -26,8 +26,9 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import objectives, OptimizedModel from intel_extension_for_transformers.transformers.trainer import NLPTrainer +from neural_compressor.config import PostTrainingQuantConfig, QuantizationAwareTrainingConfig, TuningCriterion, AccuracyCriterion from transformers import ( AutoConfig, AutoModelForSequenceClassification, @@ -198,13 +199,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, - ) - metric_name: Optional[str] = field( - default=None, - metadata={"help": "Metric used for the tuning strategy."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) is_relative: Optional[bool] = field( default=True, @@ -504,20 +501,6 @@ def compute_metrics(p: EvalPrediction): else: data_collator = None - metric_name = ( - optim_args.metric_name - if optim_args.metric_name is not None - else "eval_" - + ( - "pearson" - if data_args.task_name == "stsb" - else "matthews_correlation" - if data_args.task_name == "cola" - else "accuracy" - ) - ) - training_args.metric_for_best_model = metric_name - # Initialize our Trainer trainer = NLPTrainer( model=model, @@ -534,28 +517,40 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( - name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol - ) objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective], - sampling_size = len(train_dataset)//20 - ) + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark_only: diff --git a/examples/huggingface/tensorflow/text-classification/quantization/README.md b/examples/huggingface/tensorflow/text-classification/quantization/README.md index ab459bf84d4..b590228ad0d 100644 --- a/examples/huggingface/tensorflow/text-classification/quantization/README.md +++ b/examples/huggingface/tensorflow/text-classification/quantization/README.md @@ -57,7 +57,7 @@ python run_glue.py --model_name_or_path [model_name_or_path] \ --task_name mrpc \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --do_train \ --do_eval \ --output_dir ./saved_result \ @@ -77,7 +77,7 @@ python run_glue.py ``` > **Notes**: - - quantization_approach in Tensorflow consist of `PostTrainingStatic`, `QuantizationAwareTraining`. + - quantization_approach in Tensorflow consist of `static`, `qat`. - task_name consist of cola, sst2, mrpc, stsb, qqp, mnli, qnli, rte, wnli. @@ -85,7 +85,7 @@ python run_glue.py We also supported Distributed Data Parallel training on multi nodes settings for quantization. -> **Note**: multi node settings boost performance in the training process and may not show good performance with PostTrainingStatic quantization strategy +> **Note**: multi node settings boost performance in the training process and may not show good performance with static quantization strategy The default strategy we used is `MultiWorkerMirroredStrategy` in Tensorflow, and with `task_type` set as "worker", we are expected to pass following extra parameters to the script: diff --git a/examples/huggingface/tensorflow/text-classification/quantization/run_glue.py b/examples/huggingface/tensorflow/text-classification/quantization/run_glue.py index c2ca0c45603..b025ba2cc90 100644 --- a/examples/huggingface/tensorflow/text-classification/quantization/run_glue.py +++ b/examples/huggingface/tensorflow/text-classification/quantization/run_glue.py @@ -189,9 +189,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, diff --git a/intel_extension_for_transformers/transformers/trainer.py b/intel_extension_for_transformers/transformers/trainer.py index e3720b5da59..2f52921f272 100644 --- a/intel_extension_for_transformers/transformers/trainer.py +++ b/intel_extension_for_transformers/transformers/trainer.py @@ -27,18 +27,24 @@ import warnings from functools import partial from neural_compressor import __version__ as nc_version -from neural_compressor.experimental import Component from neural_compressor.utils import logger from intel_extension_for_transformers.transformers import ( DistillationConfig, Provider, PruningMode, - QuantizationConfig, - QuantizationMode, + # QuantizationConfig, + # QuantizationMode, PruningConfig, DynamicLengthConfig, BenchmarkConfig, ) +from neural_compressor.training import prepare_compression +from neural_compressor.quantization import fit +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion +) from intel_extension_for_transformers.transformers.benchmark import benchmark from intel_extension_for_transformers.transformers.utils.metrics import Metric from intel_extension_for_transformers.transformers.utils.utility import LazyImport @@ -142,7 +148,6 @@ def __init__(self, *args, **kwargs): self.orchestrate_opt_pruning = False self.dynamic_config = None - @property def resuming_checkpoint(self): """Getter of the resuming checkpoint.""" @@ -203,27 +208,17 @@ def builtin_eval_func(self, model): torch.manual_seed(self.args.seed) results = self.evaluate() logger.info(results) - if isinstance(self.metrics, list): - nums = len(self.metrics) - for metric in self.metrics: - assert metric.name in results.keys(), \ - "Please set metric from {}".format(results.keys()) - if nums == 1: - result = results.get(self.metrics[0].name) - else: # pragma: no cover - result = 0 - for metric in self.metrics: - assert metric.weight_ratio is not None, \ - "Please set weights for metric if you want to use more than one metric" - result += results[metric.name] * metric.weighted - logger.info("metric: {}".format(result)) - elif isinstance(self.metrics, Metric): - assert self.metrics.name in results.keys(), \ - "Please set metric from {}".format(results.keys()) - result = results.get(self.metrics.name) - logger.info("metric: {}".format(result)) - else: # pragma: no cover - assert False, "Please set the correct metrics format from the README" + task_name = self.eval_dataset.config_name + metric_name = "eval_" + ( + "pearson" + if task_name == "stsb" + else "matthews_correlation" + if task_name == "cola" + else "accuracy" + ) + assert metric_name in results.keys(), \ + "Please set metric from {}".format(results.keys()) + result = results.get(metric_name) logger.info("Throughput: {} samples/sec".format(results.get("eval_samples_per_second"))) return result @@ -249,42 +244,6 @@ def builtin_train_func(self, model): self.save_state() return self.model - def init_quantizer( - self, - quant_config, - provider: str = Provider.INC.value, - ): - """Initialize the quantizer. - - Args: - quant_config: The path to the YAML configuration file or QuantizationConfig class containing - accuracy goal, quantization objective and related dataloaders etc. - provider: The provider used to quantize. - - Returns: - An objective of neural_compressor Quantization class, which can automativally searches for - optimal quantization recipes for low precision model inference and achieving best tuning - objectives. - """ - from neural_compressor.experimental import Quantization - - assert isinstance(quant_config, QuantizationConfig), \ - "Please pass QuantizationConfig instance to trainer.quantize!" - self.quant_config = quant_config - self.metrics = self.quant_config.metrics - self._provider = Provider[provider.upper()].value - - if self.quant_config.framework == "pytorch": - if self.quant_config.approach != QuantizationMode.POSTTRAININGDYNAMIC.value \ - or self.quant_config.strategy == 'mse_v2': - self.quant_config.framework = "pytorch_fx" - - quantizer = Quantization(self.quant_config.inc_config) - quantizer.model = self.model - - self.quantizer = quantizer - return quantizer - def _inc_quantize( self, quant_config, @@ -295,34 +254,21 @@ def _inc_quantize( self.fp32_model = copy.deepcopy(self.model) except Exception as e: # pragma: no cover logger.warning("Model deepcopy failed: {}!".format(repr(e))) - if self.quantizer is None: - self.init_quantizer(quant_config=quant_config, provider=provider) - if self._eval_func is not None: - self.quantizer.eval_func = self._eval_func - else: # pragma: no cover - assert self.metrics is not None, \ - "Please pass the metrics to QuantizationConfig.metrics!" - self.quantizer.eval_func = self.builtin_eval_func - - if self.quant_config.framework == "pytorch_ipex": - self.model_config = self.model.config # jit model will loss config - if self.quant_config.approach != QuantizationMode.POSTTRAININGDYNAMIC.value \ - or self.quant_config.strategy == 'mse_v2': - # pylint: disable=E1101 - self.quantizer.calib_dataloader = self.get_train_dataloader() \ - if self._calib_dataloader is None else self._calib_dataloader - if self.quant_config.approach == QuantizationMode.QUANTIZATIONAWARETRAINING.value: - self.quantizer.q_func = \ - self.builtin_train_func if self._train_func is None else self._train_func - self.component = self.quantizer - self.opt_model = self.quantizer.fit() + if isinstance(quant_config, PostTrainingQuantConfig): + self.opt_model = fit(self.model, conf=quant_config, calib_dataloader=self.get_train_dataloader(), eval_func=self._eval_func) + else: + compression_manager = prepare_compression(self.model, quant_config) + compression_manager.callbacks.on_train_begin() + self.train() + compression_manager.callbacks.on_train_end() + self.opt_model = compression_manager.model self.enable_inc_quant = True self.save_model(self.args.output_dir) return self.opt_model.model def quantize( self, - quant_config: QuantizationConfig = None, + quant_config: Union[PostTrainingQuantConfig, QuantizationAwareTrainingConfig] = None, provider: str = Provider.INC.value, eval_func: Optional[Callable] = None, train_func: Optional[Callable] = None, @@ -607,501 +553,6 @@ def create_optimizer_builtin(self, config_list, teacher_model=None): components.append(component) return components - def train( - self, - component: Optional[Component] = None, - resume_from_checkpoint: Optional[Union[str, bool]] = None, - trial: Union["optuna.Trial", Dict[str, Any]] = None, - ignore_keys_for_eval: Optional[List[str]] = None, - **kwargs, - ): # pragma: no cover - """The main entry point tor train model. - - Args: - component (:obj:`Component`, `optional`): Component object handling the training process. - resume_from_checkpoint (:obj:`str` or :obj:`bool`, `optional`): If a :obj:`str`, local path - to a saved checkpoint as saved by a previous instance of :class:`~transformers.Trainer`. - If a :obj:`bool` and equals `True`, load the last checkpoint in `args.output_dir` as saved - by a previous instance of :class:`~transformers.Trainer`. If present, training will resume - from the model/optimizer/scheduler states loaded here. - trial (:obj:`optuna.Trial` or :obj:`Dict[str, Any]`, `optional`): The trial run or the - hyperparameter dictionary for hyperparameter search. - ignore_keys_for_eval (:obj:`List[str]`, `optional`): A list of keys in the output of your model - (if it is a dictionary) that should be ignored when gathering predictions for evaluation - during the training. - kwargs: Additional keyword arguments used to hide deprecated arguments - """ - resume_from_checkpoint = None if not resume_from_checkpoint else resume_from_checkpoint - - # memory metrics - must set up as early as possible - # pylint: disable=E1101 - self._memory_tracker.start() - - # pylint: disable=E1101 - args = self.args - - self.is_in_train = True - - self.component = component - - # do_train is not a reliable argument, as it might not be set and .train() still called, so - # the following is a workaround: - if args.fp16_full_eval and not args.do_train: - self._move_model_to_device(self.model, args.device) - - if "model_path" in kwargs: - resume_from_checkpoint = kwargs.pop("model_path") - warnings.warn( - "`model_path` is deprecated and will be removed in a future version. Use `resume_from_checkpoint` " - "instead.", - FutureWarning, - ) - if len(kwargs) > 0: - raise TypeError( - f"train() received got unexpected keyword arguments: {', '.join(list(kwargs.keys()))}." - ) - # This might change the seed so needs to run first. - self._hp_search_setup(trial) - - # Model re-init - model_reloaded = False - if self.model_init is not None: - # Seed must be set before instantiating the model when using model_init. - set_seed(args.seed) - self.model = self.call_model_init(trial) - model_reloaded = True - # Reinitializes optimizer and scheduler - self.optimizer, self.lr_scheduler = None, None - - # Load potential model checkpoint - if isinstance(resume_from_checkpoint, bool) and resume_from_checkpoint: - resume_from_checkpoint = get_last_checkpoint(args.output_dir) - if resume_from_checkpoint is None: - raise ValueError( - f"No valid checkpoint found in output directory ({args.output_dir})") - - if resume_from_checkpoint is not None: - if version.parse(__version__) < version.parse("4.19"): - if not os.path.isfile(os.path.join(resume_from_checkpoint, WEIGHTS_NAME)): - raise ValueError(f"Can't find a valid checkpoint at {resume_from_checkpoint}") - - logger.info(f"Loading model from {resume_from_checkpoint}).") - - if os.path.isfile(os.path.join(resume_from_checkpoint, CONFIG_NAME)): - config = PretrainedConfig.from_json_file( - os.path.join(resume_from_checkpoint, CONFIG_NAME)) - checkpoint_version = config.transformers_version - if checkpoint_version is not None and checkpoint_version != __version__: - logger.warn( - f"You are resuming training from a checkpoint trained with {checkpoint_version} of " - f"Transformers but your current version is {__version__}. " - "This is not recommended and could yield to errors or unwanted behaviors." - ) - - # We load the model state dict on the CPU to avoid an OOM error. - state_dict = torch.load(os.path.join(resume_from_checkpoint, WEIGHTS_NAME), - map_location="cpu") - # If the model is on the GPU, it still works! - self._load_state_dict_in_model(state_dict) - - # release memory - del state_dict - else: - self._load_from_checkpoint(resume_from_checkpoint) - - # If model was re-initialized, put it on the right device and update self.model_wrapped - if model_reloaded: - if self.place_model_on_device: - self._move_model_to_device(self.model, args.device) - self.model_wrapped = self.model - - # Keeping track whether we can can len() on the dataset or not - train_dataset_is_sized = isinstance(self.train_dataset, collections.abc.Sized) - - # Data loader and number of training steps - # pylint: disable=E1101 - train_dataloader = self.get_train_dataloader() - - # Setting up training control variables: - # number of training epochs: num_train_epochs - # number of training steps per epoch: num_update_steps_per_epoch - # total number of training steps to execute: max_steps - total_train_batch_size = args.train_batch_size * args.gradient_accumulation_steps * args.world_size - if train_dataset_is_sized: - num_update_steps_per_epoch = len(train_dataloader) // args.gradient_accumulation_steps - num_update_steps_per_epoch = max(num_update_steps_per_epoch, 1) - if args.max_steps > 0: - max_steps = args.max_steps - num_train_epochs = args.max_steps // num_update_steps_per_epoch + int( - args.max_steps % num_update_steps_per_epoch > 0) - # May be slightly incorrect if the last batch in the training datalaoder has a smaller size but it's - # the best we can do. - num_train_samples = args.max_steps * total_train_batch_size - else: - max_steps = math.ceil(args.num_train_epochs * num_update_steps_per_epoch) - num_train_epochs = math.ceil(args.num_train_epochs) - num_train_samples = len(self.train_dataset) * args.num_train_epochs - else: - # see __init__. max_steps is set when the dataset has no __len__ - max_steps = args.max_steps - # Setting a very large number of epochs so we go as many times as necessary over the iterator. - num_train_epochs = sys.maxsize - num_update_steps_per_epoch = max_steps - num_train_samples = args.max_steps * total_train_batch_size - - # pylint: disable=E1101 - if DebugOption.UNDERFLOW_OVERFLOW in self.args.debug: - if self.args.n_gpu > 1: - # nn.DataParallel(model) replicates the model, creating new variables and module - # references registered here no longer work on other gpus, breaking the module - raise ValueError("Currently --debug underflow_overflow is not supported under DP. " - "Please use DDP (torch.distributed.launch).") - else: - debug_overflow = DebugUnderflowOverflow(self.model) # noqa - - # delay_optimizer_creation = is_sagemaker_mp_enabled() or self.is_fsdp_xla_enabled or self.is_fsdp_enabled - delay_optimizer_creation = is_sagemaker_mp_enabled() - - if not delay_optimizer_creation: - self.create_optimizer_and_scheduler(num_training_steps=max_steps) - - self.state = TrainerState() - self.state.is_hyper_param_search = trial is not None - - # Activate gradient checkpointing if needed - if args.gradient_checkpointing: - self.model.gradient_checkpointing_enable() - - model = self._wrap_model(self.model_wrapped) - - # for the rest of this function `model` is the outside model, whether it was wrapped or not - if model is not self.model: - self.model_wrapped = model - - if delay_optimizer_creation: - self.create_optimizer_and_scheduler(num_training_steps=max_steps) - - # Check if saved optimizer or scheduler states exist - self._load_optimizer_and_scheduler(resume_from_checkpoint) - - # important: at this point: - # self.model is the Transformers Model - # self.model_wrapped is DDP(Transformers Model), Deepspeed(Transformers Model), etc. - - # Train! - num_examples = (self.num_examples(train_dataloader) - if train_dataset_is_sized else total_train_batch_size * args.max_steps) - - logger.info("***** Running training *****") - logger.info(f" Num examples = {num_examples}") - logger.info(f" Num Epochs = {num_train_epochs}") - logger.info(f" Instantaneous batch size per device = {args.per_device_train_batch_size}") - logger.info( - f" Total train batch size (w. parallel, distributed & accumulation) = {total_train_batch_size}" - ) - logger.info(f" Gradient Accumulation steps = {args.gradient_accumulation_steps}") - logger.info(f" Total optimization steps = {max_steps}") - - self.state.epoch = 0 - start_time = time.time() - epochs_trained = 0 - steps_trained_in_current_epoch = 0 - steps_trained_progress_bar = None - - # Check if continuing training from a checkpoint - if resume_from_checkpoint is not None and os.path.isfile( - os.path.join(resume_from_checkpoint, TRAINER_STATE_NAME)): - self.state = TrainerState.load_from_json( - os.path.join(resume_from_checkpoint, TRAINER_STATE_NAME)) - epochs_trained = self.state.global_step // num_update_steps_per_epoch - if not args.ignore_data_skip: - steps_trained_in_current_epoch = self.state.global_step % ( - num_update_steps_per_epoch) - steps_trained_in_current_epoch *= args.gradient_accumulation_steps - else: - steps_trained_in_current_epoch = 0 - - logger.info(" Continuing training from checkpoint, will skip to saved global_step") - logger.info(f" Continuing training from epoch {epochs_trained}") - logger.info(f" Continuing training from global step {self.state.global_step}") - if not args.ignore_data_skip: - logger.info( - f" Will skip the first {epochs_trained} epochs then the first {steps_trained_in_current_epoch} " - "batches in the first epoch. If this takes a lot of time, you can add the `--ignore_data_skip` " - "flag to your launch command, but you will resume the training on data already seen by your model." - ) - if self.is_local_process_zero() and not args.disable_tqdm: - steps_trained_progress_bar = tqdm(total=steps_trained_in_current_epoch) - steps_trained_progress_bar.set_description("Skipping the first batches") - - # Update the references - self.callback_handler.model = self.model - self.callback_handler.optimizer = self.optimizer - self.callback_handler.lr_scheduler = self.lr_scheduler - self.callback_handler.train_dataloader = train_dataloader - self.state.trial_name = self.hp_name(trial) if self.hp_name is not None else None - if trial is not None: - assignments = trial.assignments if self.hp_search_backend == HPSearchBackend.SIGOPT else trial - self.state.trial_params = hp_params(assignments) - else: - self.state.trial_params = None - # This should be the same if the state has been saved but in case the training arguments changed, it's safer - # to set this after the load. - self.state.max_steps = max_steps - self.state.num_train_epochs = num_train_epochs - self.state.is_local_process_zero = self.is_local_process_zero() - self.state.is_world_process_zero = self.is_world_process_zero() - - tr_loss = torch.tensor(0.0).to(args.device) - # _total_loss_scalar is updated every time .item() has to be called on tr_loss and stores the sum of all losses - self._total_loss_scalar = 0.0 - self._globalstep_last_logged = self.state.global_step - model.zero_grad() - - self.control = self.callback_handler.on_train_begin(args, self.state, self.control) - - # Skip the first epochs_trained epochs to get the random state of the dataloader at the right point. - if not args.ignore_data_skip: - for epoch in range(epochs_trained): - # We just need to begin an iteration to create the randomization of the sampler. - for _ in train_dataloader: - break - if isinstance(component, Component): - if hasattr(self.component, "teacher_model"): - self.component.teacher_model._model = self._wrap_model( - self.component.teacher_model.model) - component.pre_epoch_begin(self.calib_dataloader if self.calib_dataloader else None) - if component.combination is not None and "Quantization" in component.combination: - model = component.model.model - for epoch in range(epochs_trained, num_train_epochs): - if self.compression_ctrl is not None: - self.compression_ctrl.scheduler.epoch_step() - print(self.compression_ctrl.statistics().to_str()) - if isinstance(train_dataloader, torch.utils.data.dataloader.DataLoader) and \ - isinstance(train_dataloader.sampler, torch.utils.data.distributed.DistributedSampler): - train_dataloader.sampler.set_epoch(epoch) - elif isinstance(train_dataloader.dataset, IterableDatasetShard): - train_dataloader.dataset.set_epoch(epoch) - - epoch_iterator = train_dataloader - - # Reset the past mems state at the beginning of each epoch if necessary. - if args.past_index >= 0: - self._past = None - - steps_in_epoch = (len(epoch_iterator) if train_dataset_is_sized else args.max_steps * - args.gradient_accumulation_steps) - self.control = self.callback_handler.on_epoch_begin(args, self.state, self.control) - if isinstance(component, Component): - component.on_epoch_begin(epoch) - - self.in_training = True - for step, inputs in enumerate(epoch_iterator): - - # Skip past any already trained steps if resuming training - if steps_trained_in_current_epoch > 0: - steps_trained_in_current_epoch -= 1 - if steps_trained_progress_bar is not None: - steps_trained_progress_bar.update(1) - if steps_trained_in_current_epoch == 0: - self._load_rng_state(resume_from_checkpoint) - continue - elif steps_trained_progress_bar is not None: - steps_trained_progress_bar.close() - steps_trained_progress_bar = None - - if step % args.gradient_accumulation_steps == 0: - self.control = self.callback_handler.on_step_begin( - args, self.state, self.control) - if isinstance(component, Component): - component.on_batch_begin(step) - - training_step = self.training_step_length_adaptive if self.dynamic_config is not None and \ - self.dynamic_config.dynamic_training else self.training_step - if ( - ((step + 1) % args.gradient_accumulation_steps != 0) - and args.local_rank != -1 - and args._no_sync_in_gradient_accumulation - ): - # Avoid unnecessary DDP synchronization since there will be no backward pass on this example. - with model.no_sync(): - tr_loss_step = training_step(model, inputs) - else: - tr_loss_step = training_step(model, inputs) - - if args.logging_nan_inf_filter and (torch.isnan(tr_loss_step) - or torch.isinf(tr_loss_step)): - # if loss is nan or inf simply add the average of previous logged losses - tr_loss += tr_loss / (1 + self.state.global_step - - self._globalstep_last_logged) - else: - tr_loss += tr_loss_step - - self.current_flos += float(self.floating_point_ops(inputs)) - - if (step + 1) % args.gradient_accumulation_steps == 0 or ( - # last step in epoch but step is always smaller than gradient_accumulation_steps - steps_in_epoch <= args.gradient_accumulation_steps and - (step + 1) == steps_in_epoch): - if isinstance(component, Component): - component.on_post_grad() - - # Gradient clipping - if args.max_grad_norm is not None and args.max_grad_norm > 0: - - if hasattr(self.optimizer, "clip_grad_norm"): - # Some optimizers (like the sharded optimizer) have a specific way to do gradient clipping - self.optimizer.clip_grad_norm(args.max_grad_norm) - elif hasattr(model, "clip_grad_norm_"): - # Some models (like FullyShardedDDP) have a specific way to do gradient clipping - model.clip_grad_norm_(args.max_grad_norm) - else: - # Revert to normal clipping otherwise, handling Apex or full precision - torch.nn.utils.clip_grad_norm_( - model.parameters(), - args.max_grad_norm, - ) - - # Optimizer step - if self.compression_ctrl is not None: - self.compression_ctrl.scheduler.step() - optimizer_was_run = True - self.optimizer.step() - - if optimizer_was_run: - self.lr_scheduler.step() - - model.zero_grad() - self.state.global_step += 1 - self.state.epoch = epoch + (step + 1) / steps_in_epoch - self.state.curr_loss = tr_loss_step.cpu().detach().item() - self.control = self.callback_handler.on_step_end(args, self.state, - self.control) - if isinstance(component, Component): - component.on_batch_end() - self._maybe_log_save_evaluate(tr_loss, model, trial, epoch, - ignore_keys_for_eval) - else: - self.control = self.callback_handler.on_substep_end( - args, self.state, self.control) - - if self.control.should_epoch_stop or self.control.should_training_stop: - break - - self.in_training = False - self.control = self.callback_handler.on_epoch_end(args, self.state, self.control) - if isinstance(component, Component): - # When Distillation is involved, model will be evaluated in "on_epoch_end" hook, while in SQuAD - # evaluation, "start_positions" and "end_positions" will be removed from inputs of the fx model, - # this will damage the training afterward, so use the copied model for evaluation, - # and then restore the model. - component.model.model = copy.deepcopy(model) - component.on_epoch_end() - component.model.model = model - if 'Distillation' in component.__repr__(): - model.train() - self._maybe_log_save_evaluate(tr_loss, model, trial, epoch, ignore_keys_for_eval) - - # pylint: disable=E1101 - if DebugOption.TPU_METRICS_DEBUG in self.args.debug: - logger.warning( - "You enabled PyTorch/XLA debug metrics but you don't have a TPU " - "configured. Check your training configuration if this is unexpected.") - - if self.control.should_training_stop: - break - - if isinstance(component, Component): - component.post_epoch_end() - if component.combination is not None and "Quantization" in component.combination: - self.model = component.model.model - - if args.past_index and hasattr(self, "_past"): - # Clean the state at the end of training - delattr(self, "_past") - - logger.info( - "\n\nTraining completed. Do not forget to share your model on huggingface.co/models =)\n\n" - ) - if args.load_best_model_at_end and self.state.best_model_checkpoint is not None: - # Wait for everyone to get here so we are sur the model has been saved by process 0. - if args.local_rank != -1 and args.n_gpu > 1: - torch.distributed.barrier() - - if version.parse(__version__) < version.parse("4.19"): - logger.info( - f"Loading best model from {self.state.best_model_checkpoint} (score: {self.state.best_metric})." - ) - - best_model_path = os.path.join(self.state.best_model_checkpoint, WEIGHTS_NAME) - if os.path.exists(best_model_path): - # We load the model state dict on the CPU to avoid an OOM error. - state_dict = torch.load(best_model_path, map_location="cpu") - # If the model is on the GPU, it still works! - self._load_state_dict_in_model(state_dict) - else: - logger.warn(f"Could not locate the best model at {best_model_path}, " - "if you are running a distributed training on multiple nodes, " - "you should activate `--save_on_each_node`.") - else: - self._load_best_model() - - # add remaining tr_loss - self._total_loss_scalar += tr_loss.item() - train_loss = self._total_loss_scalar / self.state.global_step - - metrics = speed_metrics("train", - start_time, - num_samples=num_train_samples, - num_steps=self.state.max_steps) - self.store_flos() - metrics["total_flos"] = self.state.total_flos - metrics["train_loss"] = train_loss - - self.is_in_train = False - - self._memory_tracker.stop_and_update_metrics(metrics) - - self.log(metrics) - - self.control = self.callback_handler.on_train_end(args, self.state, self.control) - - return TrainOutput(self.state.global_step, train_loss, metrics) - - # pylint: disable=E1101 - def _maybe_log_save_evaluate(self, tr_loss, model, trial, epoch, - ignore_keys_for_eval): # pragma: no cover - if self.control.should_log: - if is_torch_tpu_available(): - xm.mark_step() - - logs: Dict[str, float] = {} - - # all_gather + mean() to get average loss over all processes - tr_loss_scalar = self._nested_gather(tr_loss).mean().item() - - # reset tr_loss to zero - tr_loss -= tr_loss - - logs["loss"] = round( - tr_loss_scalar / (self.state.global_step - self._globalstep_last_logged), 4) - logs["learning_rate"] = self._get_learning_rate() - - self._total_loss_scalar += tr_loss_scalar - self._globalstep_last_logged = self.state.global_step - self.store_flos() - - self.log(logs) - - metrics = None - if self.control.should_evaluate: - metrics = self.evaluate(ignore_keys=ignore_keys_for_eval) - self._report_to_hp_search(trial, epoch, metrics) - - if self.control.should_save: - self._save_checkpoint(model, trial, metrics=metrics) - self.control = self.callback_handler.on_save(self.args, self.state, self.control) - # pylint: disable=E1101 def training_step( self, model: torch.nn.Module, @@ -2280,26 +1731,31 @@ def builtin_eval_func(self, model): torch.manual_seed(self.args.seed) results = self.evaluate(metric_key_prefix="eval") logger.info(results) - if isinstance(self.metrics, list): - nums = len(self.metrics) - for metric in self.metrics: - assert metric.name in results.keys(), \ - "Please set metric from {}".format(results.keys()) - if nums == 1: - result = results.get(self.metrics[0].name) - else: - result = 0 - for metric in self.metrics: - assert metric.weight_ratio is not None, \ - "Please set weights for metric if you want to use more than one metric" - result += results[metric.name] * metric.weighted - logger.info("metric: {}".format(result)) - elif isinstance(self.metrics, Metric): - assert self.metrics.name in results.keys(), \ - "Please set metric from {}".format(results.keys()) - result = results.get(self.metrics.name) - logger.info("metric: {}".format(result)) - else: - assert False, "Please set the correct metrics format from the README" + def builtin_eval_func(self, model): + """Custom Evaluate function to inference the model for specified metric on validation dataset. + + Args: + model: The model to evaluate. + + Returns: + [float]: evaluation result, the larger is better. + """ + self.model = model + # pylint: disable=E1101 + if self.args.seed: + torch.manual_seed(self.args.seed) + results = self.evaluate() + logger.info(results) + task_name = self.eval_dataset.config_name + metric_name = "eval_" + ( + "pearson" + if task_name == "stsb" + else "matthews_correlation" + if task_name == "cola" + else "accuracy" + ) + assert metric_name in results.keys(), \ + "Please set metric from {}".format(results.keys()) + result = results.get(metric_name) logger.info("Throughput: {} samples/sec".format(results.get("eval_samples_per_second"))) return result From 87e6f5ea42b6b5c74ea1336a27ff426140d79719 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:30:48 +0000 Subject: [PATCH 02/22] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../pytorch/multiple-choice/quantization/run_swag.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py b/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py index 3bea53a93f8..d1b8bcf9c94 100644 --- a/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py +++ b/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py @@ -223,7 +223,7 @@ class OptimizationArguments: quantization_approach: Optional[str] = field( default="static", metadata={"help": "Quantization approach. Supported approach are static, " - "dyanmic and qat."}, + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, From 6e2c5df1d048ca484b692ec9bb9d4a3b946f1a0c Mon Sep 17 00:00:00 2001 From: changwangss Date: Wed, 12 Jun 2024 04:27:09 -0700 Subject: [PATCH 03/22] add examples Signed-off-by: changwangss --- docs/get_started.md | 8 +- .../onnxruntime/optimization_README.md | 2 +- .../speech-recognition/quantization/README.md | 4 +- .../language-modeling/quantization/README.md | 13 +- .../language-modeling/quantization/run_clm.py | 66 ++--- .../language-modeling/quantization/run_mlm.py | 60 +++-- .../language-modeling/quantization/run_plm.py | 60 +++-- .../quantization/run_tuning.sh | 32 +-- .../quantization/run_glue.py | 14 +- .../transformers/trainer.py | 49 ++-- tests/CI/test_config.py | 240 ------------------ 11 files changed, 162 insertions(+), 386 deletions(-) delete mode 100644 tests/CI/test_config.py diff --git a/docs/get_started.md b/docs/get_started.md index 492b505eeb8..62a603097a9 100644 --- a/docs/get_started.md +++ b/docs/get_started.md @@ -13,7 +13,7 @@ ## Quantization ```python -from intel_extension_for_transformers.transformers import QuantizationConfig, metrics, objectives +from neural_compressor.config import PostTrainingQuantConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer config = AutoConfig.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english",num_labels=2) @@ -27,7 +27,9 @@ trainer = NLPTrainer(model=model, eval_dataset=raw_datasets["validation"], tokenizer=tokenizer ) -q_config = QuantizationConfig(metrics=[metrics.Metric(name="eval_loss", greater_is_better=False)]) +quantization_config = PostTrainingQuantConfig( + approach="static", +) model = trainer.quantize(quant_config=q_config) input = tokenizer("I like Intel Extension for Transformers", return_tensors="pt") @@ -81,7 +83,7 @@ from intel_extension_for_transformers.transformers.trainer import NLPTrainer trainer = NLPTrainer(...) metric = metrics.Metric(name="eval_f1", is_relative=True, criterion=0.01) q_config = QuantizationConfig( - approach="PostTrainingStatic", + approach="static", metrics=[metric], objectives=[objectives.performance] ) diff --git a/examples/huggingface/onnxruntime/optimization_README.md b/examples/huggingface/onnxruntime/optimization_README.md index 6f2da2cd552..3c801acfe8b 100644 --- a/examples/huggingface/onnxruntime/optimization_README.md +++ b/examples/huggingface/onnxruntime/optimization_README.md @@ -4,7 +4,7 @@ Welcome to ONNX Runtime Huggingface examples. The models are from [Huggingface]( ## Quantization approach -| Task | PostTrainingDynamic | PostTrainingStatic +| Task | dynamic | static |---|:---:|:---:| |**`speech-recognition`**| ✅ | ✅ | diff --git a/examples/huggingface/onnxruntime/speech-recognition/quantization/README.md b/examples/huggingface/onnxruntime/speech-recognition/quantization/README.md index 5638882e2ca..ae878cc4cb8 100644 --- a/examples/huggingface/onnxruntime/speech-recognition/quantization/README.md +++ b/examples/huggingface/onnxruntime/speech-recognition/quantization/README.md @@ -1,6 +1,6 @@ Step-by-Step​ ============ -The script `run_whisper.py` provides two quantization approaches (PostTrainingStatic and PostTrainingDynamic) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor) with [LibriSpeech test-clean](https://huggingface.co/datasets/librispeech_asr) dataset. +The script `run_whisper.py` provides two quantization approaches (static and dynamic) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor) with [LibriSpeech test-clean](https://huggingface.co/datasets/librispeech_asr) dataset. # Prerequisite​ ## 1. Create Environment​ @@ -96,7 +96,7 @@ Available INT4 models on huggingface: # Validated model list -|Topology|Pretrained model|PostTrainingDynamic|PostTrainingStatic|WeightOnly4Bit| +|Topology|Pretrained model|dynamic|static|WeightOnly4Bit| |---|------------------------------------|---|---|--- |whisper_tiny|openai/whisper-tiny| | | ✅| |whisper_base|openai/whisper-base| | | ✅| diff --git a/examples/huggingface/pytorch/language-modeling/quantization/README.md b/examples/huggingface/pytorch/language-modeling/quantization/README.md index a053aef7617..e4c71ee8ba3 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/README.md +++ b/examples/huggingface/pytorch/language-modeling/quantization/README.md @@ -2,7 +2,7 @@ Step-by-Step ============ This document describes the step-by-step instructions to run large language models (LLMs) on 4th Gen Intel® Xeon® Scalable Processor (codenamed Sapphire Rapids) with PyTorch and Intel® Extension for PyTorch. -The scripts `run_clm.py`, `run_mlm.py` and `run_plm.py` provide three quantization approaches respectively (PostTrainingDynamic, PostTrainingStatic, QuantAwareTraining) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor) and return last token prediction accuracy by `trainer`. +The scripts `run_clm.py`, `run_mlm.py` and `run_plm.py` provide three quantization approaches respectively (dynamic, static, qat) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor) and return last token prediction accuracy by `trainer`. The large language model quantization is moved to [text-generation](../../text-generation/quantization/) now. @@ -16,9 +16,7 @@ pip install -r requirements.txt pip install -v . cd examples/huggingface/pytorch/language-modeling/quantization pip install -r requirements.txt -pip install transformers==4.34.1 ``` ->**Note**: Please use transformers no higher than 4.34.1 # Run @@ -32,7 +30,7 @@ python run_clm.py \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --do_train \ --do_eval \ --output_dir ./tmp/clm_output \ @@ -47,7 +45,7 @@ python run_mlm.py \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --do_train \ --do_eval \ --output_dir ./tmp/mlm_output \ @@ -62,12 +60,9 @@ python run_mlm.py \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --do_train \ --do_eval \ --output_dir ./tmp/plm_output \ --overwrite_output_dir ``` - -[1]. Elias, Frantar, et al. "GPTQ: Accurate Post-training Compression for Generative Pretrained Transformers." arXiv preprint arXiv:2210.17323 (2023). -[2]. Lin, Ji, et al. "AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration." arXiv preprint arXiv:2306.00978 (2023). diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py b/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py index d58abdeaa87..ffbe7325ced 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py @@ -28,7 +28,13 @@ from dataclasses import dataclass, field from datasets import load_dataset, load_metric from itertools import chain -from intel_extension_for_transformers.transformers import metrics, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( CONFIG_MAPPING, @@ -199,13 +205,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, - ) - metric_name: Optional[str] = field( - default="eval_loss", - metadata={"help": "Metric used for the tuning strategy."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) is_relative: Optional[bool] = field( default=True, @@ -565,33 +567,39 @@ def compute_metrics(eval_preds): raise ValueError("do_eval must be set to True for quantization.") trainer.save_model(training_args.output_dir) - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 + + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ early_stopping_threshold)) - - tune_metric = metrics.Metric( - name=metric_name, - is_relative=optim_args.is_relative, - criterion=optim_args.perf_tol, - greater_is_better=False - ) - quantization_config = QuantizationConfig(approach=optim_args.quantization_approach, - metrics=[tune_metric], - sampling_size=optim_args.sampling_size - if optim_args.sampling_size is not None else len(train_dataset) // 100 * 5 , - recipes={ - "smooth_quant": True, - "smooth_quant_args": { - "alpha": optim_args.smooth_quant_alpha - } - } if optim_args.smooth_quant else None) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark_only: diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py b/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py index ec01cacbeb4..82a3770dee2 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py @@ -28,7 +28,13 @@ from dataclasses import dataclass, field from datasets import load_dataset, load_metric from itertools import chain -from intel_extension_for_transformers.transformers import metrics, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( CONFIG_MAPPING, @@ -207,13 +213,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, - ) - metric_name: Optional[str] = field( - default="eval_loss", - metadata={"help": "Metric used for the tuning strategy."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) is_relative: Optional[bool] = field( default=True, @@ -584,28 +586,38 @@ def compute_metrics(eval_preds): raise ValueError("do_eval must be set to True for quantization.") trainer.save_model(training_args.output_dir) - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ early_stopping_threshold)) - - tune_metric = metrics.Metric( - name=metric_name, - is_relative=optim_args.is_relative, - criterion=optim_args.perf_tol, - greater_is_better=False - ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - metrics=[tune_metric], - sampling_size = len(train_dataset)//20 - ) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark_only: diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py b/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py index 0c15cedb9c8..b4890ad3cd1 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py @@ -27,7 +27,13 @@ from datasets import load_dataset from itertools import chain -from intel_extension_for_transformers.transformers import metrics, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,13 +209,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, - ) - metric_name: Optional[str] = field( - default="eval_loss", - metadata={"help": "Metric used for the tuning strategy."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) is_relative: Optional[bool] = field( default=False, @@ -530,28 +532,38 @@ def group_texts(examples): raise ValueError("do_eval must be set to True for quantization.") trainer.save_model(training_args.output_dir) - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ early_stopping_threshold)) - - tune_metric = metrics.Metric( - name=metric_name, - is_relative=optim_args.is_relative, - criterion=optim_args.perf_tol, - greater_is_better=False - ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - metrics=[tune_metric], - sampling_size = len(train_dataset)//20 - ) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark_only: diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh b/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh index eae534dac65..72ac556a30d 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh @@ -17,7 +17,7 @@ function init_params { extra_cmd="" batch_size=8 model_type="bert" - approach="PostTrainingStatic" + approach="static" alpha=0.5 for var in "$@" do @@ -60,7 +60,7 @@ function run_tuning { DATASET_CONFIG_NAME="wikitext-2-raw-v1" model_name_or_path="EleutherAI/gpt-neo-125m" task="clm" - approach="PostTrainingStatic" + approach="static" backend="" elif [ "${topology}" = "gpt_neo" ]; then if [ "${task}" = "clm" ]; then @@ -70,11 +70,11 @@ function run_tuning { DATASET_CONFIG_NAME="wikitext-2-raw-v1" model_name_or_path="EleutherAI/gpt-neo-125M" if [ "${approach}" = "dynamic" ]; then - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${approach}" = "static" ]; then - approach="PostTrainingStatic" + approach="static" elif [ "${approach}" = "qat" ]; then - approach="QuantizationAwareTraining" + approach="qat" extra_cmd=$extra_cmd" --learning_rate 1e-5 \ --num_train_epochs 6 \ --eval_steps 100 \ @@ -93,9 +93,9 @@ function run_tuning { DATASET_CONFIG_NAME="wikitext-2-raw-v1" model_name_or_path="/tf_dataset2/models/pytorch/gpt-j-6B" if [ "${approach}" = "dynamic" ]; then - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${approach}" = "static" ]; then - approach="PostTrainingStatic" + approach="static" fi elif [ "${topology}" = "bert" ]; then if [ "${task}" = "mlm" ]; then @@ -105,11 +105,11 @@ function run_tuning { DATASET_CONFIG_NAME="wikitext-2-raw-v1" model_name_or_path="bert-base-uncased" if [ "${approach}" = "dynamic" ]; then - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${approach}" = "static" ]; then - approach="PostTrainingStatic" + approach="static" elif [ "${approach}" = "qat" ]; then - approach="QuantizationAwareTraining" + approach="qat" extra_cmd=$extra_cmd" --learning_rate 1e-5 \ --num_train_epochs 6 \ --eval_steps 100 \ @@ -129,11 +129,11 @@ function run_tuning { DATASET_CONFIG_NAME="wikitext-2-raw-v1" model_name_or_path="xlnet-base-cased" if [ "${approach}" = "dynamic" ]; then - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${approach}" = "static" ]; then - approach="PostTrainingStatic" + approach="static" elif [ "${approach}" = "qat" ]; then - approach="QuantizationAwareTraining" + approach="qat" extra_cmd=$extra_cmd" --learning_rate 1e-5 \ --num_train_epochs 6 \ --eval_steps 100 \ @@ -153,9 +153,9 @@ function run_tuning { DATASET_CONFIG_NAME="unshuffled_original_ast" model_name_or_path="abeja/gpt-neox-japanese-2.7b" if [ "${approach}" = "dynamic" ]; then - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${approach}" = "static" ]; then - approach="PostTrainingStatic" + approach="static" fi elif [ "${topology}" = "bloom" ]; then if [ "${task}" = "clm" ]; then @@ -164,7 +164,7 @@ function run_tuning { DATASET_NAME="lambada" model_name_or_path="bigscience/bloom-560m" if [ "${approach}" = "static" ]; then - approach="PostTrainingStatic" + approach="static" fi extra_cmd=$extra_cmd" --smooth_quant --sampling_size 400 --torchscript" fi diff --git a/examples/huggingface/pytorch/text-classification/quantization/run_glue.py b/examples/huggingface/pytorch/text-classification/quantization/run_glue.py index 5825a1cb9be..65fadf439df 100644 --- a/examples/huggingface/pytorch/text-classification/quantization/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/quantization/run_glue.py @@ -26,9 +26,14 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import objectives, OptimizedModel +from intel_extension_for_transformers.transformers import OptimizedModel from intel_extension_for_transformers.transformers.trainer import NLPTrainer -from neural_compressor.config import PostTrainingQuantConfig, QuantizationAwareTrainingConfig, TuningCriterion, AccuracyCriterion +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from transformers import ( AutoConfig, AutoModelForSequenceClassification, @@ -523,9 +528,8 @@ def compute_metrics(p: EvalPrediction): "do_train must be set to True for static and aware training quantization." ) - objective = objectives.performance if optim_args.quantization_approach != "qat": - tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) accuracy_criterion = AccuracyCriterion( higher_is_better=True, # optional. criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". @@ -537,7 +541,7 @@ def compute_metrics(p: EvalPrediction): accuracy_criterion=accuracy_criterion ) else: - tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) accuracy_criterion = AccuracyCriterion( higher_is_better=True, # optional. criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". diff --git a/intel_extension_for_transformers/transformers/trainer.py b/intel_extension_for_transformers/transformers/trainer.py index 2f52921f272..e8ad49853a5 100644 --- a/intel_extension_for_transformers/transformers/trainer.py +++ b/intel_extension_for_transformers/transformers/trainer.py @@ -209,13 +209,14 @@ def builtin_eval_func(self, model): results = self.evaluate() logger.info(results) task_name = self.eval_dataset.config_name - metric_name = "eval_" + ( - "pearson" - if task_name == "stsb" - else "matthews_correlation" - if task_name == "cola" - else "accuracy" - ) + if "wikitext" in task_name: + metric_name = "eval_loss" + elif task_name == "stsb": + metric_name = "eval_person" + elif task_name == "cola": + metric_name = "eval_matthews_correlation" + else: + metric_name = "eval_accuracy" assert metric_name in results.keys(), \ "Please set metric from {}".format(results.keys()) result = results.get(metric_name) @@ -255,7 +256,10 @@ def _inc_quantize( except Exception as e: # pragma: no cover logger.warning("Model deepcopy failed: {}!".format(repr(e))) if isinstance(quant_config, PostTrainingQuantConfig): - self.opt_model = fit(self.model, conf=quant_config, calib_dataloader=self.get_train_dataloader(), eval_func=self._eval_func) + self.opt_model = fit(self.model, + conf=quant_config, + calib_dataloader=self.get_train_dataloader(), + eval_func=self._eval_func) else: compression_manager = prepare_compression(self.model, quant_config) compression_manager.callbacks.on_train_begin() @@ -530,7 +534,7 @@ def create_optimizer_builtin(self, config_list, teacher_model=None): """ components = [] for config in config_list: - if isinstance(config, QuantizationConfig): + if isinstance(config, PostTrainingQuantConfig): component = self.init_quantizer(config) component.eval_func = self._eval_func component.q_func = self._train_func @@ -1731,31 +1735,10 @@ def builtin_eval_func(self, model): torch.manual_seed(self.args.seed) results = self.evaluate(metric_key_prefix="eval") logger.info(results) - def builtin_eval_func(self, model): - """Custom Evaluate function to inference the model for specified metric on validation dataset. - - Args: - model: The model to evaluate. - - Returns: - [float]: evaluation result, the larger is better. - """ - self.model = model - # pylint: disable=E1101 - if self.args.seed: - torch.manual_seed(self.args.seed) - results = self.evaluate() - logger.info(results) - task_name = self.eval_dataset.config_name - metric_name = "eval_" + ( - "pearson" - if task_name == "stsb" - else "matthews_correlation" - if task_name == "cola" - else "accuracy" - ) + metric_name = "eval_bleu" assert metric_name in results.keys(), \ - "Please set metric from {}".format(results.keys()) + "Please set metric from {}".format(results.keys()) result = results.get(metric_name) logger.info("Throughput: {} samples/sec".format(results.get("eval_samples_per_second"))) return result + diff --git a/tests/CI/test_config.py b/tests/CI/test_config.py deleted file mode 100644 index b3d32a35d4b..00000000000 --- a/tests/CI/test_config.py +++ /dev/null @@ -1,240 +0,0 @@ -# Copyright (c) 2024 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import numpy -import shutil -import torch -import unittest - -from intel_extension_for_transformers.transformers import ( - DistillationConfig, - metrics, - objectives, - PrunerConfig, - PruningConfig, - QuantizationConfig, - TFOptimization, -) -from intel_extension_for_transformers.transformers.distillation import Criterion as DistillationCriterion -from intel_extension_for_transformers.transformers.distillation import DistillationCriterionMode -from intel_extension_for_transformers.transformers.trainer import NLPTrainer -from intel_extension_for_transformers.transformers.utils.objectives import Objective -from intel_extension_for_transformers.transformers.utils.utility_tf import TFDataloader - -from transformers import ( - AutoModelForPreTraining, - HfArgumentParser, - TFTrainingArguments, - TFAutoModelForSequenceClassification, -) - - -class CustomPruner(): - def __init__(self, start_epoch=None, end_epoch=None, initial_sparsity=None, - target_sparsity_ratio=None, update_frequency=1, prune_type='BasicMagnitude', - method='per_tensor', names=[], parameters=None): - self.start_epoch = start_epoch - self.end_epoch = end_epoch - self.update_frequency = update_frequency - self.target_sparsity_ratio = target_sparsity_ratio - self.initial_sparsity = initial_sparsity - self.update_frequency = update_frequency - - -class TestConfig(unittest.TestCase): - @classmethod - def tearDownClass(self): - shutil.rmtree('./tmp_trainer', ignore_errors=True) - - def test_quantization_config_with_init(self): - metric1 = metrics.Metric( - name="F1", greater_is_better=False, is_relative=False, criterion=0.02, weight_ratio=0.5 - ) - metric2 = metrics.Metric( - name="accuracy", greater_is_better=False, is_relative=False, - criterion=0.02, weight_ratio=0.5 - ) - objective1 = objectives.performance - objective2 = objectives.modelsize - quantization_config = QuantizationConfig( - framework="pytorch", - approach="PostTrainingDynamic", - timeout=600, - max_trials=300, - metrics=[metric1, metric2], - objectives=[objective1, objective2], - ) - self.assertEqual(quantization_config.approach, "post_training_dynamic_quant") - self.assertEqual(quantization_config.metrics[0].criterion, 0.02) - self.assertEqual(quantization_config.objectives[1].name, "modelsize") - self.assertEqual(quantization_config.timeout, 600) - self.assertEqual(quantization_config.max_trials, 300) - - from neural_compressor.utils import constant - quantization_config.op_wise = { - 'bert.encoder.layer.0.output.dense': constant.FP32, - } - quantization_config.resume_path = './saved_results' - quantization_config.random_seed = 1 - quantization_config.strategy = 'basic' - quantization_config.performance_only = True - quantization_config.tensorboard = True - quantization_config.sampling_size = [300] - quantization_config.input_names = ['input_ids', 'tokentype_ids'] - quantization_config.output_names = ['seq1, seq2'] - self.assertTrue(isinstance(quantization_config.op_wise, dict)) - self.assertTrue(isinstance(quantization_config.strategy, str)) - self.assertEqual(quantization_config.random_seed, 1) - self.assertEqual(quantization_config.strategy, 'basic') - self.assertTrue(quantization_config.performance_only) - self.assertTrue(quantization_config.tensorboard) - self.assertTrue(quantization_config.resume_path, './saved_results') - self.assertTrue(quantization_config.sampling_size, [300]) - self.assertTrue(quantization_config.input_names, ['input_ids', 'tokentype_ids']) - self.assertTrue(quantization_config.output_names, ['seq1, seq2']) - - def test_quantization_config(self): - quantization_config = QuantizationConfig() - quantization_config.approach = "PostTrainingStatic" - quantization_config.framework = "pytorch" - metric = metrics.Metric(name="F1", greater_is_better=False, criterion=0.02, is_relative=True) - quantization_config.metrics = metric - objective1 = objectives.Objective(name="performance", greater_is_better=True) - objective2 = objectives.Objective(name="modelsize", greater_is_better=False) - quantization_config.objectives = [objective1, objective2] - - quantization_config.timeout = 600 - quantization_config.max_trials = 300 - quantization_config.output_dir = "./savedresult" - - self.assertEqual(quantization_config.approach, "post_training_static_quant") - self.assertEqual(quantization_config.metrics.criterion, 0.02) - self.assertEqual(quantization_config.objectives[1].name, "modelsize") - self.assertEqual(quantization_config.timeout, 600) - self.assertEqual(quantization_config.max_trials, 300) - self.assertEqual(quantization_config.output_dir, "./savedresult") - - def test_pruning_config(self): - pruning_config = PruningConfig() - pruner_config = PrunerConfig() - metric = metrics.Metric(name="F1") - pruning_config.pruner_config = pruner_config - pruning_config.framework = "pytorch" - pruning_config.target_sparsity_ratio = 0.1 - pruning_config.epoch_range = [0, 4] - pruning_config.metrics = metric - - self.assertEqual(pruning_config.pruner_config, [pruner_config]) - self.assertEqual(pruning_config.framework, "pytorch") - self.assertEqual(pruning_config.initial_sparsity_ratio, 0) - self.assertEqual(pruning_config.target_sparsity_ratio, 0.1) - self.assertEqual(pruning_config.epoch_range, [0, 4]) - self.assertEqual(pruning_config.metrics, metric) - self.assertEqual(pruning_config.epochs, 1) - - pruning_config.pruner_config = [pruner_config] - self.assertEqual(pruning_config.pruner_config, [pruner_config]) - - def test_distillation_config(self): - metric = metrics.Metric(name="eval_F1") - criterion = DistillationCriterion( - name="KnowledgeLoss", - temperature=1.0, - loss_types=["CE", "KL"], - loss_weight_ratio=[0, 1] - ) - distillation_config = DistillationConfig( - framework="pytorch", - criterion=criterion, - metrics=metric - ) - - self.assertEqual(distillation_config.framework, "pytorch") - self.assertEqual(list(distillation_config.criterion.keys())[0], - DistillationCriterionMode[criterion.name.upper()].value) - self.assertEqual(distillation_config.metrics, metric) - - criterion = DistillationCriterion( - name="InterMediateLayersloss", - layer_mappings=[['classifier', 'classifier']], - loss_types=['MSE'], - loss_weight_ratio=[1.0], - add_origin_loss=False - ) - distillation_config = DistillationConfig( - framework="pytorch", - criterion=criterion, - metrics=metric - ) - - - def test_trainer_config(self): - model = AutoModelForPreTraining.from_pretrained( - 'google/bert_uncased_L-2_H-128_A-2' - ) - trainer = NLPTrainer(model) - trainer.resuming_checkpoint = 'saved_results' - trainer.eval_func = None - trainer.train_func = None - trainer.calib_dataloader = None - trainer.provider = 'inc' - self.assertEqual(trainer.resuming_checkpoint, 'saved_results') - self.assertEqual(trainer.eval_func, None) - self.assertEqual(trainer.train_func, None) - self.assertEqual(trainer.calib_dataloader, None) - self.assertEqual(trainer.provider, 'inc') - - def test_TFOptimization_config(self): - parser = HfArgumentParser(TFTrainingArguments) - args = parser.parse_args_into_dataclasses( - args=["--output_dir", "./quantized_model", - "--per_device_eval_batch_size", "2"] - ) - model = TFAutoModelForSequenceClassification.from_pretrained( - 'bhadresh-savani/distilbert-base-uncased-sentiment-sst2' - ) - tf_optimizer = TFOptimization(model, args=args[0]) - tf_optimizer.input = 1 - tf_optimizer.eval_func = None - tf_optimizer.train_func = None - self.assertEqual(tf_optimizer.input, 1) - self.assertEqual(tf_optimizer.eval_func, None) - self.assertEqual(tf_optimizer.train_func, None) - - def test_tf_dataloader(self): - def dummy_dataset(type='list'): - if type == 'list': - yield [torch.tensor(1),torch.tensor(2)], \ - [torch.tensor(1),torch.tensor(2)] - else: - yield torch.tensor(1), torch.tensor(1) - - dataloader = TFDataloader(dummy_dataset()) - for input, label in dataloader: - self.assertTrue(type(input) == list) - self.assertTrue(type(label) == list) - dataloader = TFDataloader(dummy_dataset(type='int')) - for input, label in dataloader: - self.assertTrue(type(input) == numpy.ndarray) - self.assertTrue(type(label) == numpy.ndarray) - - def test_Objective_config(self): - perform= Objective.performance() - model_size = Objective.modelsize() - self.assertEqual(perform.name, 'performance') - self.assertEqual(model_size.name, 'modelsize') - - -if __name__ == "__main__": - unittest.main() From 657cc504537501661a16d20f7038c7b2e22241a8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:27:52 +0000 Subject: [PATCH 04/22] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- intel_extension_for_transformers/transformers/trainer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/intel_extension_for_transformers/transformers/trainer.py b/intel_extension_for_transformers/transformers/trainer.py index e8ad49853a5..c2fbeb0348e 100644 --- a/intel_extension_for_transformers/transformers/trainer.py +++ b/intel_extension_for_transformers/transformers/trainer.py @@ -1741,4 +1741,3 @@ def builtin_eval_func(self, model): result = results.get(metric_name) logger.info("Throughput: {} samples/sec".format(results.get("eval_samples_per_second"))) return result - From eeef7eef9e5c06a3c10781e86dcb29f9613ee073 Mon Sep 17 00:00:00 2001 From: changwangss Date: Thu, 13 Jun 2024 03:02:50 -0700 Subject: [PATCH 05/22] add more examples Signed-off-by: changwangss --- .../imagenet/vit/model_quant_convert.py | 54 +++++++++----- .../deployment/imagenet/vit/run_vit.sh | 2 +- .../deployment/imagenet/vit/vit.yaml | 28 -------- .../quantization/README.md | 6 +- .../quantization/conf.yaml | 18 ----- .../quantization/run_image_classification.py | 72 +++++++++++++------ .../quantization/run_tuning.sh | 6 +- .../quantization/vit_config.yaml | 30 -------- .../language-modeling/quantization/run_clm.py | 14 +++- .../language-modeling/quantization/run_mlm.py | 13 +++- .../language-modeling/quantization/run_plm.py | 14 +++- .../multiple-choice/quantization/README.md | 2 +- .../multiple-choice/quantization/run_swag.py | 6 +- .../quantization/run_tuning.sh | 4 +- .../question-answering/dynamic/README.md | 2 +- .../question-answering/dynamic/run_qa.py | 42 ++++++----- .../question-answering/quantization/README.md | 13 ++-- .../question-answering/quantization/run_qa.py | 69 +++++++++++------- .../quantization/run_tuning.sh | 20 +++--- .../summarization/quantization/README.md | 8 +-- .../quantization/run_benchmark.sh | 4 +- .../quantization/run_summarization.py | 59 ++++++++++----- .../summarization/quantization/run_tuning.sh | 12 ++-- .../quantization/run_glue.py | 28 +++++++- .../quantization/run_glue_no_trainer.py | 32 ++++++--- .../text-to-image/quantization/ptq/README.md | 2 +- .../quantization/ptq/run_diffusion.py | 30 +++++--- .../quantization/ptq/run_tuning.sh | 6 +- .../quantization/README.md | 6 +- .../quantization/run_ner.py | 58 ++++++++++----- .../quantization/run_tuning.sh | 8 +-- .../translation/quantization/README.md | 10 ++- .../quantization/run_translation.py | 60 +++++++++++----- .../translation/quantization/run_tuning.sh | 6 +- 34 files changed, 439 insertions(+), 305 deletions(-) delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/vit.yaml delete mode 100644 examples/huggingface/pytorch/image-classification/quantization/conf.yaml delete mode 100644 examples/huggingface/pytorch/image-classification/quantization/vit_config.yaml diff --git a/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/model_quant_convert.py b/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/model_quant_convert.py index 9fdf4114e54..c73a4f6dcb7 100644 --- a/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/model_quant_convert.py +++ b/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/model_quant_convert.py @@ -49,7 +49,13 @@ from transformers.utils import check_min_version, send_example_telemetry from transformers.utils.versions import require_version -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import OptimizedModel, metrics +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer os.environ["WANDB_DISABLED"] = "true" @@ -171,9 +177,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default="eval_accuracy", @@ -431,28 +437,38 @@ def val_transforms(example_batch): raise ValueError("do_eval must be set to True for quantization.") trainer.save_model(training_args.output_dir) - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective], - config_file='vit.yaml' - ) + trainer.metrics = tune_metric + if optim_args.quantization_approach != "qat": + op_name_dict = { + 'vit.embeddings.patch_embeddings.projection.module': { + 'activation': {'dtype': ['fp32']}, + 'weight': {'dtype': ['fp32']} + }, + 'vit.embeddings.dropout': { + 'activation': {'dtype': ['fp32']}, + 'weight': {'dtype': ['fp32']} + }, + } + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion, + op_name_dict=op_name_dict, + ) model = trainer.quantize(quant_config=quantization_config) diff --git a/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/run_vit.sh b/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/run_vit.sh index 73c1add48ca..a9350cde559 100644 --- a/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/run_vit.sh +++ b/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/run_vit.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/vit.yaml b/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/vit.yaml deleted file mode 100644 index 66ac67fcc58..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/imagenet/vit/vit.yaml +++ /dev/null @@ -1,28 +0,0 @@ -model: # mandatory. used to specify model specific information. - name: vit - framework: pytorch_fx # mandatory. possible values are tensorflow, mxnet, pytorch, pytorch_ipex, onnxrt_integerops and onnxrt_qlinearops. - -quantization: # optional. tuning constraints on model-wise for advance user to reduce tuning space. - approach: post_training_static_quant - calibration: - sampling_size: [1000] - op_wise: { # optional. tuning constraints on op-wise for advance user to reduce tuning space. - 'vit.embeddings.patch_embeddings.projection.module': { # optional. set default qconfig to fp32 for FX model - 'activation': {'dtype': ['fp32']}, - 'weight': {'dtype': ['fp32']} - }, - 'vit.embeddings.dropout': { # optional. set default qconfig to fp32 for FX model - 'activation': {'dtype': ['fp32']}, - 'weight': {'dtype': ['fp32']} - }, - } - -tuning: - accuracy_criterion: - relative: 0.01 # optional. default value is relative, other value is absolute. this example allows relative accuracy loss: 1%. - exit_policy: - timeout: 0 # optional. tuning timeout (seconds). default value is 0 which means early stop. combine with max_trials field to decide when to exit. - max_trials: 500 - random_seed: 1978 # optional. random seed for deterministic tuning. - workspace: - path: nc_workspace/vit/ diff --git a/examples/huggingface/pytorch/image-classification/quantization/README.md b/examples/huggingface/pytorch/image-classification/quantization/README.md index 09d2eaa2e83..d9a9f8c1055 100644 --- a/examples/huggingface/pytorch/image-classification/quantization/README.md +++ b/examples/huggingface/pytorch/image-classification/quantization/README.md @@ -1,11 +1,11 @@ # Image classification -The script `run_image_classification.py` provides three quantization approaches (PostTrainingStatic, PostTrainingStatic and QuantizationAwareTraining) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). +The script `run_image_classification.py` provides three quantization approaches (dynamic, static and qat) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). Here is how to run the script: >**Note**: Please use transformers no higher than 4.34.1 -1. quantization with PostTrainingStatic +1. static quantization ``` sh run_tuning.sh @@ -26,6 +26,6 @@ run run_benchmark.sh ### Validated model list -|Dataset|Pretrained model|PostTrainingDynamic | PostTrainingStatic | QuantizationAwareTraining +|Dataset|Pretrained model|dynamic | static | qat |---|------------------------------------|---|---|--- |imagenet-1k|google/vit-base-patch16-224| ✅| ✅| N/A| diff --git a/examples/huggingface/pytorch/image-classification/quantization/conf.yaml b/examples/huggingface/pytorch/image-classification/quantization/conf.yaml deleted file mode 100644 index a9c4b4879b6..00000000000 --- a/examples/huggingface/pytorch/image-classification/quantization/conf.yaml +++ /dev/null @@ -1,18 +0,0 @@ -model: # mandatory. used to specify model specific information. - name: vit - framework: pytorch_fx # mandatory. possible values are tensorflow, mxnet, pytorch, pytorch_ipex, onnxrt_integerops and onnxrt_qlinearops. - -quantization: # optional. tuning constraints on model-wise for advance user to reduce tuning space. - approach: post_training_static_quant - calibration: - sampling_size: [1000] - -tuning: - accuracy_criterion: - relative: 0.01 # optional. default value is relative, other value is absolute. this example allows relative accuracy loss: 1%. - exit_policy: - timeout: 0 # optional. tuning timeout (seconds). default value is 0 which means early stop. combine with max_trials field to decide when to exit. - max_trials: 300 - random_seed: 1978 # optional. random seed for deterministic tuning. - workspace: - path: nc_workspace/vit/ \ No newline at end of file diff --git a/examples/huggingface/pytorch/image-classification/quantization/run_image_classification.py b/examples/huggingface/pytorch/image-classification/quantization/run_image_classification.py index 92d11d9c380..47cd548107c 100644 --- a/examples/huggingface/pytorch/image-classification/quantization/run_image_classification.py +++ b/examples/huggingface/pytorch/image-classification/quantization/run_image_classification.py @@ -49,7 +49,13 @@ from transformers.utils import check_min_version, send_example_telemetry from transformers.utils.versions import require_version -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import OptimizedModel, metrics +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer os.environ["WANDB_DISABLED"] = "true" @@ -171,9 +177,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default="eval_accuracy", @@ -208,9 +214,6 @@ class OptimizationArguments: num_of_instance: int = field( default=-1, metadata={"help":"the number of instance for benchmark."}) - inc_config_file: Optional[str] = field( - default="vit_config.yaml", metadata={"help": "quantization configuration file"} - ) def collate_fn(examples): @@ -446,29 +449,54 @@ def val_transforms(example_batch): model.config.save_pretrained(training_args.output_dir) trainer.save_model(training_args.output_dir) - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) model.config.save_pretrained(training_args.output_dir) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective], - config_file=optim_args.inc_config_file - ) + trainer.metrics = tune_metric + if optim_args.quantization_approach != "qat": + op_name_dict = { + 'vit.embeddings.patch_embeddings.projection.module': { + 'activation': {'dtype': ['fp32']}, + 'weight': {'dtype': ['fp32']} + }, + 'vit.embeddings.dropout': { + 'activation': {'dtype': ['fp32']}, + 'weight': {'dtype': ['fp32']} + }, + } + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion, + op_name_dict=op_name_dict, + ) + else: + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) diff --git a/examples/huggingface/pytorch/image-classification/quantization/run_tuning.sh b/examples/huggingface/pytorch/image-classification/quantization/run_tuning.sh index 2733f3e555c..e596d93e824 100644 --- a/examples/huggingface/pytorch/image-classification/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/image-classification/quantization/run_tuning.sh @@ -16,7 +16,7 @@ function init_params { model_name_or_path="google/vit-base-patch16-224" extra_cmd="" batch_size=8 - approach="PostTrainingStatic" + approach="static" for var in "$@" do case $var in @@ -45,8 +45,7 @@ function init_params { function run_tuning { if [ "${topology}" = "vit-base-patch16-224_static" ]; then model_name_or_path="/tf_dataset2/models/nlp_toolkit/vit-base" - approach="PostTrainingStatic" - inc_config_file="vit_config.yaml" + approach="static" fi python -u ./run_image_classification.py \ @@ -62,7 +61,6 @@ function run_tuning { --tune \ --overwrite_output_dir \ --quantization_approach ${approach} \ - --inc_config_file ${inc_config_file} \ ${extra_cmd} } diff --git a/examples/huggingface/pytorch/image-classification/quantization/vit_config.yaml b/examples/huggingface/pytorch/image-classification/quantization/vit_config.yaml deleted file mode 100644 index 5b9b73e5472..00000000000 --- a/examples/huggingface/pytorch/image-classification/quantization/vit_config.yaml +++ /dev/null @@ -1,30 +0,0 @@ -version: 2.0 - -model: # mandatory. used to specify model specific information. - name: vit - framework: pytorch_fx # mandatory. possible values are tensorflow, mxnet, pytorch, pytorch_ipex, onnxrt_integerops and onnxrt_qlinearops. - -quantization: # optional. tuning constraints on model-wise for advance user to reduce tuning space. - approach: post_training_static_quant - calibration: - sampling_size: [1000] - op_wise: { # optional. tuning constraints on op-wise for advance user to reduce tuning space. - 'vit.embeddings.patch_embeddings.projection.module': { # optional. set default qconfig to fp32 for FX model - 'activation': {'dtype': ['fp32']}, - 'weight': {'dtype': ['fp32']} - }, - 'vit.embeddings.dropout': { # optional. set default qconfig to fp32 for FX model - 'activation': {'dtype': ['fp32']}, - 'weight': {'dtype': ['fp32']} - }, - } - -tuning: - accuracy_criterion: - relative: 0.01 # optional. default value is relative, other value is absolute. this example allows relative accuracy loss: 1%. - exit_policy: - timeout: 0 # optional. tuning timeout (seconds). default value is 0 which means early stop. combine with max_trials field to decide when to exit. - max_trials: 300 - random_seed: 1978 # optional. random seed for deterministic tuning. - workspace: - path: nc_workspace/vit/ \ No newline at end of file diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py b/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py index ffbe7325ced..883d2468c68 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py @@ -28,7 +28,7 @@ from dataclasses import dataclass, field from datasets import load_dataset, load_metric from itertools import chain -from intel_extension_for_transformers.transformers import OptimizedModel +from intel_extension_for_transformers.transformers import OptimizedModel, metrics from neural_compressor.config import ( PostTrainingQuantConfig, QuantizationAwareTrainingConfig, @@ -209,6 +209,10 @@ class OptimizationArguments: metadata={"help": "Quantization approach. Supported approach are static, " "dynamic and qat."}, ) + metric_name: Optional[str] = field( + default="eval_loss", + metadata={"help": "Metric used for the tuning strategy."}, + ) is_relative: Optional[bool] = field( default=True, metadata={"help": "Metric tolerance mode, True is for relative, otherwise for absolute."}, @@ -572,7 +576,13 @@ def compute_metrics(eval_preds): raise ValueError( "do_train must be set to True for static and aware training quantization." ) - + tune_metric = metrics.Metric( + name=metric_name, + is_relative=optim_args.is_relative, + criterion=optim_args.perf_tol, + greater_is_better=False + ) + trainer.metrics = tune_metric if optim_args.quantization_approach != "qat": tuning_criterion = TuningCriterion(max_trials=600) accuracy_criterion = AccuracyCriterion( diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py b/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py index 82a3770dee2..15bdc445990 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py @@ -28,7 +28,7 @@ from dataclasses import dataclass, field from datasets import load_dataset, load_metric from itertools import chain -from intel_extension_for_transformers.transformers import OptimizedModel +from intel_extension_for_transformers.transformers import OptimizedModel, metrics from neural_compressor.config import ( PostTrainingQuantConfig, QuantizationAwareTrainingConfig, @@ -217,6 +217,10 @@ class OptimizationArguments: metadata={"help": "Quantization approach. Supported approach are static, " "dynamic and qat."}, ) + metric_name: Optional[str] = field( + default="eval_loss", + metadata={"help": "Metric used for the tuning strategy."}, + ) is_relative: Optional[bool] = field( default=True, metadata={"help": "Metric tolerance mode, True is for relative, otherwise for absolute."}, @@ -563,6 +567,7 @@ def compute_metrics(eval_preds): mlm_probability=data_args.mlm_probability, pad_to_multiple_of=8 if pad_to_multiple_of_8 else None, ) + metric_name = optim_args.metric_name training_args.metric_for_best_model = metric_name @@ -591,6 +596,12 @@ def compute_metrics(eval_preds): raise ValueError( "do_train must be set to True for static and aware training quantization." ) + tune_metric = metrics.Metric( + name=metric_name, + is_relative=optim_args.is_relative, + criterion=optim_args.perf_tol, + greater_is_better=False + ) if optim_args.quantization_approach != "qat": tuning_criterion = TuningCriterion(max_trials=600) accuracy_criterion = AccuracyCriterion( diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py b/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py index b4890ad3cd1..be104b5a701 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py @@ -27,7 +27,7 @@ from datasets import load_dataset from itertools import chain -from intel_extension_for_transformers.transformers import OptimizedModel +from intel_extension_for_transformers.transformers import OptimizedModel, metrics from neural_compressor.config import ( PostTrainingQuantConfig, QuantizationAwareTrainingConfig, @@ -208,6 +208,10 @@ class OptimizationArguments: default=False, metadata={"help": "Whether or not to apply quantization."}, ) + metric_name: Optional[str] = field( + default="eval_loss", + metadata={"help": "Metric used for the tuning strategy."}, + ) quantization_approach: Optional[str] = field( default="static", metadata={"help": "Quantization approach. Supported approach are static, " @@ -513,6 +517,7 @@ def group_texts(examples): plm_probability=data_args.plm_probability, max_span_length=data_args.max_span_length, ) + metric_name = optim_args.metric_name training_args.metric_for_best_model = metric_name @@ -537,6 +542,13 @@ def group_texts(examples): raise ValueError( "do_train must be set to True for static and aware training quantization." ) + tune_metric = metrics.Metric( + name=metric_name, + is_relative=optim_args.is_relative, + criterion=optim_args.perf_tol, + greater_is_better=False + ) + trainer.metrics = tune_metric if optim_args.quantization_approach != "qat": tuning_criterion = TuningCriterion(max_trials=600) accuracy_criterion = AccuracyCriterion( diff --git a/examples/huggingface/pytorch/multiple-choice/quantization/README.md b/examples/huggingface/pytorch/multiple-choice/quantization/README.md index 040ea972ba9..96caf84bc49 100644 --- a/examples/huggingface/pytorch/multiple-choice/quantization/README.md +++ b/examples/huggingface/pytorch/multiple-choice/quantization/README.md @@ -13,7 +13,7 @@ pip install -r requirements.txt # Run -The script `run_swag.py` provides three quantization approaches PostTrainingDynamic(dynamic), PostTrainingStatic(static) and QuantizationAwareTraining(qat) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). +The script `run_swag.py` provides three quantization approaches (dynamic, static and qat) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). ``` python run_swag.py \ diff --git a/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py b/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py index d1b8bcf9c94..0304dd71c29 100644 --- a/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py +++ b/examples/huggingface/pytorch/multiple-choice/quantization/run_swag.py @@ -28,7 +28,7 @@ from dataclasses import dataclass, field from datasets import load_dataset from itertools import chain -from intel_extension_for_transformers.transformers import OptimizedModel +from intel_extension_for_transformers.transformers import OptimizedModel, metrics from neural_compressor.config import ( PostTrainingQuantConfig, QuantizationAwareTrainingConfig, @@ -486,6 +486,10 @@ def compute_metrics(eval_predictions): ) model.config.save_pretrained(training_args.output_dir) + tune_metric = metrics.Metric( + name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol + ) + trainer.metrics = tune_metric if optim_args.quantization_approach != "qat": tuning_criterion = TuningCriterion(max_trials=600) accuracy_criterion = AccuracyCriterion( diff --git a/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh b/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh index f377eea06af..e70d28359d7 100644 --- a/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh @@ -41,10 +41,10 @@ function init_params { function run_tuning { if [ "${topology}" = "bert_base_swag_static" ]; then model_name_or_path="ehdwns1516/bert-base-uncased_SWAG" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "bert_base_swag_dynamic" ]; then model_name_or_path="ehdwns1516/bert-base-uncased_SWAG" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "bert_base_swag_qat" ]; then model_name_or_path="ehdwns1516/bert-base-uncased_SWAG" approach="qat" diff --git a/examples/huggingface/pytorch/question-answering/dynamic/README.md b/examples/huggingface/pytorch/question-answering/dynamic/README.md index 8b79be87732..b1d1ab9e662 100644 --- a/examples/huggingface/pytorch/question-answering/dynamic/README.md +++ b/examples/huggingface/pytorch/question-answering/dynamic/README.md @@ -82,7 +82,7 @@ python run_qa.py \ python run_qa.py \ --model_name_or_path "sguskin/dynamic-minilmv2-L6-H384-squad1.1" \ --dataset_name squad \ ---quantization_approach PostTrainingStatic \ +--quantization_approach static \ --do_eval \ --do_train \ --tune \ diff --git a/examples/huggingface/pytorch/question-answering/dynamic/run_qa.py b/examples/huggingface/pytorch/question-answering/dynamic/run_qa.py index 348b3a56977..d6c32905700 100644 --- a/examples/huggingface/pytorch/question-answering/dynamic/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/dynamic/run_qa.py @@ -29,7 +29,12 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig, DynamicLengthConfig +from intel_extension_for_transformers.transformers import metrics, DynamicLengthConfig +from neural_compressor.config import ( + PostTrainingQuantConfig, + TuningCriterion, + AccuracyCriterion +) from trainer_qa import QuestionAnsweringTrainer from intel_extension_for_transformers.transformers.modeling.modeling_roberta_dynamic import RobertaForQuestionAnswering @@ -221,9 +226,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -771,26 +776,29 @@ def compute_metrics(p: EvalPrediction): trainer.save_model(training_args.output_dir) trainer.calib_dataloader = trainer.get_eval_dataloader() - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], - ) - quantization_config.framework = "pytorch_ipex" + trainer.metrics = tune_metric + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + backend = "ipex", + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/question-answering/quantization/README.md b/examples/huggingface/pytorch/question-answering/quantization/README.md index 0e7132666ff..4d1707dc6f7 100644 --- a/examples/huggingface/pytorch/question-answering/quantization/README.md +++ b/examples/huggingface/pytorch/question-answering/quantization/README.md @@ -1,6 +1,6 @@ Step-by-Step​ ============ -The script `run_qa.py` provides three quantization approaches (PostTrainingStatic, PostTrainingStatic and QuantizationAwareTraining) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). +The script `run_qa.py` provides three quantization approaches (dynamic, static and qat) based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). # Prerequisite​ ## 1. Create Environment​ @@ -8,9 +8,8 @@ Recommended python 3.9 or higher version. ```shell pip install intel-extension-for-transformers pip install -r requirements.txt -pip install transformers==4.34.1 + ``` ->**Note**: Please use transformers no higher than 4.34.1 # Run ## 1. Quantization @@ -22,7 +21,7 @@ python run_qa.py \ --model_name_or_path distilbert-base-uncased-distilled-squad \ --dataset_name squad \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --do_train \ --do_eval \ --output_dir ./tmp/squad_output \ @@ -36,7 +35,7 @@ python run_qa.py \ --model_name_or_path bert-large-uncased-whole-word-masking-finetuned-squad \ --dataset_name squad \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --do_train \ --do_eval \ --output_dir ./tmp/squad_output \ @@ -65,7 +64,7 @@ python -m torch.distributed.launch --master_addr= --nproc_per_no --model_name_or_path bert-large-uncased-whole-word-masking-finetuned-squad \ --dataset_name squad \ --tune \ - --quantization_approach QuantizationAwareTraining \ + --quantization_approach qat \ --do_train \ --do_eval \ --output_dir ./tmp/squad_output \ @@ -75,7 +74,7 @@ python -m torch.distributed.launch --master_addr= --nproc_per_no ## 3. Validated Model List ### Stock PyTorch Validated model list -|Dataset|Pretrained model|PostTrainingDynamic | PostTrainingStatic | QuantizationAwareTraining +|Dataset|Pretrained model|dynamic | static | qat |---|------------------------------------|---|---|--- |squad|distilbert-base-uncased-distilled-squad| ✅| ✅| ✅ |squad|valhalla/longformer-base-4096-finetuned-squadv1| ✅| ✅| N/A diff --git a/examples/huggingface/pytorch/question-answering/quantization/run_qa.py b/examples/huggingface/pytorch/question-answering/quantization/run_qa.py index ac4b0237bf9..03be8e166fc 100644 --- a/examples/huggingface/pytorch/question-answering/quantization/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/quantization/run_qa.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import OptimizedModel, metrics +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -215,13 +221,13 @@ class OptimizationArguments: metadata={"help": "Tuning strategy. Supported strategies are basic, bayesian, mse, mse_v2."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) framework: Optional[str] = field( - default="pytorch", - metadata={"help": "Deep learning framework. Supported framework are pytorch, ipex"}, + default="default", + metadata={"help": "Deep learning framework. Supported framework are default, ipex"}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -655,31 +661,46 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], - sampling_size = len(train_dataset)//20 - ) - if optim_args.strategy == "mse_v2": - quantization_config.strategy = "mse_v2" - if optim_args.framework == "ipex": - quantization_config.framework = "pytorch_ipex" - trainer.calib_dataloader = calib_dataloader + trainer.metrics = tune_metric + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + backend = optim_args.framework, + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + if optim_args.framework == "ipex": + trainer.calib_dataloader = calib_dataloader + else: + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) + model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark_only: diff --git a/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh b/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh index 02dc6a88075..13d02db5d17 100644 --- a/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh @@ -17,7 +17,7 @@ function init_params { extra_cmd="" batch_size=8 MAX_SEQ_LENGTH=384 - approach="PostTrainingStatic" + approach="static" for var in "$@" do case $var in @@ -52,15 +52,15 @@ function run_tuning { if [ "${topology}" = "distilbert_base_squad_static" ]; then DATASET_NAME="squad" model_name_or_path="distilbert-base-uncased-distilled-squad" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "distilbert_base_squad_dynamic" ]; then DATASET_NAME="squad" model_name_or_path="distilbert-base-uncased-distilled-squad" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "distilbert_base_squad_qat" ]; then DATASET_NAME="squad" model_name_or_path="distilbert-base-uncased-distilled-squad" - approach="QuantizationAwareTraining" + approach="qat" extra_cmd=$extra_cmd" --learning_rate 1e-5 \ --num_train_epochs 6 \ --eval_steps 100 \ @@ -73,31 +73,31 @@ function run_tuning { elif [ "${topology}" = "bert_large_SQuAD_static" ]; then DATASET_NAME="squad" model_name_or_path="bert-large-uncased-whole-word-masking-finetuned-squad" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "roberta_base_SQuAD2_static" ]; then DATASET_NAME="squad" model_name_or_path="deepset/roberta-base-squad2" - approach="PostTrainingStatic" + approach="static" # extra_cmd=$extra_cmd" --version_2_with_negative" elif [ "${topology}" = "longformer_base_squad_static" ]; then DATASET_NAME="squad" model_name_or_path="valhalla/longformer-base-4096-finetuned-squadv1" - approach="PostTrainingStatic" + approach="static" extra_cmd=$extra_cmd" --strategy mse_v2" elif [ "${topology}" = "longformer_base_squad_dynamic" ]; then DATASET_NAME="squad" model_name_or_path="valhalla/longformer-base-4096-finetuned-squadv1" - approach="PostTrainingDynamic" + approach="dynamic" extra_cmd=$extra_cmd" --strategy mse_v2" elif [ "${topology}" = "distilbert_base_squad_ipex" ]; then DATASET_NAME="squad" model_name_or_path="distilbert-base-uncased-distilled-squad" extra_cmd=$extra_cmd" --perf_tol 0.02" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "bert_large_squad_ipex" ]; then DATASET_NAME="squad" model_name_or_path="bert-large-uncased-whole-word-masking-finetuned-squad" - approach="PostTrainingStatic" + approach="static" fi python -u ./run_qa.py \ diff --git a/examples/huggingface/pytorch/summarization/quantization/README.md b/examples/huggingface/pytorch/summarization/quantization/README.md index c48c2a83704..f8f64520f8a 100644 --- a/examples/huggingface/pytorch/summarization/quantization/README.md +++ b/examples/huggingface/pytorch/summarization/quantization/README.md @@ -49,18 +49,16 @@ python examples/pytorch/summarization/run_summarization.py \ --dataset_name samsum \ --do_train \ --do_eval \ - --train_file path_to_csv_or_jsonlines_file \ - --validation_file path_to_csv_or_jsonlines_file \ --output_dir /tmp/tst-summarization \ --overwrite_output_dir \ - --per_device_train_batch_size=8 \ - --per_device_eval_batch_size=8 \ + --per_device_train_batch_size 8 \ + --per_device_eval_batch_size 8 \ --tune \ --predict_with_generate \ --perf_tol 0.03 ``` ### 2. Validated Model List -|Dataset|Pretrained model|PostTrainingDynamic | PostTrainingStatic | QuantizationAwareTraining +|Dataset|Pretrained model|dynamic | static | qat |---|------------------------------------|---|---|--- |samsum|pegasus_samsum| ✅| N/A | N/A |cnn_dailymail|t5_base_cnn| ✅| N/A | N/A diff --git a/examples/huggingface/pytorch/summarization/quantization/run_benchmark.sh b/examples/huggingface/pytorch/summarization/quantization/run_benchmark.sh index 4fe01c952dd..d3b375060aa 100644 --- a/examples/huggingface/pytorch/summarization/quantization/run_benchmark.sh +++ b/examples/huggingface/pytorch/summarization/quantization/run_benchmark.sh @@ -78,11 +78,11 @@ function run_benchmark { elif [ "${topology}" == "flan_t5_large_samsum_dynamic" ]; then DATASET_NAME="samsum" model_name_or_path="stacked-summaries/flan-t5-large-stacked-samsum-1024" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" == "flan_t5_large_samsum_static" ]; then DATASET_NAME="samsum" model_name_or_path="stacked-summaries/flan-t5-large-stacked-samsum-1024" - approach="PostTrainingStatic" + approach="static" else echo "unsupported topology: ${topology}" exit 1 diff --git a/examples/huggingface/pytorch/summarization/quantization/run_summarization.py b/examples/huggingface/pytorch/summarization/quantization/run_summarization.py index 9d9cc794d38..3844e45173f 100755 --- a/examples/huggingface/pytorch/summarization/quantization/run_summarization.py +++ b/examples/huggingface/pytorch/summarization/quantization/run_summarization.py @@ -30,8 +30,13 @@ from datasets import load_dataset, load_metric from filelock import FileLock -from intel_extension_for_transformers.transformers import OptimizedModel, QuantizationConfig -from intel_extension_for_transformers.transformers import metrics as nlp_metrics +from intel_extension_for_transformers.transformers import OptimizedModel, metrics +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPSeq2SeqTrainer from transformers import ( AutoConfig, @@ -267,9 +272,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default="eval_rougeLsum", @@ -700,26 +705,42 @@ def compute_metrics(eval_preds): trainer.save_model(training_args.output_dir) - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - - tune_metric = nlp_metrics.Metric( + tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], - sampling_size = len(train_dataset)//20 - ) + trainer.metrics = tune_metric + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) trainer.max_length = max_length trainer.num_beams = num_beams model = trainer.quantize(quant_config=quantization_config) diff --git a/examples/huggingface/pytorch/summarization/quantization/run_tuning.sh b/examples/huggingface/pytorch/summarization/quantization/run_tuning.sh index c42d6045c89..e9f714d2bfb 100644 --- a/examples/huggingface/pytorch/summarization/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/summarization/quantization/run_tuning.sh @@ -15,7 +15,7 @@ function init_params { DATASET_NAME="xsum" extra_cmd="" batch_size=8 - approach="PostTrainingStatic" + approach="static" for var in "$@" do case $var in @@ -45,24 +45,24 @@ function run_tuning { if [ "${topology}" == "pegasus_samsum_dynamic" ]; then DATASET_NAME="samsum" model_name_or_path="lvwerra/pegasus-samsum" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" == "t5_base_cnn_dynamic" ]; then DATASET_NAME="cnn_dailymail" model_name_or_path="flax-community/t5-base-cnn-dm" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" == "t5_large_cnn_dynamic" ]; then DATASET_NAME="cnn_dailymail" model_name_or_path="sysresearch101/t5-large-finetuned-xsum-cnn" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" == "flan_t5_large_samsum_dynamic" ]; then DATASET_NAME="samsum" model_name_or_path="stacked-summaries/flan-t5-large-stacked-samsum-1024" - approach="PostTrainingDynamic" + approach="dynamic" extra_cmd=$extra_cmd" --perf_tol 0.03" elif [ "${topology}" == "flan_t5_large_samsum_static" ]; then DATASET_NAME="samsum" model_name_or_path="stacked-summaries/flan-t5-large-stacked-samsum-1024" - approach="PostTrainingStatic" + approach="static" extra_cmd=$extra_cmd" --perf_tol 0.03" else echo "unsupported topology: ${topology}" diff --git a/examples/huggingface/pytorch/text-classification/quantization/run_glue.py b/examples/huggingface/pytorch/text-classification/quantization/run_glue.py index 65fadf439df..a6c1a96e04d 100644 --- a/examples/huggingface/pytorch/text-classification/quantization/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/quantization/run_glue.py @@ -26,7 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import OptimizedModel +from intel_extension_for_transformers.transformers import OptimizedModel, metrics, objectives from intel_extension_for_transformers.transformers.trainer import NLPTrainer from neural_compressor.config import ( PostTrainingQuantConfig, @@ -208,6 +208,10 @@ class OptimizationArguments: metadata={"help": "Quantization approach. Supported approach are static, " "dynamic and qat."}, ) + metric_name: Optional[str] = field( + default=None, + metadata={"help": "Metric used for the tuning strategy."}, + ) is_relative: Optional[bool] = field( default=True, metadata={"help": "Metric tolerance model, expected to be relative or absolute."}, @@ -506,6 +510,20 @@ def compute_metrics(p: EvalPrediction): else: data_collator = None + metric_name = ( + optim_args.metric_name + if optim_args.metric_name is not None + else "eval_" + + ( + "pearson" + if data_args.task_name == "stsb" + else "matthews_correlation" + if data_args.task_name == "cola" + else "accuracy" + ) + ) + training_args.metric_for_best_model = metric_name + # Initialize our Trainer trainer = NLPTrainer( model=model, @@ -527,9 +545,13 @@ def compute_metrics(p: EvalPrediction): raise ValueError( "do_train must be set to True for static and aware training quantization." ) - + tune_metric = metrics.Metric( + name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol + ) + trainer.metrics = tune_metric + objective = objectives.performance if optim_args.quantization_approach != "qat": - tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) accuracy_criterion = AccuracyCriterion( higher_is_better=True, # optional. criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". diff --git a/examples/huggingface/pytorch/text-classification/quantization/run_glue_no_trainer.py b/examples/huggingface/pytorch/text-classification/quantization/run_glue_no_trainer.py index 00006ac0526..384464a9350 100644 --- a/examples/huggingface/pytorch/text-classification/quantization/run_glue_no_trainer.py +++ b/examples/huggingface/pytorch/text-classification/quantization/run_glue_no_trainer.py @@ -30,8 +30,12 @@ import transformers from accelerate import Accelerator from huggingface_hub import Repository -from intel_extension_for_transformers.transformers import (metrics, NoTrainerOptimizer, objectives, OptimizedModel, - QuantizationConfig) +from intel_extension_for_transformers.transformers import metrics, NoTrainerOptimizer, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + TuningCriterion, + AccuracyCriterion +) from transformers import ( AdamW, AutoConfig, @@ -172,9 +176,9 @@ def parse_args(): parser.add_argument("--tune", action="store_true", help="tune a best model with Intel Extension for Transformers.") parser.add_argument("--quantization_approach", type=str, - default="PostTrainingStatic", - help="Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining.") + default="static", + help="Quantization approach. Supported approach are static, " + "dynamic and qat.") parser.add_argument("--metric_name", type=str, default=None, @@ -521,12 +525,20 @@ def eval_func_nc(model): is_relative=args.is_relative, criterion=args.perf_tol) objective = objectives.performance - q_config = QuantizationConfig(approach=args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective]) + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) quantizer = NoTrainerOptimizer(model, args.output_dir) - model = quantizer.quantize(q_config, + quantizer.metrics = tune_metric + model = quantizer.quantize(quantization_config, eval_func=eval_func_nc, calib_dataloader=train_dataloader) diff --git a/examples/huggingface/pytorch/text-to-image/quantization/ptq/README.md b/examples/huggingface/pytorch/text-to-image/quantization/ptq/README.md index 345ccaba5c3..d74432313d2 100644 --- a/examples/huggingface/pytorch/text-to-image/quantization/ptq/README.md +++ b/examples/huggingface/pytorch/text-to-image/quantization/ptq/README.md @@ -22,7 +22,7 @@ pip install -r requirements.txt python run_diffusion.py \ --model_name_or_path lambdalabs/sd-pokemon-diffusers \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --perf_tol 0.02 \ --output_dir /tmp/diffusion_output \ --base_images base_images \ diff --git a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py index 5e2e2e62669..609f904cce2 100644 --- a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py +++ b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py @@ -30,7 +30,12 @@ from accelerate.utils import set_seed from diffusers import StableDiffusionPipeline -from intel_extension_for_transformers.transformers import metrics , NoTrainerOptimizer, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics , NoTrainerOptimizer +from neural_compressor.config import ( + PostTrainingQuantConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.config import WEIGHTS_NAME from pytorch_fid import fid_score @@ -100,9 +105,9 @@ def parse_args(): parser.add_argument( "--quantization_approach", type=str, - default="PostTrainingStatic", - help="Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining.", + default="static", + help="Quantization approach. Supported approach are static, " + "dynamic and qat.", ) parser.add_argument( "--framework", @@ -301,13 +306,20 @@ def eval_func(model): criterion=args.perf_tol, greater_is_better=False ) - quantization_config = QuantizationConfig( - approach=args.quantization_approach, - max_trials=200, - metrics=[tune_metric], - ) + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) os.makedirs(args.output_dir, exist_ok=True) quantizer = NoTrainerOptimizer(model, args.output_dir) + quantizer.metrics = tune_metric model = quantizer.quantize(quantization_config, eval_func=eval_func, calib_func=calibration_func, diff --git a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_tuning.sh b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_tuning.sh index 117762d8940..c288b195d27 100644 --- a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_tuning.sh +++ b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_tuning.sh @@ -15,7 +15,7 @@ function init_params { model_name_or_path="lambdalabs/sd-pokemon-diffusers" extra_cmd="" batch_size=8 - approach="PostTrainingStatic" + approach="static" for var in "$@" do case $var in @@ -45,10 +45,10 @@ function run_tuning { if [ "${topology}" = "sd_pokemon_diffusers_static" ]; then model_name_or_path="lambdalabs/sd-pokemon-diffusers" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "sd_pokemon_diffusers_dynamic" ]; then model_name_or_path="lambdalabs/sd-pokemon-diffusers" - approach="PostTrainingDynamic" + approach="dynamic" fi python -u ./run_diffusion.py \ diff --git a/examples/huggingface/pytorch/token-classification/quantization/README.md b/examples/huggingface/pytorch/token-classification/quantization/README.md index 0cc950c742f..a718fceb82a 100644 --- a/examples/huggingface/pytorch/token-classification/quantization/README.md +++ b/examples/huggingface/pytorch/token-classification/quantization/README.md @@ -8,9 +8,7 @@ Token classification assigns a label to individual tokens in a sentence. One of ## 1. Environment ``` pip install -r requirements.txt -pip install transformers==4.34.1 ``` ->**Note**: Please use transformers no higher than 4.34.1 # Run @@ -22,7 +20,7 @@ pip install transformers==4.34.1 --model_name_or_path elastic/distilbert-base-uncased-finetuned-conll03-english \ --dataset_name conll2003 \ --tune \ - --quantization_approach PostTrainingStatic \ + --quantization_approach static \ --do_train \ --do_eval \ --pad_to_max_length \ @@ -32,7 +30,7 @@ pip install transformers==4.34.1 # Performance Data -|Dataset|Pretrained model|PostTrainingDynamic | PostTrainingStatic | QuantizationAwareTraining +|Dataset|Pretrained model|dynamic | static | qat |---|------------------------------------|---|---|--- |NER|elastic/distilbert-base-uncased-finetuned-conll03-english| ✅| ✅| ✅ diff --git a/examples/huggingface/pytorch/token-classification/quantization/run_ner.py b/examples/huggingface/pytorch/token-classification/quantization/run_ner.py index 7076b1bd5fe..1b2a187d3f0 100644 --- a/examples/huggingface/pytorch/token-classification/quantization/run_ner.py +++ b/examples/huggingface/pytorch/token-classification/quantization/run_ner.py @@ -27,10 +27,12 @@ import transformers from dataclasses import dataclass, field from datasets import ClassLabel, load_dataset, load_metric -from intel_extension_for_transformers.transformers import( - metrics, - OptimizedModel, - QuantizationConfig, +from intel_extension_for_transformers.transformers import OptimizedModel, metrics +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion ) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( @@ -200,9 +202,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -573,6 +575,7 @@ def compute_metrics(p): metric_name = optim_args.metric_name training_args.metric_for_best_model = metric_name + # Initialize our Trainer trainer = NLPTrainer( model=model, @@ -590,25 +593,42 @@ def compute_metrics(p): raise ValueError("do_eval must be set to True for quantization.") trainer.save_model(training_args.output_dir) - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - metrics=[tune_metric], - sampling_size = len(train_dataset)//20 - ) + trainer.metrics = tune_metric + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quantization_config) if optim_args.benchmark_only: diff --git a/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh b/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh index 35616849055..a5194758ca6 100644 --- a/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh @@ -18,7 +18,7 @@ function init_params { batch_size=8 MAX_SEQ_LENGTH=384 model_type="bert" - approach="PostTrainingStatic" + approach="static" for var in "$@" do case $var in @@ -49,17 +49,17 @@ function run_tuning { DATASET_NAME="conll2003" model_name_or_path="elastic/distilbert-base-uncased-finetuned-conll03-english " model_type="bert" - approach="PostTrainingStatic" + approach="static" elif [ "${topology}" = "distilbert_base_ner_dynamic" ]; then DATASET_NAME="conll2003" model_name_or_path="elastic/distilbert-base-uncased-finetuned-conll03-english " model_type="bert" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "distilbert_base_ner_qat" ]; then DATASET_NAME="conll2003" model_name_or_path="elastic/distilbert-base-uncased-finetuned-conll03-english " model_type="bert" - approach="QuantizationAwareTraining" + approach="qat" extra_cmd=$extra_cmd" --learning_rate 1e-5 \ --num_train_epochs 6 \ --eval_steps 100 \ diff --git a/examples/huggingface/pytorch/translation/quantization/README.md b/examples/huggingface/pytorch/translation/quantization/README.md index 3eecf1d4316..8fd4c4844fe 100644 --- a/examples/huggingface/pytorch/translation/quantization/README.md +++ b/examples/huggingface/pytorch/translation/quantization/README.md @@ -9,9 +9,7 @@ This directory contains the example for quantization models on translation tasks ``` pip install intel-extension-for-transformers pip install -r requirements.txt -pip install transformers==4.34.1 ``` ->**Note**: Please use transformers no higher than 4.34.1 # Run @@ -30,8 +28,8 @@ python examples/pytorch/translation/run_translation.py \ --dataset_name wmt16 \ --dataset_config_name ro-en \ --output_dir /tmp/tst-translation \ - --per_device_train_batch_size=4 \ - --per_device_eval_batch_size=4 \ + --per_device_train_batch_size 4 \ + --per_device_eval_batch_size 4 \ --overwrite_output_dir \ --tune \ --predict_with_generate @@ -51,8 +49,8 @@ python examples/pytorch/translation/run_translation.py \ --dataset_name wmt16 \ --dataset_config_name ro-en \ --output_dir /tmp/tst-translation \ - --per_device_train_batch_size=4 \ - --per_device_eval_batch_size=4 \ + --per_device_train_batch_size 4 \ + --per_device_eval_batch_size 4 \ --overwrite_output_dir \ --tune \ --predict_with_generate diff --git a/examples/huggingface/pytorch/translation/quantization/run_translation.py b/examples/huggingface/pytorch/translation/quantization/run_translation.py index f5554905dcc..00d5cf56319 100755 --- a/examples/huggingface/pytorch/translation/quantization/run_translation.py +++ b/examples/huggingface/pytorch/translation/quantization/run_translation.py @@ -28,8 +28,13 @@ import numpy as np from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import OptimizedModel, QuantizationConfig -from intel_extension_for_transformers.transformers import metrics as nlp_metrics +from intel_extension_for_transformers.transformers import OptimizedModel, objectives, metrics +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPSeq2SeqTrainer import transformers from transformers import ( @@ -244,9 +249,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default="eval_bleu", @@ -620,26 +625,43 @@ def compute_metrics(eval_preds): raise ValueError("do_eval must be set to True for quantization.") trainer.save_model(training_args.output_dir) - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - - tune_metric = nlp_metrics.Metric( + objective = objectives.performance + tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], - sampling_size = len(train_dataset)//20 - ) + trainer.metrics = tune_metric + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) trainer.max_length = max_length trainer.num_beams = num_beams model = trainer.quantize(quant_config=quantization_config) diff --git a/examples/huggingface/pytorch/translation/quantization/run_tuning.sh b/examples/huggingface/pytorch/translation/quantization/run_tuning.sh index 14fef28308b..ef294a54587 100644 --- a/examples/huggingface/pytorch/translation/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/translation/quantization/run_tuning.sh @@ -15,7 +15,7 @@ function init_params { DATASET_NAME="xsum" extra_cmd="" batch_size=8 - approach="PostTrainingStatic" + approach="static" for var in "$@" do case $var in @@ -45,11 +45,11 @@ function run_tuning { if [ "${topology}" = "t5-small_dynamic" ]; then model_name_or_path="t5-small" extra_cmd=$extra_cmd" --source_lang en --target_lang ro --dataset_name wmt16 --dataset_config_name ro-en" - approach="PostTrainingDynamic" + approach="dynamic" elif [ "${topology}" = "marianmt_WMT_en_ro_dynamic" ]; then model_name_or_path='Helsinki-NLP/opus-mt-en-ro' extra_cmd=$extra_cmd" --source_lang en --target_lang ro --dataset_name wmt16 --dataset_config_name ro-en" - approach="PostTrainingDynamic" + approach="dynamic" else echo "unsupported topology: ${topology}" exit 1 From b29740acd547e658ddb14ac27556b68b73e6dd71 Mon Sep 17 00:00:00 2001 From: changwangss Date: Thu, 13 Jun 2024 03:03:31 -0700 Subject: [PATCH 06/22] update trainer.py Signed-off-by: changwangss --- .../transformers/trainer.py | 70 +++++++++++++------ 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/intel_extension_for_transformers/transformers/trainer.py b/intel_extension_for_transformers/transformers/trainer.py index c2fbeb0348e..a2534977363 100644 --- a/intel_extension_for_transformers/transformers/trainer.py +++ b/intel_extension_for_transformers/transformers/trainer.py @@ -32,8 +32,8 @@ DistillationConfig, Provider, PruningMode, - # QuantizationConfig, - # QuantizationMode, + QuantizationConfig, + QuantizationMode, PruningConfig, DynamicLengthConfig, BenchmarkConfig, @@ -43,7 +43,6 @@ from neural_compressor.config import ( PostTrainingQuantConfig, QuantizationAwareTrainingConfig, - TuningCriterion ) from intel_extension_for_transformers.transformers.benchmark import benchmark from intel_extension_for_transformers.transformers.utils.metrics import Metric @@ -147,6 +146,7 @@ def __init__(self, *args, **kwargs): self.orchestrate_opt = False self.orchestrate_opt_pruning = False self.dynamic_config = None + self.model_config = None @property def resuming_checkpoint(self): @@ -208,18 +208,27 @@ def builtin_eval_func(self, model): torch.manual_seed(self.args.seed) results = self.evaluate() logger.info(results) - task_name = self.eval_dataset.config_name - if "wikitext" in task_name: - metric_name = "eval_loss" - elif task_name == "stsb": - metric_name = "eval_person" - elif task_name == "cola": - metric_name = "eval_matthews_correlation" - else: - metric_name = "eval_accuracy" - assert metric_name in results.keys(), \ - "Please set metric from {}".format(results.keys()) - result = results.get(metric_name) + if isinstance(self.metrics, list): + nums = len(self.metrics) + for metric in self.metrics: + assert metric.name in results.keys(), \ + "Please set metric from {}".format(results.keys()) + if nums == 1: + result = results.get(self.metrics[0].name) + else: # pragma: no cover + result = 0 + for metric in self.metrics: + assert metric.weight_ratio is not None, \ + "Please set weights for metric if you want to use more than one metric" + result += results[metric.name] * metric.weighted + logger.info("metric: {}".format(result)) + elif isinstance(self.metrics, Metric): + assert self.metrics.name in results.keys(), \ + "Please set metric from {}".format(results.keys()) + result = results.get(self.metrics.name) + logger.info("metric: {}".format(result)) + else: # pragma: no cover + assert False, "Please set the correct metrics format from the README" logger.info("Throughput: {} samples/sec".format(results.get("eval_samples_per_second"))) return result @@ -256,9 +265,13 @@ def _inc_quantize( except Exception as e: # pragma: no cover logger.warning("Model deepcopy failed: {}!".format(repr(e))) if isinstance(quant_config, PostTrainingQuantConfig): + if quant_config.backend == "ipex": + self.model_config = self.model.config # jit model will loss config + if self._calib_dataloader is None: + self._calib_dataloader = self.get_train_dataloader() self.opt_model = fit(self.model, conf=quant_config, - calib_dataloader=self.get_train_dataloader(), + calib_dataloader=self._calib_dataloader, eval_func=self._eval_func) else: compression_manager = prepare_compression(self.model, quant_config) @@ -1735,9 +1748,26 @@ def builtin_eval_func(self, model): torch.manual_seed(self.args.seed) results = self.evaluate(metric_key_prefix="eval") logger.info(results) - metric_name = "eval_bleu" - assert metric_name in results.keys(), \ - "Please set metric from {}".format(results.keys()) - result = results.get(metric_name) + if isinstance(self.metrics, list): + nums = len(self.metrics) + for metric in self.metrics: + assert metric.name in results.keys(), \ + "Please set metric from {}".format(results.keys()) + if nums == 1: + result = results.get(self.metrics[0].name) + else: + result = 0 + for metric in self.metrics: + assert metric.weight_ratio is not None, \ + "Please set weights for metric if you want to use more than one metric" + result += results[metric.name] * metric.weighted + logger.info("metric: {}".format(result)) + elif isinstance(self.metrics, Metric): + assert self.metrics.name in results.keys(), \ + "Please set metric from {}".format(results.keys()) + result = results.get(self.metrics.name) + logger.info("metric: {}".format(result)) + else: + assert False, "Please set the correct metrics format from the README" logger.info("Throughput: {} samples/sec".format(results.get("eval_samples_per_second"))) return result From 9d7b0ee89e29b5cf18b70b4fcd39f7292f70de6e Mon Sep 17 00:00:00 2001 From: changwangss Date: Fri, 14 Jun 2024 01:03:55 -0700 Subject: [PATCH 07/22] improve notebook exampels Signed-off-by: changwangss --- docs/metrics.md | 29 ++++++++ .../language-modeling/bert-base-uncased.ipynb | 16 +++-- .../bert-base-uncased_SWAG.ipynb | 23 +++--- .../Dynamic_MiniLM_SQuAD.ipynb | 10 +-- .../bert-base-uncased_distilled-squad.ipynb | 19 +++-- ...d-whole-word-masking-finetuned-squad.ipynb | 14 ++-- .../summarization/pegasus-samsum.ipynb | 16 ++--- .../bert-base-uncased-MRPC.ipynb | 27 ++++--- .../distilbert_base_ner.ipynb | 14 ++-- .../pytorch/translation/t5-small.ipynb | 10 +-- .../transformers/optimizer.py | 71 +++++++------------ tests/CI/test_quantization_qa_ipex.py | 4 +- 12 files changed, 132 insertions(+), 121 deletions(-) create mode 100644 docs/metrics.md diff --git a/docs/metrics.md b/docs/metrics.md new file mode 100644 index 00000000000..c1e81bde32f --- /dev/null +++ b/docs/metrics.md @@ -0,0 +1,29 @@ +Metrics +======= +1. [Introduction](#introduction) +2. [Supported Metric](#supported-metric) +3. [Metric Class Summary](#metric-class-summary) +4. [Get Start with Metrics](#get-start-with-metrics) + +## Introduction +In terms of evaluating the performance of a specific model, we should have general metrics to measure the performance of different models. The Metric defines which metric will be used to measure the performance of tuned models and how to use the metric, just like: greater is better, performance tolerance ... and so on. The Metric only provides the metric name, all metrics class is from [datasets](https://github.com/huggingface/datasets/tree/main/metrics). + +## Supported Metric +All metrics be provide by [Huggingface datasets](https://github.com/huggingface/datasets/tree/main/metrics). + +## Metric Class Summary +- arguments: + |Argument |Type |Description |Default value | + |:----------|:----------|:-----------------------------------------------|:----------------| + |name |string |Metric name which evaluates function returns, like:"eval_f1", "eval_accuracy"...| | + |greater_is_better|bool |Used to describe the usage of the metric, like: greater is better for f1, this parameter is only used for quantization.|True| + |is_relative|bool |Used in conjunction with "criterion". If "criterion" is 0.01, and "is_relative" is True, it means that we want to get an optimized model which metric drop <1% relative, if "is_relative" is False, means metric drop <1% absolute, this parameter is only used for quantization.|True | + |criterion |float |Used in conjunction with "is_relative". If "criterion" is 0.01, and "is_relative" is True, it means that we want to get an optimized model which metric drop <1% relative, if "criterion" is 0.02, means metric drop <2% relative, this parameter is only used for quantization.|0.01 | + |weight_ratio|float |Used when there are multiple metrics, for example: you want to focus on both f1 and accuracy, then you will create f1 instance and accuracy instance, and indicate their weight proportion. If weight_ratio of f1 is 0.3, and weight ratio of accuracy is 0.7, then the final metric to tune is f1*0.3 + accuracy*0.7, this parameter is only used for quantization.|None | + +## Get Start with Metrics +- example: + ```python + from intel_extension_for_transformers.transformers import metric + metric.Metric(name="eval_f1", greater_is_better=True, is_relative=True, criterion=0.01, weight_ratio=None) + ``` diff --git a/docs/tutorials/pytorch/language-modeling/bert-base-uncased.ipynb b/docs/tutorials/pytorch/language-modeling/bert-base-uncased.ipynb index c25aff405e5..f87803721a2 100644 --- a/docs/tutorials/pytorch/language-modeling/bert-base-uncased.ipynb +++ b/docs/tutorials/pytorch/language-modeling/bert-base-uncased.ipynb @@ -80,7 +80,8 @@ "from dataclasses import dataclass, field\n", "from datasets import load_dataset, load_metric\n", "from itertools import chain\n", - "from intel_extension_for_transformers.transformers import metrics, OptimizedModel, QuantizationConfig\n", + "from intel_extension_for_transformers.transformers import metrics, OptimizedModel\n", + "from neural_compressor.config import PostTrainingQuantConfig\n", "from intel_extension_for_transformers.transformers.trainer import NLPTrainer\n", "from transformers import (\n", " CONFIG_MAPPING,\n", @@ -373,9 +374,10 @@ " criterion=\"0.25\", # Performance tolerance when optimizing the model.\n", " greater_is_better=False \n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingStatic\",\n", - " metrics=[tune_metric],\n", + "\n", + "trainer_ptq_static.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"static\"\n", ")\n", "\n", "# run quantization\n", @@ -473,9 +475,9 @@ " criterion=\"0.25\", # why performance tolerance\n", " greater_is_better=False\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingDynamic\",\n", - " metrics=[tune_metric],\n", + "trainer_ptq_dynamic.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"dynamic\",\n", ")\n", "\n", "# run quantization\n", diff --git a/docs/tutorials/pytorch/multiple-choice/bert-base-uncased_SWAG.ipynb b/docs/tutorials/pytorch/multiple-choice/bert-base-uncased_SWAG.ipynb index 9f554cbd1a0..07cd55ec7f9 100644 --- a/docs/tutorials/pytorch/multiple-choice/bert-base-uncased_SWAG.ipynb +++ b/docs/tutorials/pytorch/multiple-choice/bert-base-uncased_SWAG.ipynb @@ -108,7 +108,8 @@ "from dataclasses import dataclass, field\n", "from datasets import load_dataset\n", "from itertools import chain\n", - "from intel_extension_for_transformers.transformers import metrics, OptimizedModel, QuantizationConfig\n", + "from intel_extension_for_transformers.transformers import metrics, OptimizedModel\n", + "from neural_compressor.config import PostTrainingQuantConfig\n", "from intel_extension_for_transformers.transformers.trainer import NLPTrainer\n", "from transformers import (\n", " AutoConfig,\n", @@ -199,9 +200,9 @@ " metadata={\"help\": \"Whether or not to apply quantization.\"},\n", " )\n", " quantization_approach: Optional[str] = field(\n", - " default=\"POSTTRAININGSTATIC\",\n", - " metadata={\"help\": \"Quantization approach. Supported approach are POSTTRAININGSTATIC, \"\n", - " \"POSTTRAININGDYNAMIC and QUANTIZATIONAWARETRAINING.\"},\n", + " default=\"static\",\n", + " metadata={\"help\": \"Quantization approach. Supported approach are static, \"\n", + " \"dynamic and qat.\"},\n", " )" ] }, @@ -235,7 +236,7 @@ ")\n", "optim_args = OptimizationArguments(\n", " tune=True,\n", - " quantization_approach=\"PostTrainingStatic\"\n", + " quantization_approach=\"static\"\n", ")" ] }, @@ -438,9 +439,9 @@ " is_relative=True, # Metric tolerance mode, True is for relative, otherwise for absolute.\n", " criterion=\"0.25\", # Performance tolerance when optimizing the model.\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingStatic\",\n", - " metrics=[tune_metric],\n", + "trainer_static.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"static\",\n", ")\n", "\n", "# run quantization\n", @@ -547,9 +548,9 @@ " is_relative=True, # Metric tolerance mode, True is for relative, otherwise for absolute.\n", " criterion=\"0.25\", # Performance tolerance when optimizing the model.\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingDynamic\",\n", - " metrics=[tune_metric],\n", + "trainer_dynamic.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"dynamic\",\n", ")\n", "\n", "# run quantization\n", diff --git a/docs/tutorials/pytorch/question-answering/Dynamic_MiniLM_SQuAD.ipynb b/docs/tutorials/pytorch/question-answering/Dynamic_MiniLM_SQuAD.ipynb index 4f59134773f..26ddaa817c8 100644 --- a/docs/tutorials/pytorch/question-answering/Dynamic_MiniLM_SQuAD.ipynb +++ b/docs/tutorials/pytorch/question-answering/Dynamic_MiniLM_SQuAD.ipynb @@ -86,7 +86,8 @@ "from dataclasses import dataclass, field\n", "from datasets import load_dataset, load_metric\n", "from itertools import chain\n", - "from intel_extension_for_transformers.transformers import metrics, OptimizedModel, QuantizationConfig, DynamicLengthConfig\n", + "from intel_extension_for_transformers.transformers import metrics, OptimizedModel, DynamicLengthConfig\n", + "from neural_compressor.config import PostTrainingQuantConfig\n", "from intel_extension_for_transformers.transformers.trainer import NLPTrainer\n", "from transformers.trainer_utils import get_last_checkpoint\n", "from transformers.utils.versions import require_version\n", @@ -2162,10 +2163,9 @@ " is_relative=True, # Metric tolerance mode, True is for relative, otherwise for absolute.\n", " criterion=\"0.01\", # Performance tolerance when optimizing the model.\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingStatic\",\n", - " max_trials=200,\n", - " metrics=[tune_metric],\n", + "quant_dynamic_trainer.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"static\",\n", ")\n", "\n", "# lc = \"(269, 253, 252, 202, 104, 34)\" # configure model with best length config\n", diff --git a/docs/tutorials/pytorch/question-answering/bert-base-uncased_distilled-squad.ipynb b/docs/tutorials/pytorch/question-answering/bert-base-uncased_distilled-squad.ipynb index c2902561cee..6ea589616ba 100644 --- a/docs/tutorials/pytorch/question-answering/bert-base-uncased_distilled-squad.ipynb +++ b/docs/tutorials/pytorch/question-answering/bert-base-uncased_distilled-squad.ipynb @@ -116,7 +116,8 @@ "import transformers\n", "from dataclasses import dataclass, field\n", "from datasets import load_dataset, load_metric\n", - "from intel_extension_for_transformers.transformers import metrics , QuantizationConfig\n", + "from intel_extension_for_transformers.transformers import metrics\n", + "from neural_compressor.config import PostTrainingQuantConfig\n", "from transformers import (\n", " AutoConfig,\n", " AutoModelForQuestionAnswering,\n", @@ -645,7 +646,7 @@ ")\n", "optim_args = OptimizationArguments(\n", " tune=True,\n", - " quantization_approach=\"PostTrainingStatic\"\n", + " quantization_approach=\"static\"\n", ")\n", "log_level = training_args.get_process_log_level()" ] @@ -999,10 +1000,9 @@ " is_relative=True, # Metric tolerance mode, True is for relative, otherwise for absolute.\n", " criterion=0.25, # Performance tolerance when optimizing the model.\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingStatic\",\n", - " max_trials=200,\n", - " metrics=[tune_metric],\n", + "trainer_static.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"static\",\n", ")\n", "\n", "# run quantization\n", @@ -1113,10 +1113,9 @@ " is_relative=True, # Metric tolerance mode, True is for relative, otherwise for absolute.\n", " criterion=0.25, # Performance tolerance when optimizing the model.\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingDynamic\",\n", - " max_trials=200,\n", - " metrics=[tune_metric],\n", + "trainer_dynamic.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"dynamic\",\n", ")\n", "\n", "# run quantization\n", diff --git a/docs/tutorials/pytorch/question-answering/bert-large-uncased-whole-word-masking-finetuned-squad.ipynb b/docs/tutorials/pytorch/question-answering/bert-large-uncased-whole-word-masking-finetuned-squad.ipynb index 9b893e6a340..53c79e94b89 100644 --- a/docs/tutorials/pytorch/question-answering/bert-large-uncased-whole-word-masking-finetuned-squad.ipynb +++ b/docs/tutorials/pytorch/question-answering/bert-large-uncased-whole-word-masking-finetuned-squad.ipynb @@ -116,7 +116,8 @@ "import transformers\n", "from dataclasses import dataclass, field\n", "from datasets import load_dataset, load_metric\n", - "from intel_extension_for_transformers.transformers import metrics , QuantizationConfig\n", + "from intel_extension_for_transformers.transformers import metrics\n", + "from neural_compressor.config import PostTrainingQuantConfig\n", "from transformers import (\n", " AutoConfig,\n", " AutoModelForQuestionAnswering,\n", @@ -645,7 +646,7 @@ ")\n", "optim_args = OptimizationArguments(\n", " tune=True,\n", - " quantization_approach=\"PostTrainingStatic\"\n", + " quantization_approach=\"static\"\n", ")\n", "log_level = training_args.get_process_log_level()" ] @@ -1000,7 +1001,7 @@ " criterion=0.25, # Performance tolerance when optimizing the model.\n", ")\n", "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingStatic\",\n", + " approach=\"static\",\n", " max_trials=200,\n", " metrics=[tune_metric],\n", ")\n", @@ -1092,10 +1093,9 @@ " is_relative=True, # Metric tolerance mode, True is for relative, otherwise for absolute.\n", " criterion=0.25, # Performance tolerance when optimizing the model.\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingDynamic\",\n", - " max_trials=200,\n", - " metrics=[tune_metric],\n", + "trainer_dynamic.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"dynamic\",\n", ")\n", "\n", "# run quantization\n", diff --git a/docs/tutorials/pytorch/summarization/pegasus-samsum.ipynb b/docs/tutorials/pytorch/summarization/pegasus-samsum.ipynb index 4c66e32752a..ae599745a0d 100644 --- a/docs/tutorials/pytorch/summarization/pegasus-samsum.ipynb +++ b/docs/tutorials/pytorch/summarization/pegasus-samsum.ipynb @@ -110,7 +110,8 @@ "from datasets import load_dataset, load_metric\n", "\n", "from filelock import FileLock\n", - "from intel_extension_for_transformers.transformers import OptimizedModel, QuantizationConfig\n", + "from intel_extension_for_transformers.transformers import OptimizedModel\n", + "from neural_compressor.config import PostTrainingQuantConfig\n", "from intel_extension_for_transformers.transformers import metrics as nlp_metrics\n", "from intel_extension_for_transformers.transformers.trainer import NLPSeq2SeqTrainer\n", "from transformers import (\n", @@ -277,9 +278,9 @@ " metadata={\"help\": \"Whether or not to apply quantization.\"},\n", " )\n", " quantization_approach: Optional[str] = field(\n", - " default=\"PostTrainingStatic\",\n", - " metadata={\"help\": \"Quantization approach. Supported approach are PostTrainingStatic, \"\n", - " \"PostTrainingDynamic and QuantizationAwareTraining.\"},\n", + " default=\"static\",\n", + " metadata={\"help\": \"Quantization approach. Supported approach are static, \"\n", + " \"dynamic and qat.\"},\n", " )\n" ] }, @@ -631,10 +632,9 @@ "tune_metric = nlp_metrics.Metric(\n", " name=metric_name, is_relative=True, criterion=0.25\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingDynamic\",\n", - " max_trials=200,\n", - " metrics=[tune_metric],\n", + "trainer.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"dynamic\",\n", ")\n", "trainer.max_length = max_length\n", "trainer.num_beams = num_beams\n", diff --git a/docs/tutorials/pytorch/text-classification/bert-base-uncased-MRPC.ipynb b/docs/tutorials/pytorch/text-classification/bert-base-uncased-MRPC.ipynb index 4855c46ccec..a4f13fad850 100644 --- a/docs/tutorials/pytorch/text-classification/bert-base-uncased-MRPC.ipynb +++ b/docs/tutorials/pytorch/text-classification/bert-base-uncased-MRPC.ipynb @@ -113,7 +113,8 @@ "import transformers\n", "from dataclasses import dataclass, field\n", "from datasets import load_dataset, load_metric\n", - "from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig\n", + "from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel\n", + "from neural_compressor.config import PostTrainingQuantConfig\n", "from intel_extension_for_transformers.transformers.trainer import NLPTrainer\n", "from transformers import (\n", " AutoConfig,\n", @@ -247,9 +248,9 @@ " metadata={\"help\": \"Whether or not to apply quantization.\"},\n", " )\n", " quantization_approach: Optional[str] = field(\n", - " default=\"PostTrainingStatic\",\n", - " metadata={\"help\": \"Quantization approach. Supported approach are PostTrainingStatic, \"\n", - " \"PostTrainingDynamic and QuantizationAwareTraining.\"},\n", + " default=\"static\",\n", + " metadata={\"help\": \"Quantization approach. Supported approach are static, \"\n", + " \"dynamic and qat.\"},\n", " )\n", " is_relative: Optional[bool] = field(\n", " default=True,\n", @@ -296,7 +297,7 @@ ")\n", "optim_args = OptimizationArguments(\n", " tune=True,\n", - " quantization_approach=\"PostTrainingStatic\"\n", + " quantization_approach=\"static\"\n", ")\n", "log_level = training_args.get_process_log_level()\n", "logger.setLevel(log_level)" @@ -532,11 +533,9 @@ " name=metric_name, is_relative=True, criterion=0.25\n", ")\n", "objective = objectives.performance\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingStatic\",\n", - " max_trials=600,\n", - " metrics=[tune_metric],\n", - " objectives=[objective]\n", + "trainer_static.metrics = metrics\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"static\",\n", ")\n", "trainer_static.quantize(quant_config=quantization_config)" ] @@ -642,11 +641,9 @@ " name=metric_name, is_relative=True, criterion=0.25\n", ")\n", "objective = objectives.performance\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingDynamic\",\n", - " max_trials=600,\n", - " metrics=[tune_metric],\n", - " objectives=[objective]\n", + "trainer_dynamic.metrics = metrics\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"dynamic\",\n", ")\n", "trainer_dynamic.quantize(quant_config=quantization_config)" ] diff --git a/docs/tutorials/pytorch/token-classification/distilbert_base_ner.ipynb b/docs/tutorials/pytorch/token-classification/distilbert_base_ner.ipynb index 82b6ecbe4ce..8d43eb95e30 100644 --- a/docs/tutorials/pytorch/token-classification/distilbert_base_ner.ipynb +++ b/docs/tutorials/pytorch/token-classification/distilbert_base_ner.ipynb @@ -108,8 +108,8 @@ "from intel_extension_for_transformers.transformers import(\n", " metrics,\n", " OptimizedModel,\n", - " QuantizationConfig,\n", ")\n", + "from neural_compressor.config import PostTrainingQuantConfig\n", "from intel_extension_for_transformers.transformers.trainer import NLPTrainer\n", "from transformers import (\n", " AutoConfig,\n", @@ -559,9 +559,9 @@ "tune_metric = metrics.Metric(\n", " name=metric_name, is_relative=True, criterion=0.25\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingStatic\",\n", - " metrics=[tune_metric],\n", + "trainer_static.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"static\",\n", ")\n", "trainer_static.quantize(quantization_config)" ] @@ -661,9 +661,9 @@ "tune_metric = metrics.Metric(\n", " name=metric_name, is_relative=True, criterion=0.25\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingDynamic\",\n", - " metrics=[tune_metric],\n", + "trainer_dynamic.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"dynamic\",\n", ")\n", "trainer_dynamic.quantize(quantization_config)" ] diff --git a/docs/tutorials/pytorch/translation/t5-small.ipynb b/docs/tutorials/pytorch/translation/t5-small.ipynb index b10ee380c09..9356c5214ec 100644 --- a/docs/tutorials/pytorch/translation/t5-small.ipynb +++ b/docs/tutorials/pytorch/translation/t5-small.ipynb @@ -108,7 +108,8 @@ "import numpy as np\n", "from datasets import load_dataset, load_metric\n", "\n", - "from intel_extension_for_transformers.transformers import OptimizedModel, QuantizationConfig\n", + "from intel_extension_for_transformers.transformers import OptimizedModel\n", + "from neural_compressor.config import PostTrainingQuantConfig\n", "from intel_extension_for_transformers.transformers import metrics as nlp_metrics\n", "from intel_extension_for_transformers.transformers.trainer import NLPSeq2SeqTrainer\n", "import transformers\n", @@ -510,10 +511,9 @@ "tune_metric = nlp_metrics.Metric(\n", " name=metric_name, is_relative=True, criterion=0.25\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"PostTrainingDynamic\",\n", - " max_trials=200,\n", - " metrics=[tune_metric],\n", + "trainer.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"dynamic\",\n", ")\n", "trainer.max_length = max_length\n", "trainer.num_beams = num_beams\n", diff --git a/intel_extension_for_transformers/transformers/optimizer.py b/intel_extension_for_transformers/transformers/optimizer.py index db1eeb6a973..6b47b5aa802 100644 --- a/intel_extension_for_transformers/transformers/optimizer.py +++ b/intel_extension_for_transformers/transformers/optimizer.py @@ -26,13 +26,22 @@ Quantization, Pruning, ) +from neural_compressor.training import prepare_compression +from neural_compressor.quantization import fit +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, +) from neural_compressor.experimental.scheduler import Scheduler from intel_extension_for_transformers.transformers import( DistillationConfig, Provider, - QuantizationConfig, PruningConfig ) +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, +) from intel_extension_for_transformers.transformers.utils.utility import LazyImport from intel_extension_for_transformers.transformers.quantization import QuantizationMode from transformers import PreTrainedModel, PretrainedConfig @@ -214,38 +223,6 @@ def calib_dataloader(self, dataloader): else: self._calib_dataloader = dataloader - def init_quantizer( - self, - quant_config, - provider: str = Provider.INC.value, - ): - """Init a Quantization object with config. - - Args: - quant_config: quantization config. - provider: define the quantization provider. - """ - from neural_compressor.experimental import Quantization - - assert isinstance(quant_config, QuantizationConfig), \ - "Please pass QuantizationConfig instance to trainer.quantize!" - self.quant_config = quant_config - self.metrics = self.quant_config.metrics - self._provider = Provider[provider.upper()].value - - if self.quant_config.framework == "pytorch": - if self.quant_config.approach == \ - QuantizationMode.POSTTRAININGDYNAMIC.value: - self.quant_config.framework = "pytorch" - else: - self.quant_config.framework = "pytorch_fx" - - quantizer = Quantization(self.quant_config.inc_config) - quantizer.model = common.Model(self.model) - - self.quantizer = quantizer - return quantizer - def _inc_quantize( self, quant_config, @@ -258,22 +235,28 @@ def _inc_quantize( self.quantizer.eval_func = self._eval_func if self._calib_func is not None: self.quantizer.calib_func = self._calib_func - if self.quant_config.approach == QuantizationMode.POSTTRAININGSTATIC.value: - assert self._calib_dataloader is not None, \ - "Please pass calib_dataloader to NoTrainerOptimizer.calib_dataloader" - self.quantizer.calib_dataloader = self._calib_dataloader - elif self.quant_config.approach == QuantizationMode.QUANTIZATIONAWARETRAINING.value: - assert self._train_func is not None, \ - "Please pass train_func to NoTrainerOptimizer.train_func" - self.quantizer.q_func = self._train_func - self.opt_model = self.quantizer.fit() + if isinstance(quant_config, PostTrainingQuantConfig): + if quant_config.backend == "ipex": + self.model_config = self.model.config # jit model will loss config + if self._calib_dataloader is None: + self._calib_dataloader = self.get_train_dataloader() + self.opt_model = fit(self.model, + conf=quant_config, + calib_dataloader=self._calib_dataloader, + eval_func=self._eval_func) + else: + compression_manager = prepare_compression(self.model, quant_config) + compression_manager.callbacks.on_train_begin() + self.train() + compression_manager.callbacks.on_train_end() + self.opt_model = compression_manager.model self.enable_inc_quant = True - self.save_model(self.output_dir) + self.save_model(self.args.output_dir) return self.opt_model.model def quantize( self, - quant_config: QuantizationConfig = None, + quant_config: Union[PostTrainingQuantConfig, QuantizationAwareTrainingConfig] = None, provider: str = Provider.INC.value, eval_func: Optional[Callable] = None, train_func: Optional[Callable] = None, diff --git a/tests/CI/test_quantization_qa_ipex.py b/tests/CI/test_quantization_qa_ipex.py index 67e75a45bd5..0e9dd9a78ad 100644 --- a/tests/CI/test_quantization_qa_ipex.py +++ b/tests/CI/test_quantization_qa_ipex.py @@ -43,7 +43,7 @@ def test_run_qa_ipex(self): --model_name_or_path bert-large-uncased-whole-word-masking-finetuned-squad --dataset_name squad --tune - --quantization_approach PostTrainingStatic + --quantization_approach static --do_train --do_eval --max_eval_samples 100 @@ -62,7 +62,7 @@ def test_run_qa_ipex(self): run_qa.py --model_name_or_path bert-large-uncased-whole-word-masking-finetuned-squad --dataset_name squad - --quantization_approach PostTrainingStatic + --quantization_approach static --do_train --do_eval --max_eval_samples 100 From 806fa0bc03d2de0d424927f8ec6219733b8e750d Mon Sep 17 00:00:00 2001 From: changwangss Date: Fri, 14 Jun 2024 02:42:10 -0700 Subject: [PATCH 08/22] aimprove deployment examples Signed-off-by: changwangss --- .../quantization/run_tuning.sh | 2 +- .../language-modeling/quantization/run_clm.py | 20 +-- .../language-modeling/quantization/run_mlm.py | 21 +-- .../language-modeling/quantization/run_plm.py | 20 +-- .../pytorch/optimization_README.md | 2 +- .../squad/bert_large/run_bert_large.sh | 2 +- .../deployment/squad/bert_large/run_qa.py | 56 +++++-- .../squad/ipex/bert_large/run_bert_large.sh | 2 +- .../squad/ipex/bert_large/run_qa.py | 25 ++- .../distilbert_base_uncased/run_distilbert.sh | 2 +- .../ipex/distilbert_base_uncased/run_qa.py | 26 ++- .../run_distilbert_sparse.sh | 2 +- .../distilbert_base_uncased_sparse/run_qa.py | 25 ++- .../length_adaptive_transformer/README.md | 2 +- .../length_adaptive_transformer/run_LAT.sh | 2 +- .../length_adaptive_transformer/run_qa.py | 23 ++- .../distilbert_base_uncased/run_emotion.py | 56 +++++-- .../distilbert_base_uncased/run_emotion.sh | 2 +- .../mrpc/bert_base/run_bert_base.sh | 2 +- .../deployment/mrpc/bert_base/run_glue.py | 48 ++++-- .../bert_base_cased/run_bert_base_cased.sh | 2 +- .../mrpc/bert_base_cased/run_glue.py | 48 ++++-- .../mrpc/bert_mini/run_bert_mini.sh | 2 +- .../deployment/mrpc/bert_mini/run_glue.py | 49 ++++-- .../run_distilbert_base.sh | 2 +- .../mrpc/distilbert_base_uncased/run_glue.py | 49 ++++-- .../deployment/mrpc/roberta_base/run_glue.py | 49 ++++-- .../mrpc/roberta_base/run_roberta_base.sh | 2 +- .../sst2/bert_mini/run_bert_mini.sh | 2 +- .../deployment/sst2/bert_mini/run_glue.py | 49 ++++-- .../run_distilbert_base.sh | 2 +- .../sst2/distilbert_base_uncased/run_glue.py | 49 ++++-- .../sst2/minilm_l6_h384_uncased/run_glue.py | 48 ++++-- .../sst2/minilm_l6_h384_uncased/run_minilm.sh | 2 +- .../deployment/mteb/bge/run_bge.sh | 2 +- .../deployment/mteb/bge/run_mteb.py | 50 ++++-- .../quantization/run_tuning.sh | 2 +- .../text2text-generation/run_tuning.sh | 2 +- tests/CI/test_quantization.py | 155 +++++------------- workflows/dlsa/run_dlsa.py | 14 +- .../src/infer_itrex.py | 14 +- 41 files changed, 502 insertions(+), 432 deletions(-) diff --git a/examples/huggingface/pytorch/code-generation/quantization/run_tuning.sh b/examples/huggingface/pytorch/code-generation/quantization/run_tuning.sh index 524a5e8d46d..0a793301dbb 100644 --- a/examples/huggingface/pytorch/code-generation/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/code-generation/quantization/run_tuning.sh @@ -16,7 +16,7 @@ function init_params { model_name_or_path="bigcode/starcoder" extra_cmd="" batch_size=8 - approach="PostTrainingStatic" + approach="static" alpha=0.5 script="run_generation.py" for var in "$@" diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py b/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py index 883d2468c68..9a9637785ec 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_clm.py @@ -583,29 +583,23 @@ def compute_metrics(eval_preds): greater_is_better=False ) trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) if optim_args.quantization_approach != "qat": - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = PostTrainingQuantConfig( approach=optim_args.quantization_approach, tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion ) else: - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = QuantizationAwareTrainingConfig( tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion - ) + ) early_stopping_patience = 2 early_stopping_threshold = 0.001 # optional trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py b/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py index 15bdc445990..ea78bdd0e08 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_mlm.py @@ -602,29 +602,24 @@ def compute_metrics(eval_preds): criterion=optim_args.perf_tol, greater_is_better=False ) + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) if optim_args.quantization_approach != "qat": - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = PostTrainingQuantConfig( approach=optim_args.quantization_approach, tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion ) else: - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = QuantizationAwareTrainingConfig( tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion - ) + ) early_stopping_patience = 2 early_stopping_threshold = 0.001 # optional trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py b/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py index be104b5a701..4550de43e69 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_plm.py @@ -549,29 +549,23 @@ def group_texts(examples): greater_is_better=False ) trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) if optim_args.quantization_approach != "qat": - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = PostTrainingQuantConfig( approach=optim_args.quantization_approach, tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion ) else: - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = QuantizationAwareTrainingConfig( tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion - ) + ) early_stopping_patience = 2 early_stopping_threshold = 0.001 # optional trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ diff --git a/examples/huggingface/pytorch/optimization_README.md b/examples/huggingface/pytorch/optimization_README.md index 2bafa814908..3d1909b01a6 100644 --- a/examples/huggingface/pytorch/optimization_README.md +++ b/examples/huggingface/pytorch/optimization_README.md @@ -4,7 +4,7 @@ Welcome to Pytorch Huggingface examples. The examples is following from [Hugging ## Quantization approach -| Task | PostTrainingDynamic | PostTrainingStatic | QuantizationAwareTraining +| Task | dynamic | static | qat |---|:---:|:---:|:---:| |**`language-modeling`**| ✅ | ✅ | ✅ |**`multi-choice`**| ✅ | ✅ | ✅ diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_bert_large.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_bert_large.sh index 5c65ca50e0b..017b7a2efd3 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_bert_large.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_bert_large.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_qa.py index 4ce35df134d..39bb8c074ac 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_qa.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -211,9 +217,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -646,25 +652,43 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], - ) + trainer.metrics = tune_metric + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: @@ -674,7 +698,7 @@ def compute_metrics(p: EvalPrediction): max_eval_samples = data_args.max_eval_samples \ if data_args.max_eval_samples is not None else len(eval_dataset) eval_samples = min(max_eval_samples, len(eval_dataset)) - samples = eval_samples - (eval_samples % batch_size) \ + samples = eval_samples - (eval_samples % training_args.per_device_eval_batch_size) \ if training_args.dataloader_drop_last else eval_samples logger.info("metrics keys: {}".format(results.keys())) bert_task_acc_keys = ['eval_f1', 'eval_accuracy', 'eval_matthews_correlation', diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_bert_large.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_bert_large.sh index 7f3253746ab..0d93e12079b 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_bert_large.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_bert_large.sh @@ -121,7 +121,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'fp32' ]]; then mode_cmd=$mode_cmd" --fp32" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_qa.py index d34418e0dd8..46122402c6e 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_qa.py @@ -26,7 +26,8 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel +from neural_compressor.config import PostTrainingQuantConfig from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -211,9 +212,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -640,27 +641,21 @@ def compute_metrics(p: EvalPrediction): trainer.save_model(training_args.output_dir) trainer.calib_dataloader = trainer.get_eval_dataloader() - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( + trainer.metrics = tune_metric + quantization_config = PostTrainingQuantConfig( + backend="ipex", approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], - use_bf16=False + excluded_precisions=["bf16"] ) - quantization_config.framework = "pytorch_ipex" model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_distilbert.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_distilbert.sh index 1c0ca172eba..d0d2bbb9db7 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_distilbert.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_distilbert.sh @@ -121,7 +121,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'fp32' ]]; then mode_cmd=$mode_cmd" --fp32" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_qa.py index 9417cf4f65f..46122402c6e 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_qa.py @@ -26,7 +26,8 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel +from neural_compressor.config import PostTrainingQuantConfig from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -211,9 +212,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -640,28 +641,21 @@ def compute_metrics(p: EvalPrediction): trainer.save_model(training_args.output_dir) trainer.calib_dataloader = trainer.get_eval_dataloader() - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - - elif optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( + trainer.metrics = tune_metric + quantization_config = PostTrainingQuantConfig( + backend="ipex", approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], - use_bf16=False + excluded_precisions=["bf16"] ) - quantization_config.framework = "pytorch_ipex" model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_distilbert_sparse.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_distilbert_sparse.sh index 3e82836a0d2..7621827eef9 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_distilbert_sparse.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_distilbert_sparse.sh @@ -121,7 +121,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'fp32' ]]; then mode_cmd=$mode_cmd" --fp32" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_qa.py index 25c51b01192..1c250201c9d 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_qa.py @@ -26,7 +26,8 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel +from neural_compressor.config import PostTrainingQuantConfig from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -211,9 +212,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -640,27 +641,21 @@ def compute_metrics(p: EvalPrediction): trainer.save_model(training_args.output_dir) trainer.calib_dataloader = trainer.get_eval_dataloader() - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - elif optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( + trainer.metrics = tune_metric + quantization_config = PostTrainingQuantConfig( + backend="ipex", approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], - use_bf16=False + excluded_precisions=["bf16"], ) - quantization_config.framework = "pytorch_ipex" model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/README.md b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/README.md index d7082e1194a..98f9050cdc5 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/README.md +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/README.md @@ -76,7 +76,7 @@ python run_qa.py --model_name_or_path "sguskin/dynamic-minilmv2-L6-H384-squad1.1 For INT8: ```shell -python run_qa.py --model_name_or_path "sguskin/dynamic-minilmv2-L6-H384-squad1.1" --dataset_name squad --do_train --do_eval --output_dir model_and_tokenizer --overwrite_output_dir --length_config "(269, 253, 252, 202, 104, 34)" --overwrite_cache --to_onnx --tune --quantization_approach PostTrainingStatic +python run_qa.py --model_name_or_path "sguskin/dynamic-minilmv2-L6-H384-squad1.1" --dataset_name squad --do_train --do_eval --output_dir model_and_tokenizer --overwrite_output_dir --length_config "(269, 253, 252, 202, 104, 34)" --overwrite_cache --to_onnx --tune --quantization_approach static ``` For BF16: diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_LAT.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_LAT.sh index 163c8894cf7..a2119fd1dc3 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_LAT.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_LAT.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_qa.py index eb41bf85a32..81209b7d4f7 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_qa.py @@ -29,7 +29,8 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig, DynamicLengthConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel, DynamicLengthConfig +from neural_compressor.config import PostTrainingQuantConfig from trainer_qa import QuestionAnsweringTrainer from intel_extension_for_transformers.transformers.modeling.modeling_roberta_dynamic import RobertaForQuestionAnswering @@ -221,9 +222,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -780,24 +781,20 @@ def compute_metrics(p: EvalPrediction): trainer.save_model(training_args.output_dir) trainer.calib_dataloader = trainer.get_eval_dataloader() - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( + trainer.metrics = tune_metric + quantization_config = PostTrainingQuantConfig( + backend="ipex", approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], + excluded_precision=["bf16"] ) model = trainer.quantize(quant_config=quantization_config) diff --git a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py index 720e4109657..d599c564647 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py +++ b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -198,9 +204,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -521,27 +527,43 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] - ) + trainer.metrics = tune_metric + if optim_args.quantization_approach != "qat": + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.sh b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.sh index 57cee9c4494..79c91ee5b18 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.sh @@ -121,7 +121,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_bert_base.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_bert_base.sh index f2e133f1d9e..d1648a0c661 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_bert_base.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_bert_base.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_glue.py index eb8e47583e0..7267b845f98 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_glue.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -197,9 +203,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -524,27 +530,37 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_bert_base_cased.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_bert_base_cased.sh index 4daabbfe41a..cca1268e646 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_bert_base_cased.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_bert_base_cased.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_glue.py index 9374620302a..c68d3527abc 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_glue.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -197,9 +203,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -524,27 +530,37 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_bert_mini.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_bert_mini.sh index 6e9db50fddd..fa9f005fa54 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_bert_mini.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_bert_mini.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_glue.py index eb8e47583e0..6e3bc04cd0d 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_glue.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -197,9 +203,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -524,27 +530,36 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_distilbert_base.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_distilbert_base.sh index 8c75385ea5b..b20cffed3b5 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_distilbert_base.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_distilbert_base.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_glue.py index eb8e47583e0..6e3bc04cd0d 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_glue.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -197,9 +203,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -524,27 +530,36 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_glue.py index efc762b5c59..6f899f98ed4 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_glue.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -197,9 +203,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -524,27 +530,36 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_roberta_base.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_roberta_base.sh index 37110ee356c..4228e299003 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_roberta_base.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_roberta_base.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_bert_mini.sh b/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_bert_mini.sh index 4a5a986fdc1..d756a945cf6 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_bert_mini.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_bert_mini.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_glue.py index efc762b5c59..6f899f98ed4 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_glue.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -197,9 +203,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -524,27 +530,36 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_distilbert_base.sh b/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_distilbert_base.sh index d2be2d43c50..962a0044ca0 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_distilbert_base.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_distilbert_base.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_glue.py index eb8e47583e0..6e3bc04cd0d 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_glue.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -197,9 +203,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -524,27 +530,36 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_glue.py index 4400593f0c2..9eaa0cb0ecd 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_glue.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -197,9 +203,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -524,27 +530,37 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_minilm.sh b/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_minilm.sh index 20417a96738..31f6033ce6e 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_minilm.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_minilm.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_bge.sh b/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_bge.sh index 8c24dbcffef..5b62734d906 100644 --- a/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_bge.sh +++ b/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_bge.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_mteb.py b/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_mteb.py index 557524c6590..225c8012b34 100644 --- a/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_mteb.py +++ b/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_mteb.py @@ -28,7 +28,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( @@ -201,9 +207,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -571,28 +577,36 @@ def preprocess_function(example): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) - tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective], - sampling_size = len(train_dataset)//20 + trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) stmodel = SentenceTransformer(model_args.model_name_or_path) def eval_func(model): diff --git a/examples/huggingface/pytorch/text-generation/quantization/run_tuning.sh b/examples/huggingface/pytorch/text-generation/quantization/run_tuning.sh index 16eaaa3182e..7c3919a132a 100644 --- a/examples/huggingface/pytorch/text-generation/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/text-generation/quantization/run_tuning.sh @@ -16,7 +16,7 @@ function init_params { model_name_or_path="EleutherAI/gpt-j-6b" extra_cmd="" batch_size=8 - approach="PostTrainingStatic" + approach="static" script="run_generation_sq.py" alpha=0.5 weight_dtype="int4" diff --git a/examples/huggingface/pytorch/text2text-generation/run_tuning.sh b/examples/huggingface/pytorch/text2text-generation/run_tuning.sh index 3d35086f578..826469b1b3c 100644 --- a/examples/huggingface/pytorch/text2text-generation/run_tuning.sh +++ b/examples/huggingface/pytorch/text2text-generation/run_tuning.sh @@ -16,7 +16,7 @@ function init_params { model_name_or_path="google/flan-t5-large" extra_cmd="" batch_size=8 - approach="PostTrainingStatic" + approach="static" alpha=0.7 for var in "$@" do diff --git a/tests/CI/test_quantization.py b/tests/CI/test_quantization.py index e3c2799e94f..dce618d7845 100644 --- a/tests/CI/test_quantization.py +++ b/tests/CI/test_quantization.py @@ -23,12 +23,15 @@ import unittest from intel_extension_for_transformers.transformers import ( metrics, - objectives, OptimizedModel, - QuantizationConfig, - QuantizationMode, NoTrainerOptimizer, ) +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from intel_extension_for_transformers.transformers.trainer import NLPSeq2SeqTrainer from intel_extension_for_transformers.transformers.utils import CpuInfo @@ -107,116 +110,44 @@ def tearDownClass(self): def test_fx_model_quant(self): fp32_output = self.trainer.predict(self.dummy_dataset).predictions - for mode in QuantizationMode: - print("Quantization approach:", mode.value) - self.trainer = NLPTrainer( - model=self.model, - train_dataset=self.dummy_dataset, - eval_dataset=self.dummy_dataset, - ) - - # Check fp32 jit and onnx model, only once. - if mode == QuantizationMode.POSTTRAININGSTATIC: - jit_model = self.trainer.export_to_jit() - self.trainer.export_to_onnx('fp32-model.onnx') - self.assertTrue(check_onnx('fp32-model.onnx', self.trainer.get_eval_dataloader())) - - self.trainer.benchmark(num_of_instance=1) - tune_metric = metrics.Metric( - name="eval_loss", greater_is_better=False, is_relative=False, criterion=0.5 - ) - quantization_config = QuantizationConfig( - approach=mode.name, - metrics=[tune_metric], - objectives=[objectives.performance] - ) - quantized_model = self.trainer.quantize(quant_config=quantization_config, provider="inc") - self.trainer.benchmark(self.trainer.args.output_dir, num_of_instance=1) - # By default, model will be saved into tmp_trainer dir. - self.trainer.save_model('./quantized_model') - - # Check int8 onnx model - if mode == QuantizationMode.POSTTRAININGSTATIC: - # test different configure to improve UT coverage - self.trainer.export_to_onnx( - save_path=None, - quant_format='Qlinear', - dtype='S8S8', - opset_version=13, - ) - self.assertTrue(check_onnx('./tmp_trainer/int8-model.onnx', self.trainer.get_eval_dataloader())) - else: - self.trainer.export_to_onnx('int8-model.onnx') - self.assertTrue(check_onnx('int8-model.onnx', self.trainer.get_eval_dataloader())) - - if mode == QuantizationMode.QUANTIZATIONAWARETRAINING: - model = onnx.load('int8-model.onnx') - tensor_list = {tensor.name:tensor for tensor in model.graph.initializer} - torch_data = quantized_model.classifier.state_dict()\ - ['module._packed_params._packed_params'][0].\ - dequantize().detach().cpu().numpy().T - from onnx.numpy_helper import to_array - onnx_data = to_array(tensor_list['classifier.weight_quantized']) - onnx_scale = to_array(tensor_list['classifier.weight_scale']) - self.assertTrue(np.allclose(torch_data, onnx_data * onnx_scale, atol=0.001)) - # Check quantized model - output_1 = self.trainer.predict(self.dummy_dataset).predictions - loaded_model = OptimizedModel.from_pretrained( - './quantized_model', - ) - self.trainer.model = loaded_model - output_2 = self.trainer.predict(self.dummy_dataset).predictions - self.assertTrue((fp32_output != output_1).any()) - - # check loaded model - self.assertTrue((output_1 == output_2).all()) - - def test_fx_model_with_smooth_quant(self): - def eval_func(model): - return 1 - - def train_func(model): - return model - - trainer = NLPTrainer( + self.trainer = NLPTrainer( model=self.model, train_dataset=self.dummy_dataset, eval_dataset=self.dummy_dataset, ) - tune_metric = metrics.Metric( - name="eval_loss", greater_is_better=False, is_relative=False, criterion=0.5 + jit_model = self.trainer.export_to_jit() + self.trainer.export_to_onnx('fp32-model.onnx') + self.assertTrue(check_onnx('fp32-model.onnx', self.trainer.get_eval_dataloader())) + + self.trainer.benchmark(num_of_instance=1) + + quantization_config = PostTrainingQuantConfig( + approach="static", ) - quantization_config = QuantizationConfig( - approach="PostTrainingStatic", - metrics=[tune_metric], - objectives=[objectives.performance], - recipes={"smooth_quant": True, - "smooth_quant_args": {"alpha": 0.6}, - } + quantized_model = self.trainer.quantize(quant_config=quantization_config, provider="inc") + self.trainer.benchmark(self.trainer.args.output_dir, num_of_instance=1) + # By default, model will be saved into tmp_trainer dir. + self.trainer.save_model('./quantized_model') + # test different configure to improve UT coverage + self.trainer.export_to_onnx( + save_path=None, + quant_format='Qlinear', + dtype='S8S8', + opset_version=13, ) - recipes = quantization_config.recipes - self.assertTrue(recipes["smooth_quant"]) - quantized_model = trainer.quantize(quant_config=quantization_config) - self.assertTrue("quantize" in str(type(quantized_model.classifier.module))) - quantization_config = QuantizationConfig( - approach="PostTrainingStatic", - metrics=[tune_metric], - objectives=[objectives.performance], - recipes={} + self.assertTrue(check_onnx('./tmp_trainer/int8-model.onnx', self.trainer.get_eval_dataloader())) + # Check quantized model + output_1 = self.trainer.predict(self.dummy_dataset).predictions + loaded_model = OptimizedModel.from_pretrained( + './quantized_model', ) - quantized_model = trainer.quantize(quant_config=quantization_config, - train_func=train_func, - eval_func=eval_func) - self.assertTrue("quantize" in str(type(quantized_model.classifier.module))) - - with self.assertRaises(ValueError): - quantization_config = QuantizationConfig( - approach="PostTrainingStatic", - metrics=[tune_metric], - objectives=[objectives.performance], - recipes=[] - ) + self.trainer.model = loaded_model + output_2 = self.trainer.predict(self.dummy_dataset).predictions + self.assertTrue((fp32_output != output_1).any()) + + # check loaded model + self.assertTrue((output_1 == output_2).all()) def test_functional_quant(self): def eval_func(model): @@ -226,9 +157,8 @@ def train_func(model): return model self.trainer = NLPTrainer(self.model, train_dataset=self.dummy_dataset) - quantization_config = QuantizationConfig( - approach='PostTrainingStatic', - objectives=[objectives.performance] + quantization_config = PostTrainingQuantConfig( + approach='static', ) self.trainer.quantize(quant_config=quantization_config, provider="inc", @@ -242,13 +172,8 @@ def eval_func(model): def train_func(model): return model - tune_metric = metrics.Metric( - name="eval_loss", greater_is_better=False, is_relative=False, criterion=0.5 - ) - quantization_config = QuantizationConfig( - approach='PostTrainingStatic', - metrics=[tune_metric], - objectives=[objectives.performance] + quantization_config = PostTrainingQuantConfig( + approach='static', ) self.optimizer.eval_func = eval_func self.optimizer.train_func = train_func diff --git a/workflows/dlsa/run_dlsa.py b/workflows/dlsa/run_dlsa.py index 583e37847ea..92d6827998d 100644 --- a/workflows/dlsa/run_dlsa.py +++ b/workflows/dlsa/run_dlsa.py @@ -39,10 +39,10 @@ ) from intel_extension_for_transformers.transformers import ( OptimizedModel, - QuantizationConfig, metrics, objectives, ) +from neural_compressor.config import PostTrainingQuantConfig, TuningCriterion from intel_extension_for_transformers.transformers.trainer import NLPTrainer hf_logging.set_verbosity_info() @@ -288,12 +288,12 @@ def preprocess(examples): if args.do_quantize: with track("Quantize"): metric = metrics.Metric(name="eval_acc", is_relative=True, criterion=0.01) - q_config = QuantizationConfig( - framework="pytorch_ipex", - approach="PostTrainingStatic", - max_trials=200, # set the Max tune times - metrics=[metric], - objectives=[objectives.performance], + trainer.metrics = metric + tuning_criterion = TuningCriterion(max_trials=600) + q_config = PostTrainingQuantConfig( + backend="ipex", + approach="static", + tuning_criterion=tuning_criterion ) def eval_func(model): diff --git a/workflows/hf_finetuning_and_inference_nlp/src/infer_itrex.py b/workflows/hf_finetuning_and_inference_nlp/src/infer_itrex.py index b666c6f8bbc..3b6c743c485 100644 --- a/workflows/hf_finetuning_and_inference_nlp/src/infer_itrex.py +++ b/workflows/hf_finetuning_and_inference_nlp/src/infer_itrex.py @@ -17,7 +17,6 @@ import torch from os import path from intel_extension_for_transformers.transformers import ( - QuantizationConfig, metrics, objectives, ) @@ -29,7 +28,7 @@ DataCollatorWithPadding, Trainer, ) - +from neural_compressor.config import PostTrainingQuantConfig, TuningCriterion from infer import DlsaInference from utils import PredsLabels, compute_metrics, save_performance_metrics @@ -76,12 +75,11 @@ def _load_model(self): ) metric = metrics.Metric(name="eval_acc", is_relative=True, criterion=0.03) - q_config = QuantizationConfig( - framework="pytorch", - approach="PostTrainingStatic", - max_trials=200, # set the Max tune times - metrics=[metric], - objectives=[objectives.performance], + self.trainer.metrics = metric + tuning_criterion = TuningCriterion(max_trials=200) + q_config = PostTrainingQuantConfig( + approach="static", + tuning_criterion=tuning_criterion, ) eval_dataloader = self.trainer.get_eval_dataloader() self.model = self.trainer.quantize( From 75b13d121516ac93fc93ba4697256db982c219ce Mon Sep 17 00:00:00 2001 From: changwangss Date: Fri, 14 Jun 2024 02:44:04 -0700 Subject: [PATCH 09/22] fix optimizer Signed-off-by: changwangss --- intel_extension_for_transformers/transformers/optimizer.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/intel_extension_for_transformers/transformers/optimizer.py b/intel_extension_for_transformers/transformers/optimizer.py index 6b47b5aa802..de952776ffa 100644 --- a/intel_extension_for_transformers/transformers/optimizer.py +++ b/intel_extension_for_transformers/transformers/optimizer.py @@ -229,8 +229,6 @@ def _inc_quantize( provider: str = Provider.INC.value, ): """Do the quantization.""" - if self.quantizer is None: - self.init_quantizer(quant_config=quant_config, provider=provider) if self._eval_func is not None: self.quantizer.eval_func = self._eval_func if self._calib_func is not None: From 773bd1b8a5559d8ff9bde8b88923958de473bea0 Mon Sep 17 00:00:00 2001 From: changwangss Date: Mon, 17 Jun 2024 01:55:11 -0700 Subject: [PATCH 10/22] migrate distillation pruning orchestration Signed-off-by: changwangss --- .../orchestrate_optimizations.ipynb | 45 +- .../orchestrate_optimizations_bert_mini.ipynb | 26 +- .../orchestrate_optimizations_bert_mini.ipynb | 30 +- .../orchestrate_optimizations/run_qa.py | 45 +- .../quantization/run_glue.py | 18 +- .../textual_inversion.py | 30 +- .../language-modeling/quantization/README.md | 63 -- .../quantization/ptq/requirements.txt | 7 - .../quantization/ptq/run_benchmark.sh | 119 --- .../quantization/ptq/run_tuning.sh | 115 --- .../language-modeling/quantization/run_clm.py | 814 ----------------- .../language-modeling/quantization/run_mlm.py | 848 ------------------ .../multiple-choice/quantization/README.md | 34 - .../quantization/requirements.txt | 6 - .../quantization/run_benchmark.sh | 101 --- .../multiple-choice/quantization/run_swag.py | 653 -------------- .../quantization/run_tuning.sh | 91 -- .../text-classification/pruning/README.md | 86 -- .../pruning/requirements.txt | 6 - .../pruning/run_benchmark.sh | 90 -- .../text-classification/pruning/run_glue.py | 689 -------------- .../text-classification/pruning/run_tuning.sh | 88 -- .../quantization/README.md | 132 --- .../quantization/ptq/requirements.txt | 7 - .../quantization/ptq/run_benchmark.sh | 131 --- .../quantization/ptq/run_tuning.sh | 115 --- .../quantization/run_glue.py | 731 --------------- .../quantization/README.md | 35 - .../quantization/requirements.txt | 7 - .../quantization/run_benchmark.sh | 129 --- .../quantization/run_ner.py | 696 -------------- .../quantization/run_tuning.sh | 104 --- .../transformers/__init__.py | 2 +- .../transformers/optimizer.py | 447 --------- .../transformers/trainer.py | 731 +++++++++++---- tests/Nightly/test_distillation.py | 85 +- .../Nightly/test_orchestrate_optimization.py | 56 +- tests/Nightly/test_pruning.py | 73 +- tests/Nightly/test_tf_distillation.py | 134 --- tests/Nightly/test_tf_pruning.py | 147 --- tests/Nightly/test_tf_quantization.py | 132 --- .../config/README.md | 4 +- .../config/config.yaml | 2 +- .../config/distillation_with_qat.yaml | 2 +- .../config/qat.yaml | 2 +- .../config/sat.yaml | 2 +- .../src/itrex_opt.py | 79 +- .../compression_aware_training/src/utils.py | 8 +- 48 files changed, 756 insertions(+), 7241 deletions(-) delete mode 100644 examples/huggingface/tensorflow/language-modeling/quantization/README.md delete mode 100644 examples/huggingface/tensorflow/language-modeling/quantization/ptq/requirements.txt delete mode 100644 examples/huggingface/tensorflow/language-modeling/quantization/ptq/run_benchmark.sh delete mode 100644 examples/huggingface/tensorflow/language-modeling/quantization/ptq/run_tuning.sh delete mode 100644 examples/huggingface/tensorflow/language-modeling/quantization/run_clm.py delete mode 100644 examples/huggingface/tensorflow/language-modeling/quantization/run_mlm.py delete mode 100644 examples/huggingface/tensorflow/multiple-choice/quantization/README.md delete mode 100644 examples/huggingface/tensorflow/multiple-choice/quantization/requirements.txt delete mode 100644 examples/huggingface/tensorflow/multiple-choice/quantization/run_benchmark.sh delete mode 100644 examples/huggingface/tensorflow/multiple-choice/quantization/run_swag.py delete mode 100644 examples/huggingface/tensorflow/multiple-choice/quantization/run_tuning.sh delete mode 100644 examples/huggingface/tensorflow/text-classification/pruning/README.md delete mode 100644 examples/huggingface/tensorflow/text-classification/pruning/requirements.txt delete mode 100644 examples/huggingface/tensorflow/text-classification/pruning/run_benchmark.sh delete mode 100644 examples/huggingface/tensorflow/text-classification/pruning/run_glue.py delete mode 100644 examples/huggingface/tensorflow/text-classification/pruning/run_tuning.sh delete mode 100644 examples/huggingface/tensorflow/text-classification/quantization/README.md delete mode 100644 examples/huggingface/tensorflow/text-classification/quantization/ptq/requirements.txt delete mode 100644 examples/huggingface/tensorflow/text-classification/quantization/ptq/run_benchmark.sh delete mode 100644 examples/huggingface/tensorflow/text-classification/quantization/ptq/run_tuning.sh delete mode 100644 examples/huggingface/tensorflow/text-classification/quantization/run_glue.py delete mode 100644 examples/huggingface/tensorflow/token-classification/quantization/README.md delete mode 100644 examples/huggingface/tensorflow/token-classification/quantization/requirements.txt delete mode 100644 examples/huggingface/tensorflow/token-classification/quantization/run_benchmark.sh delete mode 100644 examples/huggingface/tensorflow/token-classification/quantization/run_ner.py delete mode 100644 examples/huggingface/tensorflow/token-classification/quantization/run_tuning.sh delete mode 100644 intel_extension_for_transformers/transformers/optimizer.py delete mode 100644 tests/Nightly/test_tf_distillation.py delete mode 100644 tests/Nightly/test_tf_pruning.py delete mode 100644 tests/Nightly/test_tf_quantization.py diff --git a/docs/tutorials/pytorch/question-answering/orchestrate_optimizations.ipynb b/docs/tutorials/pytorch/question-answering/orchestrate_optimizations.ipynb index accba939b30..a70dd5a1ab5 100644 --- a/docs/tutorials/pytorch/question-answering/orchestrate_optimizations.ipynb +++ b/docs/tutorials/pytorch/question-answering/orchestrate_optimizations.ipynb @@ -74,13 +74,15 @@ "import transformers\n", "from intel_extension_for_transformers.transformers import (\n", " metrics,\n", - " PrunerConfig,\n", - " PruningConfig,\n", - " DistillationConfig,\n", - " QuantizationConfig,\n", " OptimizedModel,\n", " objectives\n", ")\n", + "from neural_compressor.config import (\n", + " WeightPruningConfig,\n", + " DistillationConfig,\n", + " KnowledgeDistillationLossConfig,\n", + " QuantizationAwareTrainingConfig,\n", + ")\n", "from torch.utils.data import DataLoader\n", "from tqdm import tqdm\n", "from trainer_qa import QuestionAnsweringTrainer\n", @@ -214,7 +216,7 @@ " metadata={\"help\": \"Whether or not to apply prune.\"},\n", " )\n", " pruning_approach: Optional[str] = field(\n", - " default=\"BasicMagnitude\",\n", + " default=\"magnitude\",\n", " metadata={\"help\": \"Pruning approach. Supported approach is basic_magnite.\"},\n", " )\n", " target_sparsity_ratio: Optional[float] = field(\n", @@ -234,9 +236,9 @@ " metadata={\"help\": \"Whether or not to apply quantization.\"},\n", " )\n", " quantization_approach: Optional[str] = field(\n", - " default=\"PostTrainingStatic\",\n", - " metadata={\"help\": \"Quantization approach. Supported approach are PostTrainingStatic, \"\n", - " \"PostTrainingDynamic and QuantizationAwareTraining.\"},\n", + " default=\"static\",\n", + " metadata={\"help\": \"Quantization approach. Supported approach are static, \"\n", + " \"dynamic and qat.\"},\n", " )\n", " metric_name: Optional[str] = field(\n", " default=None,\n", @@ -300,7 +302,7 @@ ")\n", "optim_args = OptimizationArguments(\n", " tune=True,\n", - " quantization_approach=\"PostTrainingStatic\"\n", + " quantization_approach=\"static\"\n", ")\n", "log_level = training_args.get_process_log_level()" ] @@ -730,9 +732,7 @@ "logger.info(\"***** Number of student model parameters: {:.2f}M *****\".format(\\\n", " para_counter(model)/10**6))\n", "\n", - "# Trace model\n", - "from neural_compressor.adaptor.torch_utils.symbolic_trace import symbolic_trace\n", - "model = symbolic_trace(model, optim_args.quantization_approach==\"QuantizationAwareTraining\")" + "# Trace model\n" ] }, { @@ -779,21 +779,18 @@ " tune_metric = metrics.Metric(\n", " name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol\n", " )\n", - " prune_type = 'PatternLock' \\\n", + " prune_type = 'pattern_lock' \\\n", " if optim_args.pruning_approach else optim_args.pruning_approach\n", " target_sparsity_ratio = optim_args.target_sparsity_ratio \\\n", " if optim_args.target_sparsity_ratio else None\n", - " pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio)\n", - " pruning_conf = PruningConfig(framework=\"pytorch_fx\",pruner_config=[pruner_config], metrics=tune_metric)\n", - " distillation_conf = DistillationConfig(framework=\"pytorch_fx\", metrics=tune_metric)\n", - "\n", - " objective = objectives.performance\n", - " quantization_conf = QuantizationConfig(\n", - " approach=optim_args.quantization_approach,\n", - " max_trials=600,\n", - " metrics=[tune_metric],\n", - " objectives=[objective]\n", - " )\n", + " trainer.metrics = tune_metric\n", + " pruning_conf = WeightPruningConfig([{\"start_step\": 0, \"end_step\": 2}],\n", + " target_sparsity=target_sparsity_ratio,\n", + " pruning_scope=\"local\",\n", + " pruning_type=prune_type)\n", + " distillation_criterion = KnowledgeDistillationLossConfig(loss_types=[\"CE\", \"KL\"])\n", + " distillation_conf = DistillationConfig(teacher_model=teacher_model, criterion=distillation_criterion)\n", + " quantization_conf = QuantizationAwareTrainingConfig()\n", " conf_list = [pruning_conf, distillation_conf, quantization_conf]\n", " model = trainer.orchestrate_optimizations(config_list=conf_list, teacher_model=teacher_model)" ] diff --git a/docs/tutorials/pytorch/question-answering/orchestrate_optimizations_bert_mini.ipynb b/docs/tutorials/pytorch/question-answering/orchestrate_optimizations_bert_mini.ipynb index b3a983f8d35..78b1258d580 100644 --- a/docs/tutorials/pytorch/question-answering/orchestrate_optimizations_bert_mini.ipynb +++ b/docs/tutorials/pytorch/question-answering/orchestrate_optimizations_bert_mini.ipynb @@ -78,6 +78,12 @@ " DataCollatorWithPadding,\n", " EvalPrediction,\n", ")\n", + "from neural_compressor.config import (\n", + " WeightPruningConfig,\n", + " DistillationConfig,\n", + " KnowledgeDistillationLossConfig,\n", + " QuantizationAwareTrainingConfig,\n", + ")\n", "from transformers.utils import check_min_version\n", "from transformers.utils.versions import require_version\n", "from typing import Optional\n", @@ -430,18 +436,14 @@ " name=metric_name, is_relative=True, criterion=0.01\n", ")\n", "\n", - "target_sparsity_ratio = None\n", - "pruner_config = PrunerConfig(prune_type='PatternLock', target_sparsity_ratio=None)\n", - "pruning_conf = PruningConfig(framework=\"pytorch_fx\",pruner_config=[pruner_config], metrics=tune_metric)\n", - "distillation_conf = DistillationConfig(framework=\"pytorch_fx\", metrics=tune_metric)\n", - "\n", - "objective = objectives.performance\n", - "quantization_conf = QuantizationConfig(\n", - " approach=\"QuantizationAwareTraining\",\n", - " max_trials=600,\n", - " metrics=[tune_metric],\n", - " objectives=[objective]\n", - ")\n", + "trainer.metrics = tune_metric\n", + "pruning_conf = WeightPruningConfig([{\"start_step\": 0, \"end_step\": 2}],\n", + " target_sparsity=0.64,\n", + " pruning_scope=\"local\",\n", + " pruning_type=\"pattern_lock\")\n", + "distillation_criterion = KnowledgeDistillationLossConfig(loss_types=[\"CE\", \"KL\"])\n", + "distillation_conf = DistillationConfig(teacher_model=teacher_model, criterion=distillation_criterion)\n", + "quantization_conf = QuantizationAwareTrainingConfig()\n", "conf_list = [pruning_conf, distillation_conf, quantization_conf]\n", "model = trainer.orchestrate_optimizations(config_list=conf_list, teacher_model=teacher_model)" ] diff --git a/docs/tutorials/pytorch/text-classification/orchestrate_optimizations_bert_mini.ipynb b/docs/tutorials/pytorch/text-classification/orchestrate_optimizations_bert_mini.ipynb index e533ab555f9..ffbd067af30 100644 --- a/docs/tutorials/pytorch/text-classification/orchestrate_optimizations_bert_mini.ipynb +++ b/docs/tutorials/pytorch/text-classification/orchestrate_optimizations_bert_mini.ipynb @@ -70,12 +70,14 @@ "from datasets import load_dataset, load_metric\n", "from intel_extension_for_transformers.transformers import (\n", " metrics,\n", - " PrunerConfig,\n", - " PruningConfig,\n", - " DistillationConfig,\n", - " QuantizationConfig,\n", " objectives\n", ")\n", + "from neural_compressor.config import (\n", + " WeightPruningConfig,\n", + " DistillationConfig,\n", + " KnowledgeDistillationLossConfig,\n", + " QuantizationAwareTrainingConfig,\n", + ")\n", "from intel_extension_for_transformers.transformers.trainer import NLPTrainer\n", "from transformers import (\n", " AutoConfig,\n", @@ -343,18 +345,14 @@ " name=metric_name, is_relative=True, criterion=0.01\n", ")\n", "\n", - "target_sparsity_ratio = None\n", - "pruner_config = PrunerConfig(prune_type='PatternLock', target_sparsity_ratio=None)\n", - "pruning_conf = PruningConfig(framework=\"pytorch_fx\",pruner_config=[pruner_config], metrics=tune_metric)\n", - "distillation_conf = DistillationConfig(framework=\"pytorch_fx\", metrics=tune_metric)\n", - "\n", - "objective = objectives.performance\n", - "quantization_conf = QuantizationConfig(\n", - " approach=\"QuantizationAwareTraining\",\n", - " max_trials=600,\n", - " metrics=[tune_metric],\n", - " objectives=[objective]\n", - ")\n", + "trainer.metrics = tune_metric\n", + "pruning_conf = WeightPruningConfig([{\"start_step\": 0, \"end_step\": 2}],\n", + " target_sparsity=0.64,\n", + " pruning_scope=\"local\",\n", + " pruning_type=\"pattern_lock\")\n", + "distillation_criterion = KnowledgeDistillationLossConfig(loss_types=[\"CE\", \"KL\"])\n", + "distillation_conf = DistillationConfig(teacher_model=teacher_model, criterion=distillation_criterion)\n", + "quantization_conf = QuantizationAwareTrainingConfig()\n", "conf_list = [pruning_conf, distillation_conf, quantization_conf]\n", "model = trainer.orchestrate_optimizations(config_list=conf_list, teacher_model=teacher_model)" ] diff --git a/examples/huggingface/pytorch/question-answering/orchestrate_optimizations/run_qa.py b/examples/huggingface/pytorch/question-answering/orchestrate_optimizations/run_qa.py index c07e38affc1..b9e416d41b9 100644 --- a/examples/huggingface/pytorch/question-answering/orchestrate_optimizations/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/orchestrate_optimizations/run_qa.py @@ -33,13 +33,15 @@ import transformers from intel_extension_for_transformers.transformers import ( metrics, - PrunerConfig, - PruningConfig, - DistillationConfig, - QuantizationConfig, OptimizedModel, objectives ) +from neural_compressor.config import ( + WeightPruningConfig, + DistillationConfig, + KnowledgeDistillationLossConfig, + QuantizationAwareTrainingConfig, +) from torch.utils.data import DataLoader from tqdm import tqdm from trainer_qa import QuestionAnsweringTrainer @@ -225,7 +227,7 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply prune."}, ) pruning_approach: Optional[str] = field( - default="BasicMagnitude", + default="magnitude", metadata={"help": "Pruning approach. Supported approach is basic_magnite."}, ) target_sparsity_ratio: Optional[float] = field( @@ -245,9 +247,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="QuantizationAwareTraining", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="qat", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -789,7 +791,7 @@ def get_logits(teacher_model, train_dataset, teacher_train_dataset): # Trace model from neural_compressor.adaptor.torch_utils.symbolic_trace import symbolic_trace - model = symbolic_trace(model, optim_args.quantization_approach=="QuantizationAwareTraining") + model = symbolic_trace(model, optim_args.quantization_approach=="qat") # Initialize our Trainer trainer = QuestionAnsweringTrainer( @@ -814,23 +816,20 @@ def get_logits(teacher_model, train_dataset, teacher_train_dataset): tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - prune_type = 'PatternLock' \ + prune_type = 'pattern_lock' \ if optim_args.pruning_approach else optim_args.pruning_approach target_sparsity_ratio = optim_args.target_sparsity_ratio \ if optim_args.target_sparsity_ratio else None - pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio) - pruning_conf = PruningConfig(framework="pytorch_fx",pruner_config=[pruner_config], metrics=tune_metric) - distillation_conf = DistillationConfig(framework="pytorch_fx", metrics=tune_metric) - - objective = objectives.performance - quantization_conf = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] - ) + trainer.metrics = tune_metric + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=target_sparsity_ratio, + pruning_scope="local", + pruning_type=prune_type) + distillation_criterion = KnowledgeDistillationLossConfig(loss_types=["CE", "KL"]) + distillation_conf = DistillationConfig(teacher_model=teacher_model, criterion=distillation_criterion) + quantization_conf = QuantizationAwareTrainingConfig() conf_list = [pruning_conf, distillation_conf, quantization_conf] - model = trainer.orchestrate_optimizations(config_list=conf_list, teacher_model=teacher_model) + model = trainer.orchestrate_optimizations(config_list=conf_list) if optim_args.benchmark or optim_args.accuracy_only: start_time = timeit.default_timer() @@ -839,7 +838,7 @@ def get_logits(teacher_model, train_dataset, teacher_train_dataset): max_eval_samples = data_args.max_eval_samples \ if data_args.max_eval_samples is not None else len(eval_dataset) eval_samples = min(max_eval_samples, len(eval_dataset)) - samples = eval_samples - (eval_samples % batch_size) \ + samples = eval_samples - (eval_samples % optim_args.batch_size) \ if training_args.dataloader_drop_last else eval_samples logger.info("metrics keys: {}".format(results.keys())) bert_task_acc_keys = ['eval_f1', 'eval_accuracy', 'eval_matthews_correlation', diff --git a/examples/huggingface/pytorch/text-classification/quantization/run_glue.py b/examples/huggingface/pytorch/text-classification/quantization/run_glue.py index a6c1a96e04d..7a915a56a8a 100644 --- a/examples/huggingface/pytorch/text-classification/quantization/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/quantization/run_glue.py @@ -550,25 +550,19 @@ def compute_metrics(p: EvalPrediction): ) trainer.metrics = tune_metric objective = objectives.performance + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) if optim_args.quantization_approach != "qat": - tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) - accuracy_criterion = AccuracyCriterion( - higher_is_better=True, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = PostTrainingQuantConfig( approach=optim_args.quantization_approach, tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion ) else: - tuning_criterion = TuningCriterion(max_trials=600, objective=["performance"]) - accuracy_criterion = AccuracyCriterion( - higher_is_better=True, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = QuantizationAwareTrainingConfig( tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion diff --git a/examples/huggingface/pytorch/textual-inversion/distillation_for_quantization/textual_inversion.py b/examples/huggingface/pytorch/textual-inversion/distillation_for_quantization/textual_inversion.py index 128c9248341..832da5ceb52 100644 --- a/examples/huggingface/pytorch/textual-inversion/distillation_for_quantization/textual_inversion.py +++ b/examples/huggingface/pytorch/textual-inversion/distillation_for_quantization/textual_inversion.py @@ -19,9 +19,10 @@ from diffusers.optimization import get_scheduler from diffusers.pipelines.stable_diffusion import StableDiffusionSafetyChecker from huggingface_hub import HfFolder, Repository, whoami -from intel_extension_for_transformers.transformers.config import ( +from neural_compressor.config import ( DistillationConfig, - QuantizationConfig, + IntermediateLayersKnowledgeDistillationLossConfig, + QuantizationAwareTrainingConfig, ) from intel_extension_for_transformers.transformers.utils import metrics, objectives from intel_extension_for_transformers.transformers.trainer import NLPTrainer @@ -769,12 +770,7 @@ def train_func(model): tune_metric = metrics.Metric(name="") if args.do_quantization: objective = objectives.performance - quantization_conf = QuantizationConfig( - approach="QuantizationAwareTraining", - max_trials=600, - metrics=[tune_metric], - objectives=[objective] - ) + quantization_conf = QuantizationAwareTrainingConfig() conf_list.append(quantization_conf) if args.do_distillation: @@ -828,17 +824,13 @@ def train_func(model): [['mid_block.resnets.1', ]], [['conv_out', ]], ] - - distillation_conf = DistillationConfig( - framework="pytorch_fx", metrics=tune_metric, - criterion=Criterion( - name="IntermediateLayersLoss", - layer_mappings=layer_mappings, - loss_types=["MSE"] * len(layer_mappings), - loss_weight_ratio=[1.0 / len(layer_mappings)] * len(layer_mappings), - add_origin_loss=True - ) + criterion_conf = IntermediateLayersKnowledgeDistillationLossConfig( + layer_mappings=layer_mappings, + loss_types=["MSE"] * len(layer_mappings), + loss_weight_ratio=[1.0 / len(layer_mappings)] * len(layer_mappings), + add_origin_loss=True ) + distillation_conf = DistillationConfig(teacher_model=teacher_model, criterion=criterion_conf) conf_list.append(distillation_conf) # Initialize our Trainer @@ -846,10 +838,10 @@ def train_func(model): model=model, args=TrainingArguments(output_dir=args.output_dir), ) + trainer.metrics = tune_metric model = trainer.orchestrate_optimizations( config_list=conf_list, - teacher_model=teacher_model, eval_func=lambda model:1, train_func=train_func) diff --git a/examples/huggingface/tensorflow/language-modeling/quantization/README.md b/examples/huggingface/tensorflow/language-modeling/quantization/README.md deleted file mode 100644 index 883689068bc..00000000000 --- a/examples/huggingface/tensorflow/language-modeling/quantization/README.md +++ /dev/null @@ -1,63 +0,0 @@ -Step-by-Step -========= - -This document describes the step-by-step instructions for reproducing the quantization on models for the Language Modeling tasks. - -There are mainly two kinds of language modeling tasks: Causal Language Modeling (CLM) and Masked Language Modeling (MLM). Two scripts `run_clm.py` and `run_mlm.py` provide quantization examples on the above two kinds of models based on [Intel® Neural Compressor](https://github.com/intel/neural-compressor). Users can easily run the quantization with `run_tuning.sh` and the benchmarking with `run_benchmark.sh`. - -Please note that language modeling tasks use `loss` as the evaluation metric so the loss will appear where the accuracy should be in the final tune result statistics, and the `greater_is_better=False` should be set in the Python scripts. - -Users can also change the `--max_training_samples`, `--max_eval_samples`, and `--max_seq_length` in the scripts for quicker debugging and to avoid potential lack of memory. - -# Prerequisite -## 1. Installation - -Make sure you have installed Intel® Extension for Transformers and all the dependencies in the current example: - -```shell -pip install intel-extension-for-transformers -cd ptq -pip install -r requirements.txt -``` - -# Run - -## 1. Run Command for the CLM task (Shell) - -- Topology: - - distilgpt2_clm - -* To get the int8 model - -``` -cd ptq -bash run_tuning.sh --topology=[topology] -``` - -* To benchmark the int8 model - - -``` -cd ptq -bash run_benchmark.sh --topology=[topology] --mode=benchmark --int8=true -``` - -## 2. Run Command for the MLM task (Shell) - -- Topology: - - distilbert_mlm - - distilroberta_mlm - -* To get the int8 model - -``` -cd ptq -bash run_tuning.sh --topology=[topology] -``` - -* To benchmark the int8 model - -``` -cd ptq -bash run_benchmark.sh --topology=[topology] --mode=benchmark --int8=true -``` \ No newline at end of file diff --git a/examples/huggingface/tensorflow/language-modeling/quantization/ptq/requirements.txt b/examples/huggingface/tensorflow/language-modeling/quantization/ptq/requirements.txt deleted file mode 100644 index 62aa53701f4..00000000000 --- a/examples/huggingface/tensorflow/language-modeling/quantization/ptq/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -datasets >= 1.17 -sentencepiece != 0.1.92 -protobuf -intel-tensorflow -transformers -scikit-learn -accelerate \ No newline at end of file diff --git a/examples/huggingface/tensorflow/language-modeling/quantization/ptq/run_benchmark.sh b/examples/huggingface/tensorflow/language-modeling/quantization/ptq/run_benchmark.sh deleted file mode 100644 index e3cb8c3c55a..00000000000 --- a/examples/huggingface/tensorflow/language-modeling/quantization/ptq/run_benchmark.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_benchmark - -} - -# init params -function init_params { - topology="distilgpt2_clm" - iters=100 - batch_size=16 - tuned_checkpoint=saved_results - cache_dir="cache" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --mode=*) - mode=$(echo $var |cut -f2 -d=) - ;; - --batch_size=*) - batch_size=$(echo $var |cut -f2 -d=) - ;; - --iters=*) - iters=$(echo ${var} |cut -f2 -d=) - ;; - --int8=*) - int8=$(echo ${var} |cut -f2 -d=) - ;; - --config=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - --worker=*) - worker=$(echo $var |cut -f2 -d=) - ;; - --task_index=*) - task_index=$(echo $var |cut -f2 -d=) - ;; - --cache_dir=*) - cache_dir=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - - -# run_benchmark -function run_benchmark { - extra_cmd='' - MAX_SEQ_LENGTH=128 - - if [[ ${mode} == "accuracy" ]]; then - mode_cmd=" --accuracy_only" - elif [[ ${mode} == "benchmark" ]]; then - mode_cmd=" --benchmark " - else - echo "Error: No such mode: ${mode}" - exit 1 - fi - - if [ "${topology}" = "distilgpt2_clm" ]; then - script="run_clm.py" - dataset_name="wikitext" - model_name_or_path="distilgpt2" - dataset_config_name="wikitext-2-raw-v1" - # remove following two parameters if you have enough memory - extra_cmd=$extra_cmd" --max_eval_samples 196 --block_size 128" - elif [ "${topology}" = "distilbert_mlm" ]; then - script="run_mlm.py" - dataset_name="wikitext" - model_name_or_path="distilbert-base-cased" - dataset_config_name="wikitext-2-raw-v1" - # remove following two parameters if you have enough memory - extra_cmd=$extra_cmd" --max_eval_samples 196 --max_seq_length 128" - elif [ "${topology}" = "distilroberta_mlm" ]; then - script="run_mlm.py" - dataset_name="wikitext" - model_name_or_path="Rocketknight1/distilroberta-base-finetuned-wikitext2" - dataset_config_name="wikitext-2-raw-v1" - # remove following two parameters if you have enough memory - extra_cmd=$extra_cmd" --max_eval_samples 196 --max_seq_length 128" - fi - - if [[ ${int8} == "true" ]]; then - extra_cmd=$extra_cmd" --int8" - fi - echo $extra_cmd - - python -u ../${script} \ - --model_name_or_path ${model_name_or_path} \ - --dataset_name ${dataset_name} \ - --dataset_config_name ${dataset_config_name} \ - --do_eval \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - ${mode_cmd} \ - ${extra_cmd} -} - -main "$@" diff --git a/examples/huggingface/tensorflow/language-modeling/quantization/ptq/run_tuning.sh b/examples/huggingface/tensorflow/language-modeling/quantization/ptq/run_tuning.sh deleted file mode 100644 index 6ffa270911f..00000000000 --- a/examples/huggingface/tensorflow/language-modeling/quantization/ptq/run_tuning.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_tuning - -} - -# init params -function init_params { - topology="distilgpt2_clm" - tuned_checkpoint="saved_results" - extra_cmd="" - batch_size=8 - MAX_SEQ_LENGTH=128 - model_type="bert" - approach="PostTrainingStatic" - cache_dir="cache" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --output_model=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - --worker=*) - worker=$(echo $var |cut -f2 -d=) - ;; - --task_index=*) - task_index=$(echo $var |cut -f2 -d=) - ;; - --cache_dir=*) - cache_dir=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - -# run_tuning -function run_tuning { - if [ "${topology}" = "distilgpt2_clm" ]; then - script="run_clm.py" - model_name_or_path="distilgpt2" - dataset_name="wikitext" - approach="PostTrainingStatic" - dataset_config_name="wikitext-2-raw-v1" - # remove or change following two parameters if you have enough memory - extra_cmd=$extra_cmd" --max_eval_samples 96 --block_size 128 --perf_tol 0.08" - elif [ "${topology}" = "distilbert_mlm" ]; then - script="run_mlm.py" - model_name_or_path="distilbert-base-cased" - dataset_name="wikitext" - approach="PostTrainingStatic" - dataset_config_name="wikitext-2-raw-v1" - # remove or change following two parameters if you have enough memory - extra_cmd=$extra_cmd" --max_eval_samples 96 --max_seq_length 128 --perf_tol 0.08" - elif [ "${topology}" = "distilroberta_mlm" ]; then - script="run_mlm.py" - model_name_or_path="Rocketknight1/distilroberta-base-finetuned-wikitext2" - dataset_name="wikitext" - approach="PostTrainingStatic" - dataset_config_name="wikitext-2-raw-v1" - # remove or change following two parameters if you have enough memory - extra_cmd=$extra_cmd" --max_eval_samples 96 --max_seq_length 128 --perf_tol 0.08" - fi - - if [ "${worker}" = "" ] - then - python -u ../${script} \ - --model_name_or_path ${model_name_or_path} \ - --dataset_name ${dataset_name} \ - --dataset_config_name ${dataset_config_name} \ - --do_eval \ - --output_dir ${tuned_checkpoint} \ - --quantization_approach ${approach} \ - --do_train \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --tune \ - ${extra_cmd} - else - python -u ../${script} \ - --model_name_or_path ${model_name_or_path} \ - --dataset_name ${dataset_name} \ - --dataset_config_name ${dataset_config_name} \ - --task_name ${TASK_NAME} \ - --do_eval \ - --output_dir ${tuned_checkpoint} \ - --quantization_approach ${approach} \ - --do_train \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --tune \ - --worker "${worker}" \ - --task_index ${task_index} \ - ${extra_cmd} - fi -} - -main "$@" diff --git a/examples/huggingface/tensorflow/language-modeling/quantization/run_clm.py b/examples/huggingface/tensorflow/language-modeling/quantization/run_clm.py deleted file mode 100644 index 1b82d1ccf0f..00000000000 --- a/examples/huggingface/tensorflow/language-modeling/quantization/run_clm.py +++ /dev/null @@ -1,814 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -# Copyright 2021 The HuggingFace Inc. team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Fine-tuning the library models for causal language modeling (GPT-2, GPT-Neo...) -on a text file or a dataset without using HuggingFace Trainer. -Here is the full list of checkpoints on the hub that can be fine-tuned by this script: -https://huggingface.co/models?filter=text-generation -""" -# You can also adapt this script on your own clm task. Pointers for this are left as comments. - -import json - -# region Imports -import logging -import math -import os -import random -import sys -from dataclasses import dataclass, field -from itertools import chain -from pathlib import Path -from typing import Optional -import time - -import numpy as np -import datasets -import tensorflow as tf -from datasets import load_dataset, load_metric -from sklearn.model_selection import train_test_split -from transformers.trainer_utils import get_last_checkpoint, is_main_process - -import transformers -from transformers import ( - CONFIG_MAPPING, - CONFIG_NAME, - TF2_WEIGHTS_NAME, - TF_MODEL_FOR_CAUSAL_LM_MAPPING, - AutoConfig, - AutoTokenizer, - HfArgumentParser, - TFAutoModelForCausalLM, - TFTrainingArguments, - create_optimizer, - set_seed, -) -from transformers.utils.versions import require_version - -logger = logging.getLogger(__name__) -require_version("datasets>=1.8.0", "To fix: pip install -r examples/tensorflow/language-modeling/requirements.txt") -MODEL_CONFIG_CLASSES = list(TF_MODEL_FOR_CAUSAL_LM_MAPPING.keys()) -MODEL_TYPES = tuple(conf.model_type for conf in MODEL_CONFIG_CLASSES) -# endregion - -# region Command-line arguments -@dataclass -class ModelArguments: - """ - Arguments pertaining to which model/config/tokenizer we are going to fine-tune, or train from scratch. - """ - - model_name_or_path: Optional[str] = field( - default=None, - metadata={ - "help": ( - "The model checkpoint for weights initialization.Don't set if you want to train a model from scratch." - ) - }, - ) - model_type: Optional[str] = field( - default=None, - metadata={"help": "If training from scratch, pass a model type from the list: " + ", ".join(MODEL_TYPES)}, - ) - config_overrides: Optional[str] = field( - default=None, - metadata={ - "help": ( - "Override some existing default config settings when a model is trained from scratch. Example: " - "n_embd=10,resid_pdrop=0.2,scale_attn_weights=false,summary_type=cls_index" - ) - }, - ) - config_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained config name or path if not the same as model_name"} - ) - tokenizer_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained tokenizer name or path if not the same as model_name"} - ) - cache_dir: Optional[str] = field( - default=None, - metadata={"help": "Where do you want to store the pretrained models downloaded from huggingface.co"}, - ) - use_fast_tokenizer: bool = field( - default=True, - metadata={"help": "Whether to use one of the fast tokenizer (backed by the tokenizers library) or not."}, - ) - model_revision: str = field( - default="main", - metadata={"help": "The specific model version to use (can be a branch name, tag name or commit id)."}, - ) - use_auth_token: bool = field( - default=False, - metadata={ - "help": ( - "Will use the token generated when running `huggingface-cli login` (necessary to use this script " - "with private models)." - ) - }, - ) - - def __post_init__(self): - if self.config_overrides is not None and (self.config_name is not None or self.model_name_or_path is not None): - raise ValueError( - "--config_overrides can't be used in combination with --config_name or --model_name_or_path" - ) - - -@dataclass -class DataTrainingArguments: - """ - Arguments pertaining to what data we are going to input our model for training and eval. - """ - - dataset_name: Optional[str] = field( - default=None, metadata={"help": "The name of the dataset to use (via the datasets library)."} - ) - dataset_config_name: Optional[str] = field( - default=None, metadata={"help": "The configuration name of the dataset to use (via the datasets library)."} - ) - train_file: Optional[str] = field(default=None, metadata={"help": "The input training data file (a text file)."}) - validation_file: Optional[str] = field( - default=None, - metadata={"help": "An optional input evaluation data file to evaluate the perplexity on (a text file)."}, - ) - max_seq_length: int = field( - default=128, - metadata={ - "help": "The maximum total input sequence length after tokenization. Sequences longer " - "than this will be truncated, sequences shorter will be padded." - }, - ) - pad_to_max_length: bool = field( - default=False, - metadata={ - "help": "Whether to pad all samples to `max_seq_length`. " - "If False, will pad the samples dynamically when batching to the maximum length in the batch." - }, - ) - overwrite_cache: bool = field( - default=False, metadata={"help": "Overwrite the cached training and evaluation sets"} - ) - validation_split_percentage: Optional[int] = field( - default=5, - metadata={ - "help": "The percentage of the train set used as validation set in case there's no validation split" - }, - ) - block_size: Optional[int] = field( - default=None, - metadata={ - "help": ( - "Optional input sequence length after tokenization. " - "The training dataset will be truncated in block of this size for training. " - "Default to the model max input length for single sentence inputs (take into account special tokens)." - ) - }, - ) - preprocessing_num_workers: Optional[int] = field( - default=None, - metadata={"help": "The number of processes to use for the preprocessing."}, - ) - line_by_line: bool = field( - default=False, - metadata={"help": "Whether distinct lines of text in the dataset are to be handled as distinct sequences."}, - ) - max_train_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of training examples to this " - "value if set." - ) - }, - ) - max_eval_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of evaluation examples to this " - "value if set." - ) - }, - ) - keep_linebreaks: bool = field( - default=True, metadata={"help": "Whether to keep line breaks when using TXT files or not."} - ) - - def __post_init__(self): - if self.dataset_name is None and self.train_file is None and self.validation_file is None: - raise ValueError("Need either a dataset name or a training/validation file.") - else: - if self.train_file is not None: - extension = self.train_file.split(".")[-1] - assert extension in ["csv", "json", "txt"], "`train_file` should be a csv, a json or a txt file." - if self.validation_file is not None: - extension = self.validation_file.split(".")[-1] - assert extension in ["csv", "json", "txt"], "`validation_file` should be a csv, a json or a txt file." - -@dataclass -class OptimizationArguments: - """ - Arguments pertaining to what type of optimization we are going to apply on the model. - """ - - tune: bool = field( - default=False, - metadata={"help": "Whether or not to apply quantization."}, - ) - quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, - ) - metric_name: Optional[str] = field( - default=None, - metadata={"help": "Metric used for the tuning strategy."}, - ) - is_relative: Optional[bool] = field( - default=True, - metadata={"help": "Metric tolerance model, expected to be relative or absolute."}, - ) - perf_tol: Optional[float] = field( - default=0.01, - metadata={"help": "Performance tolerance when optimizing the model."}, - ) - benchmark: bool = field( - default=False, - metadata={"help": "run benchmark."}) - int8: bool = field( - default=False, - metadata={"help":"Whether to use the quantized int8 model."}) - accuracy_only: bool = field( - default=False, - metadata={"help":"Whether to only test accuracy for model tuned by Neural Compressor."}) - -@dataclass -class DistributedArguments: - """ - Arguments setting the distributed multinode environment - """ - - worker: str = field( - default=None, - metadata={"help": "List of node ip addresses in a string, and there should not be space between addresses."}, - ) - task_index: int = field( - default=0, - metadata={"help": "Worker index, and 0 represents the chief worker while other workers are set as 1,2,3..."}, - ) - - -# endregion - -def main(): - # region Argument Parsing - parser = HfArgumentParser((ModelArguments, DataTrainingArguments, TFTrainingArguments, OptimizationArguments, DistributedArguments)) - if len(sys.argv) == 2 and sys.argv[1].endswith(".json"): - # If we pass only one argument to the script and it's the path to a json file, - # let's parse it to get our arguments. - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1])) - else: - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_args_into_dataclasses() - - # region Setup logging - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%m/%d/%Y %H:%M:%S", - handlers=[logging.StreamHandler(sys.stdout)], - ) - logger.setLevel(logging.INFO if is_main_process(training_args.local_rank) else logging.WARN) - - # Set the verbosity to info of the Transformers logger (on main process only): - if is_main_process(training_args.local_rank): - transformers.utils.logging.set_verbosity_info() - transformers.utils.logging.enable_default_handler() - transformers.utils.logging.enable_explicit_format() - logger.info(f"Training/evaluation parameters {training_args}") - # endregion - - # Sanity checks - if data_args.dataset_name is None and data_args.train_file is None and data_args.validation_file is None: - raise ValueError("Need either a dataset name or a training/validation file.") - else: - if data_args.train_file is not None: - extension = data_args.train_file.split(".")[-1] - assert extension in ["csv", "json", "txt"], "`train_file` should be a csv, json or txt file." - if data_args.validation_file is not None: - extension = data_args.validation_file.split(".")[-1] - assert extension in ["csv", "json", "txt"], "`validation_file` should be a csv, json or txt file." - - if training_args.output_dir is not None: - training_args.output_dir = Path(training_args.output_dir) - os.makedirs(training_args.output_dir, exist_ok=True) - # endregion - - # region Set the multinode environment, the strategy and paths - strategy = None - worker_list = None - if distributed_args.worker is not None: - logger.info("distributed environment initialization...") - - worker_list = distributed_args.worker.split(",") - - from intel_extension_for_transformers.transformers.utils.utility_tf import distributed_init - distributed_init(worker_list, "worker", distributed_args.task_index) - - strategy = tf.distribute.MultiWorkerMirroredStrategy() - from intel_extension_for_transformers.transformers.utils.utility_tf import get_filepath - training_args.output_dir = get_filepath(training_args.output_dir, strategy.cluster_resolver.task_type, strategy.cluster_resolver.task_id) - else: - strategy = training_args.strategy - #endregion - - # region Checkpoints - # Detecting last checkpoint. - checkpoint = None - if len(os.listdir(training_args.output_dir)) > 0 and not training_args.overwrite_output_dir and not training_args.do_eval: - config_path = training_args.output_dir / CONFIG_NAME - weights_path = training_args.output_dir / TF2_WEIGHTS_NAME - if config_path.is_file() and weights_path.is_file(): - checkpoint = training_args.output_dir - logger.info( - f"Checkpoint detected, resuming training from checkpoint in {training_args.output_dir}. To avoid this" - " behavior, change the `--output_dir` or add `--overwrite_output_dir` to train from scratch." - ) - else: - raise ValueError( - f"Output directory ({training_args.output_dir}) already exists and is not empty. " - "Use --overwrite_output_dir to continue regardless." - ) - - # endregion - - # If passed along, set the training seed now. - if training_args.seed is not None: - set_seed(training_args.seed) - - # region Load datasets - # Get the datasets: you can either provide your own CSV/JSON/TXT training and evaluation files (see below) - # or just provide the name of one of the public datasets available on the hub at https://huggingface.co/datasets/ - # (the dataset will be downloaded automatically from the datasets Hub). - # - # For CSV/JSON files, this script will use the column called 'text' or the first column if no column called - # 'text' is found. You can easily tweak this behavior (see below). - # - # In distributed training, the load_dataset function guarantee that only one local process can concurrently - # download the dataset. - if data_args.dataset_name is not None: - # Downloading and loading a dataset from the hub. - raw_datasets = load_dataset( - data_args.dataset_name, - data_args.dataset_config_name, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - if "validation" not in raw_datasets.keys(): - raw_datasets["validation"] = load_dataset( - data_args.dataset_name, - data_args.dataset_config_name, - split=f"train[:{data_args.validation_split_percentage}%]", - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - raw_datasets["train"] = load_dataset( - data_args.dataset_name, - data_args.dataset_config_name, - split=f"train[{data_args.validation_split_percentage}%:]", - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - else: - data_files = {} - dataset_args = {} - if data_args.train_file is not None: - data_files["train"] = data_args.train_file - if data_args.validation_file is not None: - data_files["validation"] = data_args.validation_file - extension = ( - data_args.train_file.split(".")[-1] - if data_args.train_file is not None - else data_args.validation_file.split(".")[-1] - ) - if extension == "txt": - extension = "text" - dataset_args["keep_linebreaks"] = data_args.keep_linebreaks - raw_datasets = load_dataset( - extension, - data_files=data_files, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - **dataset_args, - ) - # If no validation data is there, validation_split_percentage will be used to divide the dataset. - if "validation" not in raw_datasets.keys(): - raw_datasets["validation"] = load_dataset( - extension, - data_files=data_files, - split=f"train[:{data_args.validation_split_percentage}%]", - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - **dataset_args, - ) - raw_datasets["train"] = load_dataset( - extension, - data_files=data_files, - split=f"train[{data_args.validation_split_percentage}%:]", - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - **dataset_args, - ) - # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at - # https://huggingface.co/docs/datasets/loading_datasets.html. - # endregion - # region Load pretrained model and tokenizer - # - # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently - # download model & vocab. - config = AutoConfig.from_pretrained( - model_args.config_name if model_args.config_name else model_args.model_name_or_path, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - _commit_hash="main", - ) - tokenizer = AutoTokenizer.from_pretrained( - model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path, - cache_dir=model_args.cache_dir, - use_fast=model_args.use_fast_tokenizer, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - _commit_hash="main", - ) - # endregion - - - # region Dataset preprocessing - # First we tokenize all the texts. - column_names = raw_datasets["train"].column_names - text_column_name = "text" if "text" in column_names else column_names[0] - - def tokenize_function(examples): - return tokenizer(examples[text_column_name], return_token_type_ids=True) - - tokenized_datasets = raw_datasets.map( - tokenize_function, - batched=True, - num_proc=data_args.preprocessing_num_workers, - remove_columns=column_names, - load_from_cache_file=not data_args.overwrite_cache, - desc="Running tokenizer on dataset", - ) - - if data_args.block_size is None: - block_size = tokenizer.model_max_length - if block_size > 1024: - logger.warning( - f"The tokenizer picked seems to have a very large `model_max_length` ({tokenizer.model_max_length}). " - "Picking 1024 instead. You can change that default value by passing --block_size xxx." - ) - block_size = 1024 - else: - if data_args.block_size > tokenizer.model_max_length: - logger.warning( - f"The block_size passed ({data_args.block_size}) is larger than the maximum length for the model" - f"({tokenizer.model_max_length}). Using block_size={tokenizer.model_max_length}." - ) - block_size = min(data_args.block_size, tokenizer.model_max_length) - - # Main data processing function that will concatenate all texts from our dataset and generate chunks of block_size. - def group_texts(examples): - # Concatenate all texts. - concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()} - total_length = len(concatenated_examples[list(examples.keys())[0]]) - # We drop the small remainder, we could add padding if the model supported it instead of this drop, you can - # customize this part to your needs. - if total_length >= block_size: - total_length = (total_length // block_size) * block_size - # Split by chunks of max_len. - result = { - k: [t[i : i + block_size] for i in range(0, total_length, block_size)] - for k, t in concatenated_examples.items() - } - result["labels"] = result["input_ids"].copy() - return result - - # Note that with `batched=True`, this map processes 1,000 texts together, so group_texts throws away a remainder - # for each of those groups of 1,000 texts. You can adjust that batch_size here but a higher value might be slower - # to preprocess. - # - # To speed up this part, we use multiprocessing. See the documentation of the map method for more information: - # https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map - - tokenized_datasets = tokenized_datasets.map( - group_texts, - batched=True, - num_proc=data_args.preprocessing_num_workers, - load_from_cache_file=not data_args.overwrite_cache, - desc=f"Grouping texts in chunks of {block_size}", - ) - - train_dataset = tokenized_datasets["train"] - if data_args.validation_file is not None: - eval_dataset = tokenized_datasets["validation"] - else: - logger.info( - f"Validation file not found: using {data_args.validation_split_percentage}% of the dataset as validation" - " as provided in data_args" - ) - train_indices, val_indices = train_test_split( - list(range(len(train_dataset))), test_size=data_args.validation_split_percentage / 100 - ) - - eval_dataset = train_dataset.select(val_indices) - train_dataset = train_dataset.select(train_indices) - - if data_args.max_train_samples is not None: - max_train_samples = min(len(train_dataset), data_args.max_train_samples) - train_dataset = train_dataset.select(range(max_train_samples)) - if data_args.max_eval_samples is not None: - max_eval_samples = min(len(eval_dataset), data_args.max_eval_samples) - eval_dataset = eval_dataset.select(range(max_eval_samples)) - - # Log a few random samples from the training set: - for index in random.sample(range(len(train_dataset)), min(3, len(train_dataset))): - logger.info(f"Sample {index} of the training set: {train_dataset[index]}.") - # endregion - - with strategy.scope(): - # region Prepare model - if checkpoint is not None: - model = TFAutoModelForCausalLM.from_pretrained(checkpoint, config=config, cache_dir=model_args.cache_dir,) - elif model_args.model_name_or_path: - model = TFAutoModelForCausalLM.from_pretrained(model_args.model_name_or_path, config=config, - cache_dir=model_args.cache_dir, revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None,) - else: - logger.info("Training new model from scratch") - model = TFAutoModelForCausalLM.from_config(config) - - model.resize_token_embeddings(len(tokenizer)) - # endregion - - # region TF Dataset preparation - num_replicas = (len(worker_list) if worker_list is not None else 1) - options = tf.data.Options() - options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF - - # model.prepare_tf_dataset() wraps a Hugging Face dataset in a tf.data.Dataset which is ready to use in - # training. This is the recommended way to use a Hugging Face dataset when training with Keras. You can also - # use the lower-level dataset.to_tf_dataset() method, but you will have to specify things like column names - # yourself if you use this method, whereas they are automatically inferred from the model input names when - # using model.prepare_tf_dataset() - # For more info see the docs: - # https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.prepare_tf_dataset - # https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.to_tf_dataset - - if model_args.model_name_or_path == "distilgpt2": - train_dataset = train_dataset.remove_columns('token_type_ids') - eval_dataset = eval_dataset.remove_columns('token_type_ids') - - tf_train_dataset = model.prepare_tf_dataset( - train_dataset, - shuffle=True, - batch_size=num_replicas * training_args.per_device_train_batch_size, - ).with_options(options) - - tf_eval_dataset = model.prepare_tf_dataset( - eval_dataset, - shuffle=False, - batch_size=num_replicas * training_args.per_device_eval_batch_size, - drop_remainder=True, - ).with_options(options) - # endregion - - # region Optimizer and loss - num_train_steps = len(tf_train_dataset) * int(training_args.num_train_epochs) - if training_args.warmup_steps > 0: - num_warmup_steps = training_args.warmup_steps - elif training_args.warmup_ratio > 0: - num_warmup_steps = int(num_train_steps * training_args.warmup_ratio) - else: - num_warmup_steps = 0 - - # Bias and layernorm weights are automatically excluded from the decay - optimizer, lr_schedule = create_optimizer( - init_lr=training_args.learning_rate, - num_train_steps=num_train_steps, - num_warmup_steps=num_warmup_steps, - adam_beta1=training_args.adam_beta1, - adam_beta2=training_args.adam_beta2, - adam_epsilon=training_args.adam_epsilon, - weight_decay_rate=training_args.weight_decay, - adam_global_clipnorm=training_args.max_grad_norm, - ) - # no user-specified loss = will use the model internal loss - model.compile(optimizer=optimizer, jit_compile=training_args.xla) - - def compute_metrics(preds, labels): - preds = preds["logits"] - # preds have the same shape as the labels, after the argmax(-1) has been calculated - # by preprocess_logits_for_metrics but we need to shift the labels - labels = labels[:, 1:] - preds = preds[:, :-1] - return hf_compute_loss(labels, preds) - - # loss function for CLM model - def hf_compute_loss(labels, logits): - loss_fn = tf.keras.losses.SparseCategoricalCrossentropy( - from_logits=True, reduction=tf.keras.losses.Reduction.NONE - ) - - # Clip negative labels to zero here to avoid NaNs and errors - those positions will get masked later anyway - unmasked_loss = loss_fn(tf.nn.relu(labels), logits) - # make sure only labels that are not equal to -100 affect the loss - loss_mask = tf.cast(labels != -100, dtype=unmasked_loss.dtype) - masked_loss = unmasked_loss * loss_mask - reduced_masked_loss = tf.reduce_sum(masked_loss) / tf.reduce_sum(loss_mask) - return tf.reshape(reduced_masked_loss, (1,)) - - def eval_func_clm(model): - label_ids: np.ndarray = None - - num_examples = sum(1 for _ in ( - tf_eval_dataset.unbatch() if hasattr(tf_eval_dataset, "unbatch") else tf_eval_dataset)) - logger.info(f"***** Running Evaluation *****") - logger.info(f" Num examples in dataset = {num_examples}") - logger.info(f" Batch size = {training_args.per_device_eval_batch_size}") - - preds: np.ndarray = None - infer = model.signatures["serving_default"] - - for idx, (inputs, labels) in enumerate(tf_eval_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - - results = infer(**inputs) - if preds is None: - preds = results["Identity"].numpy() - else: - preds = np.append(preds, results["Identity"].numpy(), axis=0) - - if label_ids is None: - label_ids = labels[0].numpy() if isinstance( - labels, list) else labels.numpy() - else: - label_ids = np.append( - label_ids, - labels[0].numpy() - if isinstance(labels, list) else labels.numpy(), - axis=0) - test_predictions = {"logits": preds} - loss = compute_metrics(test_predictions, label_ids) - - return loss.numpy()[0] - - # region tuning - if optim_args.tune: - from intel_extension_for_transformers.transformers import metrics, objectives, QuantizationConfig, TFOptimization - optimization = TFOptimization( - model=model, - args=training_args, - train_dataset=tf_train_dataset, - eval_dataset=tf_eval_dataset, - compute_metrics=compute_metrics, - task_type=strategy.cluster_resolver.task_type if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - task_id=strategy.cluster_resolver.task_id if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - ) - - # use customized eval function - optimization.eval_func = eval_func_clm - - tune_metric = metrics.Metric( - name="loss", greater_is_better=False, is_relative=True, criterion=optim_args.perf_tol, - ) - quantization_config = QuantizationConfig( - framework="tensorflow", - approach="POSTTRAININGSTATIC", - metrics=[tune_metric], - objectives=[objectives.performance] - ) - quantized_model = optimization.quantize(quant_config=quantization_config) - exit(0) - # endregion - - # region Training and validation - if training_args.do_train: - logger.info("***** Running training *****") - logger.info(f" Num examples = {len(train_dataset)}") - logger.info(f" Num Epochs = {training_args.num_train_epochs}") - logger.info(f" Instantaneous batch size per device = {training_args.per_device_train_batch_size}") - logger.info(f" Total train batch size = {training_args.per_device_train_batch_size * num_replicas}") - - # For long training runs, you may wish to use the PushToHub() callback here to save intermediate checkpoints - # to the Hugging Face Hub rather than just pushing the finished model. - # See https://huggingface.co/docs/transformers/main_classes/keras_callbacks#transformers.PushToHubCallback - history = model.fit( - tf_train_dataset, - validation_data=tf_eval_dataset, - epochs=int(training_args.num_train_epochs), - ) - train_loss = history.history["loss"][-1] - try: - train_perplexity = math.exp(train_loss) - except OverflowError: - train_perplexity = math.inf - logger.info(f" Final train loss: {train_loss:.3f}") - logger.info(f" Final train perplexity: {train_perplexity:.3f}") - validation_loss = history.history["val_loss"][-1] - try: - validation_perplexity = math.exp(validation_loss) - except OverflowError: - validation_perplexity = math.inf - logger.info(f" Final validation loss: {validation_loss:.3f}") - logger.info(f" Final validation perplexity: {validation_perplexity:.3f}") - - if training_args.output_dir is not None: - output_eval_file = os.path.join(training_args.output_dir, "all_results.json") - results_dict = dict() - results_dict["train_loss"] = train_loss - results_dict["train_perplexity"] = train_perplexity - results_dict["eval_loss"] = validation_loss - results_dict["eval_perplexity"] = validation_perplexity - with open(output_eval_file, "w") as writer: - writer.write(json.dumps(results_dict)) - - if training_args.output_dir is not None and not training_args.push_to_hub: - # If we're not pushing to hub, at least save a local copy when we're done - model.save_pretrained(training_args.output_dir) - # endregion - - # region Evaluation - if training_args.do_eval: - num_examples = sum(1 for _ in ( - tf_eval_dataset.unbatch() if hasattr(tf_eval_dataset, "unbatch") else tf_eval_dataset)) - - if optim_args.int8: - model = tf.saved_model.load(training_args.output_dir) - else: - from intel_extension_for_transformers.transformers.utils.utility_tf import keras2SavedModel - model = keras2SavedModel(model) - - preds: np.ndarray = None - label_ids: np.ndarray = None - infer = model.signatures["serving_default"] - - if optim_args.accuracy_only: - iterations = 1 - warmup = 0 - else: - iterations = 10 - warmup = 5 - latency_list = [] - - for idx in range(iterations): - iteration_time = 0 - for i, (inputs, labels) in enumerate(tf_eval_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - - start = time.time() - results = infer(**inputs) - iteration_time += time.time() - start - if idx == 0: # only accumulate once all the preds and labels - if preds is None: - preds = results["Identity"].numpy() - else: - preds = np.append(preds, results["Identity"].numpy(), axis=0) - if label_ids is None: - label_ids = labels[0].numpy() if isinstance( - labels, list) else labels.numpy() - else: - label_ids = np.append( - label_ids, - labels[0].numpy() - if isinstance(labels, list) else labels.numpy(), - axis=0) - latency_list.append(iteration_time) - logger.info("Iteration {} time: {} sec".format(idx, iteration_time)) - - loss = compute_metrics({"logits": preds}, label_ids) - logger.info("\nEvaluation result: ") - logger.info("Accuracy: {}".format(loss.numpy()[0])) - - average_iteration_time = np.array(latency_list[warmup:]).mean() - logger.info( - "Throughput: {} samples/sec".format( - num_examples / average_iteration_time) - ) - #endregion - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/examples/huggingface/tensorflow/language-modeling/quantization/run_mlm.py b/examples/huggingface/tensorflow/language-modeling/quantization/run_mlm.py deleted file mode 100644 index be683113ccf..00000000000 --- a/examples/huggingface/tensorflow/language-modeling/quantization/run_mlm.py +++ /dev/null @@ -1,848 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -# Copyright 2021 The HuggingFace Inc. team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Fine-tuning the library models for masked language modeling (BERT, ALBERT, RoBERTa...) -on a text file or a dataset without using HuggingFace Trainer. -Here is the full list of checkpoints on the hub that can be fine-tuned by this script: -https://huggingface.co/models?filter=fill-mask -""" -# You can also adapt this script on your own mlm task. Pointers for this are left as comments. - -import json -import logging -import math -import os -import random -import sys -from dataclasses import dataclass, field -from itertools import chain -from pathlib import Path -from typing import Optional -import time - -import datasets -import tensorflow as tf -from datasets import load_dataset -from sklearn.model_selection import train_test_split - -import numpy as np - -import transformers -from transformers import ( - CONFIG_MAPPING, - CONFIG_NAME, - TF2_WEIGHTS_NAME, - TF_MODEL_FOR_MASKED_LM_MAPPING, - AutoConfig, - AutoTokenizer, - DataCollatorForLanguageModeling, - HfArgumentParser, - PushToHubCallback, - TFAutoModelForMaskedLM, - TFTrainingArguments, - create_optimizer, - set_seed, -) - -from transformers.utils.versions import require_version -from transformers.trainer_utils import get_last_checkpoint, is_main_process - -logger = logging.getLogger(__name__) -require_version("datasets>=1.8.0", "To fix: pip install -r examples/tensorflow/language-modeling/requirements.txt") -MODEL_CONFIG_CLASSES = list(TF_MODEL_FOR_MASKED_LM_MAPPING.keys()) -MODEL_TYPES = tuple(conf.model_type for conf in MODEL_CONFIG_CLASSES) - -# region Command-line arguments -@dataclass -class ModelArguments: - """ - Arguments pertaining to which model/config/tokenizer we are going to fine-tune, or train from scratch. - """ - - model_name_or_path: Optional[str] = field( - default=None, - metadata={ - "help": ( - "The model checkpoint for weights initialization.Don't set if you want to train a model from scratch." - ) - }, - ) - model_type: Optional[str] = field( - default=None, - metadata={"help": "If training from scratch, pass a model type from the list: " + ", ".join(MODEL_TYPES)}, - ) - config_overrides: Optional[str] = field( - default=None, - metadata={ - "help": ( - "Override some existing default config settings when a model is trained from scratch. Example: " - "n_embd=10,resid_pdrop=0.2,scale_attn_weights=false,summary_type=cls_index" - ) - }, - ) - config_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained config name or path if not the same as model_name"} - ) - tokenizer_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained tokenizer name or path if not the same as model_name"} - ) - cache_dir: Optional[str] = field( - default=None, - metadata={"help": "Where do you want to store the pretrained models downloaded from huggingface.co"}, - ) - use_fast_tokenizer: bool = field( - default=True, - metadata={"help": "Whether to use one of the fast tokenizer (backed by the tokenizers library) or not."}, - ) - model_revision: str = field( - default="main", - metadata={"help": "The specific model version to use (can be a branch name, tag name or commit id)."}, - ) - use_auth_token: bool = field( - default=False, - metadata={ - "help": ( - "Will use the token generated when running `huggingface-cli login` (necessary to use this script " - "with private models)." - ) - }, - ) - - def __post_init__(self): - if self.config_overrides is not None and (self.config_name is not None or self.model_name_or_path is not None): - raise ValueError( - "--config_overrides can't be used in combination with --config_name or --model_name_or_path" - ) - - -@dataclass -class DataTrainingArguments: - """ - Arguments pertaining to what data we are going to input our model for training and eval. - """ - - dataset_name: Optional[str] = field( - default=None, metadata={"help": "The name of the dataset to use (via the datasets library)."} - ) - dataset_config_name: Optional[str] = field( - default=None, metadata={"help": "The configuration name of the dataset to use (via the datasets library)."} - ) - train_file: Optional[str] = field(default=None, metadata={"help": "The input training data file (a text file)."}) - validation_file: Optional[str] = field( - default=None, - metadata={"help": "An optional input evaluation data file to evaluate the perplexity on (a text file)."}, - ) - overwrite_cache: bool = field( - default=False, metadata={"help": "Overwrite the cached training and evaluation sets"} - ) - validation_split_percentage: Optional[int] = field( - default=5, - metadata={ - "help": "The percentage of the train set used as validation set in case there's no validation split" - }, - ) - max_seq_length: Optional[int] = field( - default=None, - metadata={ - "help": ( - "The maximum total input sequence length after tokenization. Sequences longer " - "than this will be truncated." - ) - }, - ) - preprocessing_num_workers: Optional[int] = field( - default=None, - metadata={"help": "The number of processes to use for the preprocessing."}, - ) - mlm_probability: float = field( - default=0.15, metadata={"help": "Ratio of tokens to mask for masked language modeling loss"} - ) - line_by_line: bool = field( - default=False, - metadata={"help": "Whether distinct lines of text in the dataset are to be handled as distinct sequences."}, - ) - pad_to_max_length: bool = field( - default=False, - metadata={ - "help": ( - "Whether to pad all samples to `max_seq_length`. " - "If False, will pad the samples dynamically when batching to the maximum length in the batch." - ) - }, - ) - max_train_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of training examples to this " - "value if set." - ) - }, - ) - max_eval_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of evaluation examples to this " - "value if set." - ) - }, - ) - - def __post_init__(self): - if self.dataset_name is None and self.train_file is None and self.validation_file is None: - raise ValueError("Need either a dataset name or a training/validation file.") - else: - if self.train_file is not None: - extension = self.train_file.split(".")[-1] - assert extension in ["csv", "json", "txt"], "`train_file` should be a csv, a json or a txt file." - if self.validation_file is not None: - extension = self.validation_file.split(".")[-1] - assert extension in ["csv", "json", "txt"], "`validation_file` should be a csv, a json or a txt file." - - -@dataclass -class OptimizationArguments: - """ - Arguments pertaining to what type of optimization we are going to apply on the model. - """ - - tune: bool = field( - default=False, - metadata={"help": "Whether or not to apply quantization."}, - ) - quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, - ) - metric_name: Optional[str] = field( - default=None, - metadata={"help": "Metric used for the tuning strategy."}, - ) - is_relative: Optional[bool] = field( - default=True, - metadata={"help": "Metric tolerance model, expected to be relative or absolute."}, - ) - perf_tol: Optional[float] = field( - default=0.01, - metadata={"help": "Performance tolerance when optimizing the model."}, - ) - benchmark: bool = field( - default=False, - metadata={"help": "run benchmark."}) - int8: bool = field( - default=False, - metadata={"help":"Whether to use the quantized int8 model."}) - accuracy_only: bool = field( - default=False, - metadata={"help":"Whether to only test accuracy for model tuned by Neural Compressor."}) - -@dataclass -class DistributedArguments: - """ - Arguments setting the distributed multinode environment - """ - - worker: str = field( - default=None, - metadata={"help": "List of node ip addresses in a string, and there should not be space between addresses."}, - ) - task_index: int = field( - default=0, - metadata={"help": "Worker index, and 0 represents the chief worker while other workers are set as 1,2,3..."}, - ) - - -# endregion - - -def main(): - # region Argument Parsing - parser = HfArgumentParser((ModelArguments, DataTrainingArguments, TFTrainingArguments, OptimizationArguments, DistributedArguments)) - if len(sys.argv) == 2 and sys.argv[1].endswith(".json"): - # If we pass only one argument to the script and it's the path to a json file, - # let's parse it to get our arguments. - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1])) - else: - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_args_into_dataclasses() - - # region Setup logging - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%m/%d/%Y %H:%M:%S", - handlers=[logging.StreamHandler(sys.stdout)], - ) - logger.setLevel(logging.INFO if is_main_process(training_args.local_rank) else logging.WARN) - - # Set the verbosity to info of the Transformers logger (on main process only): - if is_main_process(training_args.local_rank): - transformers.utils.logging.set_verbosity_info() - transformers.utils.logging.enable_default_handler() - transformers.utils.logging.enable_explicit_format() - logger.info(f"Training/evaluation parameters {training_args}") - # endregion - - # Sanity checks - if data_args.dataset_name is None and data_args.train_file is None and data_args.validation_file is None: - raise ValueError("Need either a dataset name or a training/validation file.") - else: - if data_args.train_file is not None: - extension = data_args.train_file.split(".")[-1] - assert extension in ["csv", "json", "txt"], "`train_file` should be a csv, json or txt file." - if data_args.validation_file is not None: - extension = data_args.validation_file.split(".")[-1] - assert extension in ["csv", "json", "txt"], "`validation_file` should be a csv, json or txt file." - - if training_args.output_dir is not None: - training_args.output_dir = Path(training_args.output_dir) - os.makedirs(training_args.output_dir, exist_ok=True) - # endregion - - # region Set the multinode environment, the strategy and paths - strategy = None - worker_list = None - if distributed_args.worker is not None: - logger.info("distributed environment initialization...") - - worker_list = distributed_args.worker.split(",") - - from intel_extension_for_transformers.transformers.utils.utility_tf import distributed_init - distributed_init(worker_list, "worker", distributed_args.task_index) - - strategy = tf.distribute.MultiWorkerMirroredStrategy() - from intel_extension_for_transformers.transformers.utils.utility_tf import get_filepath - training_args.output_dir = get_filepath(training_args.output_dir, strategy.cluster_resolver.task_type, strategy.cluster_resolver.task_id) - else: - strategy = training_args.strategy - #endregion - - - # region Checkpoints - # Detecting last checkpoint. - checkpoint = None - if len(os.listdir(training_args.output_dir)) > 0 and not training_args.overwrite_output_dir: - config_path = training_args.output_dir / CONFIG_NAME - weights_path = training_args.output_dir / TF2_WEIGHTS_NAME - if config_path.is_file() and weights_path.is_file(): - checkpoint = training_args.output_dir - logger.warning( - f"Checkpoint detected, resuming training from checkpoint in {training_args.output_dir}. To avoid this" - " behavior, change the `--output_dir` or add `--overwrite_output_dir` to train from scratch." - ) - else: - raise ValueError( - f"Output directory ({training_args.output_dir}) already exists and is not empty. " - "Use --overwrite_output_dir to continue regardless." - ) - - # endregion - - # If passed along, set the training seed now. - if training_args.seed is not None: - set_seed(training_args.seed) - - # region Load datasets - # Get the datasets: you can either provide your own CSV/JSON/TXT training and evaluation files (see below) - # or just provide the name of one of the public datasets available on the hub at https://huggingface.co/datasets/ - # (the dataset will be downloaded automatically from the datasets Hub). - # - # For CSV/JSON files, this script will use the column called 'text' or the first column if no column called - # 'text' is found. You can easily tweak this behavior (see below). - # - # In distributed training, the load_dataset function guarantee that only one local process can concurrently - # download the dataset. - if data_args.dataset_name is not None: - # Downloading and loading a dataset from the hub. - raw_datasets = load_dataset( - data_args.dataset_name, - data_args.dataset_config_name, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - if "validation" not in raw_datasets.keys(): - raw_datasets["validation"] = load_dataset( - data_args.dataset_name, - data_args.dataset_config_name, - split=f"train[:{data_args.validation_split_percentage}%]", - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - raw_datasets["train"] = load_dataset( - data_args.dataset_name, - data_args.dataset_config_name, - split=f"train[{data_args.validation_split_percentage}%:]", - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - else: - data_files = {} - dataset_args = {} - if data_args.train_file is not None: - data_files["train"] = data_args.train_file - if data_args.validation_file is not None: - data_files["validation"] = data_args.validation_file - extension = ( - data_args.train_file.split(".")[-1] - if data_args.train_file is not None - else data_args.validation_file.split(".")[-1] - ) - if extension == "txt": - extension = "text" - dataset_args["keep_linebreaks"] = data_args.keep_linebreaks - raw_datasets = load_dataset( - extension, - data_files=data_files, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - **dataset_args, - ) - # If no validation data is there, validation_split_percentage will be used to divide the dataset. - if "validation" not in raw_datasets.keys(): - raw_datasets["validation"] = load_dataset( - extension, - data_files=data_files, - split=f"train[:{data_args.validation_split_percentage}%]", - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - **dataset_args, - ) - raw_datasets["train"] = load_dataset( - extension, - data_files=data_files, - split=f"train[{data_args.validation_split_percentage}%:]", - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - **dataset_args, - ) - - # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at - # https://huggingface.co/docs/datasets/loading_datasets.html. - # endregion - - # region Load pretrained model and tokenizer - # - # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently - # download model & vocab. - config = AutoConfig.from_pretrained( - model_args.config_name if model_args.config_name else model_args.model_name_or_path, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - _commit_hash="main", - ) - tokenizer = AutoTokenizer.from_pretrained( - model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path, - cache_dir=model_args.cache_dir, - use_fast=model_args.use_fast_tokenizer, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - _commit_hash="main", - ) - # endregion - - # region Dataset preprocessing - # First we tokenize all the texts. - column_names = raw_datasets["train"].column_names - text_column_name = "text" if "text" in column_names else column_names[0] - - if data_args.max_seq_length is None: - max_seq_length = tokenizer.model_max_length - if max_seq_length > 1024: - logger.warning( - f"The tokenizer picked seems to have a very large `model_max_length` ({tokenizer.model_max_length}). " - "Picking 1024 instead. You can reduce that default value by passing --max_seq_length xxx." - ) - max_seq_length = 1024 - else: - if data_args.max_seq_length > tokenizer.model_max_length: - logger.warning( - f"The max_seq_length passed ({data_args.max_seq_length}) is larger than the maximum length for the" - f"model ({tokenizer.model_max_length}). Using max_seq_length={tokenizer.model_max_length}." - ) - max_seq_length = min(data_args.max_seq_length, tokenizer.model_max_length) - - if data_args.line_by_line: - # When using line_by_line, we just tokenize each nonempty line. - padding = "max_length" if data_args.pad_to_max_length else False - - def tokenize_function(examples): - # Remove empty lines - examples[text_column_name] = [ - line for line in examples[text_column_name] if len(line) > 0 and not line.isspace() - ] - return tokenizer( - examples[text_column_name], - padding=padding, - truncation=True, - max_length=max_seq_length, - # We use this option because DataCollatorForLanguageModeling (see below) is more efficient when it - # receives the `special_tokens_mask`. - return_special_tokens_mask=True, - return_token_type_ids=True - ) - - tokenized_datasets = raw_datasets.map( - tokenize_function, - batched=True, - num_proc=data_args.preprocessing_num_workers, - remove_columns=[text_column_name], - load_from_cache_file=not data_args.overwrite_cache, - desc="Running tokenizer on dataset line_by_line", - ) - else: - # Otherwise, we tokenize every text, then concatenate them together before splitting them in smaller parts. - # We use `return_special_tokens_mask=True` because DataCollatorForLanguageModeling (see below) is more - # efficient when it receives the `special_tokens_mask`. - def tokenize_function(examples): - return tokenizer(examples[text_column_name], return_special_tokens_mask=True, return_token_type_ids=True) - - tokenized_datasets = raw_datasets.map( - tokenize_function, - batched=True, - num_proc=data_args.preprocessing_num_workers, - remove_columns=column_names, - load_from_cache_file=not data_args.overwrite_cache, - desc="Running tokenizer on every text in dataset", - ) - - # Main data processing function that will concatenate all texts from our dataset and generate chunks of - # max_seq_length. - def group_texts(examples): - # Concatenate all texts. - concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()} - total_length = len(concatenated_examples[list(examples.keys())[0]]) - # We drop the small remainder, we could add padding if the model supported it instead of this drop, you can - # customize this part to your needs. - if total_length >= max_seq_length: - total_length = (total_length // max_seq_length) * max_seq_length - # Split by chunks of max_len. - result = { - k: [t[i : i + max_seq_length] for i in range(0, total_length, max_seq_length)] - for k, t in concatenated_examples.items() - } - return result - - # Note that with `batched=True`, this map processes 1,000 texts together, so group_texts throws away a - # remainder for each of those groups of 1,000 texts. You can adjust that batch_size here but a higher value - # might be slower to preprocess. - # - # To speed up this part, we use multiprocessing. See the documentation of the map method for more information: - # https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map - - tokenized_datasets = tokenized_datasets.map( - group_texts, - batched=True, - num_proc=data_args.preprocessing_num_workers, - load_from_cache_file=not data_args.overwrite_cache, - desc=f"Grouping texts in chunks of {max_seq_length}", - ) - - train_dataset = tokenized_datasets["train"] - - if data_args.validation_file is not None: - eval_dataset = tokenized_datasets["validation"] - else: - logger.info( - f"Validation file not found: using {data_args.validation_split_percentage}% of the dataset as validation" - " as provided in data_args" - ) - train_indices, val_indices = train_test_split( - list(range(len(train_dataset))), test_size=data_args.validation_split_percentage / 100 - ) - - eval_dataset = train_dataset.select(val_indices) - train_dataset = train_dataset.select(train_indices) - - if data_args.max_train_samples is not None: - max_train_samples = min(len(train_dataset), data_args.max_train_samples) - train_dataset = train_dataset.select(range(max_train_samples)) - if data_args.max_eval_samples is not None: - max_eval_samples = min(len(eval_dataset), data_args.max_eval_samples) - eval_dataset = eval_dataset.select(range(max_eval_samples)) - - # Log a few random samples from the training set: - for index in random.sample(range(len(train_dataset)), min(3, len(train_dataset))): - logger.info(f"Sample {index} of the training set: {train_dataset[index]}.") - # endregion - - with strategy.scope(): - # region Prepare model - if checkpoint is not None: - model = TFAutoModelForMaskedLM.from_pretrained(checkpoint, config=config, cache_dir=model_args.cache_dir,) - elif model_args.model_name_or_path: - model = TFAutoModelForMaskedLM.from_pretrained(model_args.model_name_or_path, config=config, - cache_dir=model_args.cache_dir, revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None,) - else: - logger.info("Training new model from scratch") - model = TFAutoModelForMaskedLM.from_config(config) - - model.resize_token_embeddings(len(tokenizer)) - # endregion - - # region TF Dataset preparation - num_replicas = training_args.strategy.num_replicas_in_sync - data_collator = DataCollatorForLanguageModeling( - tokenizer=tokenizer, mlm_probability=data_args.mlm_probability, return_tensors="tf" - ) - options = tf.data.Options() - options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF - - # model.prepare_tf_dataset() wraps a Hugging Face dataset in a tf.data.Dataset which is ready to use in - # training. This is the recommended way to use a Hugging Face dataset when training with Keras. You can also - # use the lower-level dataset.to_tf_dataset() method, but you will have to specify things like column names - # yourself if you use this method, whereas they are automatically inferred from the model input names when - # using model.prepare_tf_dataset() - # For more info see the docs: - # https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.prepare_tf_dataset - # https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.to_tf_dataset - - tf_train_dataset = model.prepare_tf_dataset( - train_dataset, - shuffle=True, - batch_size=num_replicas * training_args.per_device_train_batch_size, - collate_fn=data_collator, - ).with_options(options) - - tf_eval_dataset = model.prepare_tf_dataset( - eval_dataset, - # labels are passed as input, as we will use the model's internal loss - shuffle=False, - batch_size=num_replicas * training_args.per_device_eval_batch_size, - collate_fn=data_collator, - drop_remainder=True, - ).with_options(options) - # endregion - - # region Optimizer and loss - num_train_steps = len(tf_train_dataset) * int(training_args.num_train_epochs) - if training_args.warmup_steps > 0: - num_warmup_steps = training_args.warmup_steps - elif training_args.warmup_ratio > 0: - num_warmup_steps = int(num_train_steps * training_args.warmup_ratio) - else: - num_warmup_steps = 0 - - # Bias and layernorm weights are automatically excluded from the decay - optimizer, lr_schedule = create_optimizer( - init_lr=training_args.learning_rate, - num_train_steps=num_train_steps, - num_warmup_steps=num_warmup_steps, - adam_beta1=training_args.adam_beta1, - adam_beta2=training_args.adam_beta2, - adam_epsilon=training_args.adam_epsilon, - weight_decay_rate=training_args.weight_decay, - adam_global_clipnorm=training_args.max_grad_norm, - ) - - # no user-specified loss = will use the model internal loss - model.compile(optimizer=optimizer, jit_compile=training_args.xla, run_eagerly=True) - # endregion - - def compute_metrics(preds, labels): - preds = preds["logits"] - return hf_compute_loss(labels, preds) - - # loss function for CLM model - def hf_compute_loss(labels, logits): - loss_fn = tf.keras.losses.SparseCategoricalCrossentropy( - from_logits=True, reduction=tf.keras.losses.Reduction.NONE - ) - - # Clip negative labels to zero here to avoid NaNs and errors - those positions will get masked later anyway - unmasked_loss = loss_fn(tf.nn.relu(labels), logits) - # make sure only labels that are not equal to -100 affect the loss - loss_mask = tf.cast(labels != -100, dtype=unmasked_loss.dtype) - masked_loss = unmasked_loss * loss_mask - reduced_masked_loss = tf.reduce_sum(masked_loss) / tf.reduce_sum(loss_mask) - return tf.reshape(reduced_masked_loss, (1,)) - - def eval_func_mlm(model): - label_ids: np.ndarray = None - - num_examples = sum(1 for _ in ( - tf_eval_dataset.unbatch() if hasattr(tf_eval_dataset, "unbatch") else tf_eval_dataset)) - logger.info(f"***** Running Evaluation *****") - logger.info(f" Num examples in dataset = {num_examples}") - logger.info(f" Batch size = {training_args.per_device_eval_batch_size}") - - preds: np.ndarray = None - infer = model.signatures["serving_default"] - - for idx, (inputs, labels) in enumerate(tf_eval_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - - results = infer(**inputs) - - if preds is None: - preds = results["Identity"].numpy() - else: - preds = np.append(preds, results["Identity"].numpy(), axis=0) - - if label_ids is None: - label_ids = labels[0].numpy() if isinstance( - labels, list) else labels.numpy() - else: - label_ids = np.append( - label_ids, - labels[0].numpy() - if isinstance(labels, list) else labels.numpy(), - axis=0) - test_predictions = {"logits": preds} - loss = compute_metrics(test_predictions, label_ids) - - return loss.numpy()[0] - - # region tuning - if optim_args.tune: - from intel_extension_for_transformers.transformers import metrics, objectives, QuantizationConfig, TFOptimization - optimization = TFOptimization( - model=model, - args=training_args, - train_dataset=tf_train_dataset, - eval_dataset=tf_eval_dataset, - compute_metrics=compute_metrics, - task_type=strategy.cluster_resolver.task_type if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - task_id=strategy.cluster_resolver.task_id if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - ) - - # use customized eval function - optimization.eval_func = eval_func_mlm - - tune_metric = metrics.Metric( - name="loss", greater_is_better=False, is_relative=True, criterion=optim_args.perf_tol, - ) - quantization_config = QuantizationConfig( - framework="tensorflow", - approach="POSTTRAININGSTATIC", - metrics=[tune_metric], - objectives=[objectives.performance] - ) - quantized_model = optimization.quantize(quant_config=quantization_config) - exit(0) - # endregion - - # region Training and validation - if training_args.do_train: - logger.info("***** Running training *****") - logger.info(f" Num examples = {len(train_dataset)}") - logger.info(f" Num Epochs = {training_args.num_train_epochs}") - logger.info(f" Instantaneous batch size per device = {training_args.per_device_train_batch_size}") - logger.info(f" Total train batch size = {training_args.per_device_train_batch_size * num_replicas}") - - # For long training runs, you may wish to use the PushToHub() callback here to save intermediate checkpoints - # to the Hugging Face Hub rather than just pushing the finished model. - # See https://huggingface.co/docs/transformers/main_classes/keras_callbacks#transformers.PushToHubCallback - - history = model.fit( - tf_train_dataset, - validation_data=tf_eval_dataset, - epochs=int(training_args.num_train_epochs), - callbacks=callbacks, - ) - train_loss = history.history["loss"][-1] - try: - train_perplexity = math.exp(train_loss) - except OverflowError: - train_perplexity = math.inf - logger.info(f" Final train loss: {train_loss:.3f}") - logger.info(f" Final train perplexity: {train_perplexity:.3f}") - - validation_loss = history.history["val_loss"][-1] - try: - validation_perplexity = math.exp(validation_loss) - except OverflowError: - validation_perplexity = math.inf - logger.info(f" Final validation loss: {validation_loss:.3f}") - logger.info(f" Final validation perplexity: {validation_perplexity:.3f}") - - if training_args.output_dir is not None: - output_eval_file = os.path.join(training_args.output_dir, "all_results.json") - results_dict = dict() - results_dict["train_loss"] = train_loss - results_dict["train_perplexity"] = train_perplexity - results_dict["eval_loss"] = validation_loss - results_dict["eval_perplexity"] = validation_perplexity - with open(output_eval_file, "w") as writer: - writer.write(json.dumps(results_dict)) - # endregion - - # region Evaluation - if training_args.do_eval: - num_examples = sum(1 for _ in ( - tf_eval_dataset.unbatch() if hasattr(tf_eval_dataset, "unbatch") else tf_eval_dataset)) - - if optim_args.int8: - model = tf.saved_model.load(training_args.output_dir) - else: - from intel_extension_for_transformers.transformers.utils.utility_tf import keras2SavedModel - model = keras2SavedModel(model) - - preds: np.ndarray = None - label_ids: np.ndarray = None - infer = model.signatures["serving_default"] - - if optim_args.accuracy_only: - iterations = 1 - warmup = 0 - else: - iterations = 10 - warmup = 5 - latency_list = [] - - for idx in range(iterations): - iteration_time = 0 - for i, (inputs, labels) in enumerate(tf_eval_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - - start = time.time() - results = infer(**inputs) - iteration_time += time.time() - start - if idx == 0: # only accumulate once all the preds and labels - if preds is None: - preds = results["Identity"].numpy() - else: - preds = np.append(preds, results["Identity"].numpy(), axis=0) - - if label_ids is None: - label_ids = labels[0].numpy() if isinstance( - labels, list) else labels.numpy() - else: - label_ids = np.append( - label_ids, - labels[0].numpy() - if isinstance(labels, list) else labels.numpy(), - axis=0) - latency_list.append(iteration_time) - logger.info("Iteration {} time: {} sec".format(idx, iteration_time)) - - loss = compute_metrics({"logits": preds}, label_ids) - logger.info("\nEvaluation result: ") - logger.info("Accuracy: {}".format(loss.numpy()[0])) - - average_iteration_time = np.array(latency_list[warmup:]).mean() - logger.info( - "Throughput: {} samples/sec".format( - num_examples / average_iteration_time) - ) - #endregion - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/examples/huggingface/tensorflow/multiple-choice/quantization/README.md b/examples/huggingface/tensorflow/multiple-choice/quantization/README.md deleted file mode 100644 index d204e4f0ae0..00000000000 --- a/examples/huggingface/tensorflow/multiple-choice/quantization/README.md +++ /dev/null @@ -1,34 +0,0 @@ -Step-by-Step -========= - -This document describes the step-by-step instructions for reproducing the quantization on models for the multiple choice tasks on the SWAG dataset. - -# Prerequisite -## 1. Installation - -Make sure you have installed Intel® Extension for Transformers and all the dependencies in the current example: - -```shell -pip install intel-extension-for-transformers -pip install -r requirements.txt -``` - -# Run - -## 1. Run Command (Shell) - -- Topology: - - distilbert_swag - -- To get the int8 model - -``` -bash run_tuning.sh --topology=[topology] -``` - -- To benchmark the int8 model - - -``` -bash run_benchmark.sh --topology=[topology] --mode=benchmark --int8=true -``` \ No newline at end of file diff --git a/examples/huggingface/tensorflow/multiple-choice/quantization/requirements.txt b/examples/huggingface/tensorflow/multiple-choice/quantization/requirements.txt deleted file mode 100644 index ffa62da04e1..00000000000 --- a/examples/huggingface/tensorflow/multiple-choice/quantization/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -datasets >= 1.17 -sentencepiece != 0.1.92 -protobuf -intel-tensorflow -transformers -accelerate \ No newline at end of file diff --git a/examples/huggingface/tensorflow/multiple-choice/quantization/run_benchmark.sh b/examples/huggingface/tensorflow/multiple-choice/quantization/run_benchmark.sh deleted file mode 100644 index d43bc97a53f..00000000000 --- a/examples/huggingface/tensorflow/multiple-choice/quantization/run_benchmark.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_benchmark - -} - -# init params -function init_params { - topology="distilbert_swag" - iters=100 - batch_size=16 - tuned_checkpoint=saved_results - cache_dir="cache" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --mode=*) - mode=$(echo $var |cut -f2 -d=) - ;; - --batch_size=*) - batch_size=$(echo $var |cut -f2 -d=) - ;; - --iters=*) - iters=$(echo ${var} |cut -f2 -d=) - ;; - --int8=*) - int8=$(echo ${var} |cut -f2 -d=) - ;; - --config=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - --worker=*) - worker=$(echo $var |cut -f2 -d=) - ;; - --task_index=*) - task_index=$(echo $var |cut -f2 -d=) - ;; - --cache_dir=*) - cache_dir=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - - -# run_benchmark -function run_benchmark { - extra_cmd='' - MAX_SEQ_LENGTH=128 - - if [[ ${mode} == "accuracy" ]]; then - mode_cmd=" --accuracy_only" - elif [[ ${mode} == "benchmark" ]]; then - mode_cmd=" --benchmark " - else - echo "Error: No such mode: ${mode}" - exit 1 - fi - - if [ "${topology}" = "distilbert_swag" ]; then - script="run_swag.py" - model_name_or_path="Rocketknight1/bert-base-uncased-finetuned-swag" - # add following parameters for quicker debugging - extra_cmd=$extra_cmd" --max_eval_samples 512" - fi - - if [[ ${int8} == "true" ]]; then - extra_cmd=$extra_cmd" --int8" - fi - echo $extra_cmd - - python -u ${script} \ - --model_name_or_path ${model_name_or_path} \ - --do_eval \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - ${mode_cmd} \ - ${extra_cmd} -} - -main "$@" diff --git a/examples/huggingface/tensorflow/multiple-choice/quantization/run_swag.py b/examples/huggingface/tensorflow/multiple-choice/quantization/run_swag.py deleted file mode 100644 index dff1ae14227..00000000000 --- a/examples/huggingface/tensorflow/multiple-choice/quantization/run_swag.py +++ /dev/null @@ -1,653 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -# Copyright The HuggingFace Team and The HuggingFace Inc. team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Fine-tuning the library models for multiple choice. -""" -# You can also adapt this script on your own multiple choice task. Pointers for this are left as comments. - -import json -import logging -import os -import sys -from dataclasses import dataclass, field -from itertools import chain -from pathlib import Path -from typing import Optional, Union -import numpy as np - -import datasets -import tensorflow as tf -from datasets import load_dataset - -import time - -import transformers -from transformers import ( - CONFIG_NAME, - TF2_WEIGHTS_NAME, - AutoConfig, - AutoTokenizer, - DefaultDataCollator, - HfArgumentParser, - PushToHubCallback, - TFAutoModelForMultipleChoice, - TFTrainingArguments, - create_optimizer, - set_seed, -) -from transformers.tokenization_utils_base import PreTrainedTokenizerBase -from transformers.utils import PaddingStrategy, check_min_version, send_example_telemetry -from transformers.trainer_utils import is_main_process - -logger = logging.getLogger(__name__) - - -# region Helper classes and functions - - -@dataclass -class DataCollatorForMultipleChoice: - """ - Data collator that will dynamically pad the inputs for multiple choice received. - Args: - tokenizer ([`PreTrainedTokenizer`] or [`PreTrainedTokenizerFast`]): - The tokenizer used for encoding the data. - padding (`bool`, `str` or [`~utils.PaddingStrategy`], *optional*, defaults to `True`): - Select a strategy to pad the returned sequences (according to the model's padding side and padding index) - among: - - `True` or `'longest'`: Pad to the longest sequence in the batch (or no padding if only a single sequence - if provided). - - `'max_length'`: Pad to a maximum length specified with the argument `max_length` or to the maximum - acceptable input length for the model if that argument is not provided. - - `False` or `'do_not_pad'` (default): No padding (i.e., can output a batch with sequences of different - lengths). - max_length (`int`, *optional*): - Maximum length of the returned list and optionally padding length (see above). - pad_to_multiple_of (`int`, *optional*): - If set will pad the sequence to a multiple of the provided value. - This is especially useful to enable the use of Tensor Cores on NVIDIA hardware with compute capability >= - 7.5 (Volta). - """ - - tokenizer: PreTrainedTokenizerBase - padding: Union[bool, str, PaddingStrategy] = True - max_length: Optional[int] = None - pad_to_multiple_of: Optional[int] = None - - def __call__(self, features): - label_name = "label" if "label" in features[0].keys() else "labels" - labels = [feature.pop(label_name) for feature in features] - batch_size = len(features) - num_choices = len(features[0]["input_ids"]) - flattened_features = [ - [{k: v[i] for k, v in feature.items()} for i in range(num_choices)] for feature in features - ] - flattened_features = list(chain(*flattened_features)) - - batch = self.tokenizer.pad( - flattened_features, - padding=self.padding, - max_length=self.max_length, - pad_to_multiple_of=self.pad_to_multiple_of, - return_tensors="tf", - ) - - # Un-flatten - batch = {k: tf.reshape(v, (batch_size, num_choices, -1)) for k, v in batch.items()} - # Add back labels - batch["labels"] = tf.convert_to_tensor(labels, dtype=tf.int64) - return batch - - -# endregion - -# region Arguments -@dataclass -class ModelArguments: - """ - Arguments pertaining to which model/config/tokenizer we are going to fine-tune from. - """ - - model_name_or_path: str = field( - metadata={"help": "Path to pretrained model or model identifier from huggingface.co/models"} - ) - config_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained config name or path if not the same as model_name"} - ) - tokenizer_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained tokenizer name or path if not the same as model_name"} - ) - cache_dir: Optional[str] = field( - default=None, - metadata={"help": "Where do you want to store the pretrained models downloaded from huggingface.co"}, - ) - use_fast_tokenizer: bool = field( - default=True, - metadata={"help": "Whether to use one of the fast tokenizer (backed by the tokenizers library) or not."}, - ) - model_revision: str = field( - default="main", - metadata={"help": "The specific model version to use (can be a branch name, tag name or commit id)."}, - ) - use_auth_token: bool = field( - default=False, - metadata={ - "help": ( - "Will use the token generated when running `huggingface-cli login` (necessary to use this script " - "with private models)." - ) - }, - ) - - -@dataclass -class DataTrainingArguments: - """ - Arguments pertaining to what data we are going to input our model for training and eval. - """ - - train_file: Optional[str] = field(default=None, metadata={"help": "The input training data file (a text file)."}) - validation_file: Optional[str] = field( - default=None, - metadata={"help": "An optional input evaluation data file to evaluate the perplexity on (a text file)."}, - ) - overwrite_cache: bool = field( - default=False, metadata={"help": "Overwrite the cached training and evaluation sets"} - ) - preprocessing_num_workers: Optional[int] = field( - default=None, - metadata={"help": "The number of processes to use for the preprocessing."}, - ) - max_seq_length: Optional[int] = field( - default=None, - metadata={ - "help": ( - "The maximum total input sequence length after tokenization. If passed, sequences longer " - "than this will be truncated, sequences shorter will be padded." - ) - }, - ) - pad_to_max_length: bool = field( - default=False, - metadata={ - "help": ( - "Whether to pad all samples to the maximum sentence length. " - "If False, will pad the samples dynamically when batching to the maximum length in the batch. More " - "efficient on GPU but very bad for TPU." - ) - }, - ) - max_train_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of training examples to this " - "value if set." - ) - }, - ) - max_eval_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of evaluation examples to this " - "value if set." - ) - }, - ) - - def __post_init__(self): - if self.train_file is not None: - extension = self.train_file.split(".")[-1] - assert extension in ["csv", "json"], "`train_file` should be a csv or a json file." - if self.validation_file is not None: - extension = self.validation_file.split(".")[-1] - assert extension in ["csv", "json"], "`validation_file` should be a csv or a json file." - - - -@dataclass -class OptimizationArguments: - """ - Arguments pertaining to what type of optimization we are going to apply on the model. - """ - - tune: bool = field( - default=False, - metadata={"help": "Whether or not to apply quantization."}, - ) - quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, - ) - metric_name: Optional[str] = field( - default=None, - metadata={"help": "Metric used for the tuning strategy."}, - ) - is_relative: Optional[bool] = field( - default=True, - metadata={"help": "Metric tolerance model, expected to be relative or absolute."}, - ) - perf_tol: Optional[float] = field( - default=0.01, - metadata={"help": "Performance tolerance when optimizing the model."}, - ) - benchmark: bool = field( - default=False, - metadata={"help": "run benchmark."}) - int8: bool = field( - default=False, - metadata={"help":"Whether to use the quantized int8 model."}) - accuracy_only: bool = field( - default=False, - metadata={"help":"Whether to only test accuracy for model tuned by Neural Compressor."}) - -@dataclass -class DistributedArguments: - """ - Arguments setting the distributed multinode environment - """ - - worker: str = field( - default=None, - metadata={"help": "List of node ip addresses in a string, and there should not be space between addresses."}, - ) - task_index: int = field( - default=0, - metadata={"help": "Worker index, and 0 represents the chief worker while other workers are set as 1,2,3..."}, - ) - -# endregion - - - -def main(): - # region Argument Parsing - parser = HfArgumentParser((ModelArguments, DataTrainingArguments, TFTrainingArguments, OptimizationArguments, DistributedArguments)) - if len(sys.argv) == 2 and sys.argv[1].endswith(".json"): - # If we pass only one argument to the script and it's the path to a json file, - # let's parse it to get our arguments. - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1])) - else: - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_args_into_dataclasses() - - output_dir = Path(training_args.output_dir) - output_dir.mkdir(parents=True, exist_ok=True) - # endregion - - # region Logging - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%m/%d/%Y %H:%M:%S", - handlers=[logging.StreamHandler(sys.stdout)], - ) - logger.setLevel(logging.INFO if is_main_process(training_args.local_rank) else logging.WARN) - - # Set the verbosity to info of the Transformers logger (on main process only): - if is_main_process(training_args.local_rank): - transformers.utils.logging.set_verbosity_info() - transformers.utils.logging.enable_default_handler() - transformers.utils.logging.enable_explicit_format() - logger.info(f"Training/evaluation parameters {training_args}") - # endregion - - # region Set the multinode environment, the strategy and paths - strategy = None - worker_list = None - if distributed_args.worker is not None: - logger.info("distributed environment initialization...") - - worker_list = distributed_args.worker.split(",") - - from intel_extension_for_transformers.transformers.utils.utility_tf import distributed_init - distributed_init(worker_list, "worker", distributed_args.task_index) - - strategy = tf.distribute.MultiWorkerMirroredStrategy() - from intel_extension_for_transformers.transformers.utils.utility_tf import get_filepath - training_args.output_dir = get_filepath(training_args.output_dir, strategy.cluster_resolver.task_type, strategy.cluster_resolver.task_id) - else: - strategy = training_args.strategy - #endregion - - # region Checkpoints - checkpoint = None - if len(os.listdir(training_args.output_dir)) > 0 and not training_args.overwrite_output_dir: - if (output_dir / CONFIG_NAME).is_file() and (output_dir / TF2_WEIGHTS_NAME).is_file(): - checkpoint = output_dir - logger.info( - f"Checkpoint detected, resuming training from checkpoint in {training_args.output_dir}. To avoid this" - " behavior, change the `--output_dir` or add `--overwrite_output_dir` to train from scratch." - ) - else: - raise ValueError( - f"Output directory ({training_args.output_dir}) already exists and is not empty. " - "Use --overwrite_output_dir to continue regardless." - ) - # endregion - - # Set seed before initializing model. - set_seed(training_args.seed) - - # region Load datasets - # Get the datasets: you can either provide your own CSV/JSON/TXT training and evaluation files (see below) - # or just provide the name of one of the public datasets available on the hub at https://huggingface.co/datasets/ - # (the dataset will be downloaded automatically from the datasets Hub). - - # For CSV/JSON files, this script will use the column called 'text' or the first column if no column called - # 'text' is found. You can easily tweak this behavior (see below). - - # In distributed training, the load_dataset function guarantee that only one local process can concurrently - # download the dataset. - if data_args.train_file is not None or data_args.validation_file is not None: - data_files = {} - if data_args.train_file is not None: - data_files["train"] = data_args.train_file - if data_args.validation_file is not None: - data_files["validation"] = data_args.validation_file - extension = data_args.train_file.split(".")[-1] - raw_datasets = load_dataset( - extension, - data_files=data_files, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - else: - # Downloading and loading the swag dataset from the hub. - raw_datasets = load_dataset( - "swag", - "regular", - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at - # https://huggingface.co/docs/datasets/loading_datasets.html. - - # When using your own dataset or a different dataset from swag, you will probably need to change this. - ending_names = [f"ending{i}" for i in range(4)] - context_name = "sent1" - question_header_name = "sent2" - # endregion - - # region Load model config and tokenizer - if checkpoint is not None: - config_path = training_args.output_dir - elif model_args.config_name: - config_path = model_args.config_name - else: - config_path = model_args.model_name_or_path - - # Distributed training: - # The .from_pretrained methods guarantee that only one local process can concurrently - # download model & vocab. - config = AutoConfig.from_pretrained( - config_path, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - _commit_hash="main", - ) - tokenizer = AutoTokenizer.from_pretrained( - model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path, - cache_dir=model_args.cache_dir, - use_fast=model_args.use_fast_tokenizer, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - _commit_hash="main", - ) - # endregion - - # region Dataset preprocessing - if data_args.max_seq_length is None: - max_seq_length = tokenizer.model_max_length - if max_seq_length > 1024: - logger.warning( - f"The tokenizer picked seems to have a very large `model_max_length` ({tokenizer.model_max_length}). " - "Picking 1024 instead. You can change that default value by passing --max_seq_length xxx." - ) - max_seq_length = 1024 - else: - if data_args.max_seq_length > tokenizer.model_max_length: - logger.warning( - f"The max_seq_length passed ({data_args.max_seq_length}) is larger than the maximum length for the" - f"model ({tokenizer.model_max_length}). Using max_seq_length={tokenizer.model_max_length}." - ) - max_seq_length = min(data_args.max_seq_length, tokenizer.model_max_length) - - def preprocess_function(examples): - first_sentences = [[context] * 4 for context in examples[context_name]] - question_headers = examples[question_header_name] - second_sentences = [ - [f"{header} {examples[end][i]}" for end in ending_names] for i, header in enumerate(question_headers) - ] - - # Flatten out - first_sentences = list(chain(*first_sentences)) - second_sentences = list(chain(*second_sentences)) - - # Tokenize - tokenized_examples = tokenizer(first_sentences, second_sentences, truncation=True, max_length=max_seq_length) - # Un-flatten - data = {k: [v[i : i + 4] for i in range(0, len(v), 4)] for k, v in tokenized_examples.items()} - return data - - - train_dataset = raw_datasets["train"] - if data_args.max_train_samples is not None: - max_train_samples = min(len(train_dataset), data_args.max_train_samples) - train_dataset = train_dataset.select(range(max_train_samples)) - train_dataset = train_dataset.map( - preprocess_function, - batched=True, - num_proc=data_args.preprocessing_num_workers, - load_from_cache_file=not data_args.overwrite_cache, - ) - - - eval_dataset = raw_datasets["validation"] - if data_args.max_eval_samples is not None: - max_eval_samples = min(len(eval_dataset), data_args.max_eval_samples) - eval_dataset = eval_dataset.select(range(max_eval_samples)) - eval_dataset = eval_dataset.map( - preprocess_function, - batched=True, - num_proc=data_args.preprocessing_num_workers, - load_from_cache_file=not data_args.overwrite_cache, - ) - - if data_args.pad_to_max_length: - data_collator = DefaultDataCollator(return_tensors="tf") - else: - # custom class defined above, as HF has no data collator for multiple choice - data_collator = DataCollatorForMultipleChoice(tokenizer) - # endregion - - with strategy.scope(): - # region Build model - if checkpoint is None: - model_path = model_args.model_name_or_path - else: - model_path = checkpoint - model = TFAutoModelForMultipleChoice.from_pretrained( - model_path, - config=config, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - ) - - num_replicas = training_args.strategy.num_replicas_in_sync - total_train_batch_size = training_args.per_device_train_batch_size * num_replicas - total_eval_batch_size = training_args.per_device_eval_batch_size * num_replicas - - num_train_steps = (len(train_dataset) // total_train_batch_size) * int(training_args.num_train_epochs) - if training_args.warmup_steps > 0: - num_warmup_steps = training_args.warmup_steps - elif training_args.warmup_ratio > 0: - num_warmup_steps = int(num_train_steps * training_args.warmup_ratio) - else: - num_warmup_steps = 0 - optimizer, lr_schedule = create_optimizer( - init_lr=training_args.learning_rate, - num_train_steps=num_train_steps, - num_warmup_steps=num_warmup_steps, - adam_beta1=training_args.adam_beta1, - adam_beta2=training_args.adam_beta2, - adam_epsilon=training_args.adam_epsilon, - weight_decay_rate=training_args.weight_decay, - adam_global_clipnorm=training_args.max_grad_norm, - ) - - - dataset_options = tf.data.Options() - dataset_options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF - - # model.prepare_tf_dataset() wraps a Hugging Face dataset in a tf.data.Dataset which is ready to use in - # training. This is the recommended way to use a Hugging Face dataset when training with Keras. You can also - # use the lower-level dataset.to_tf_dataset() method, but you will have to specify things like column names - # yourself if you use this method, whereas they are automatically inferred from the model input names when - # using model.prepare_tf_dataset() - # For more info see the docs: - # https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.prepare_tf_dataset - # https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.to_tf_dataset - - tf_train_dataset = model.prepare_tf_dataset( - train_dataset, - shuffle=True, - batch_size=total_train_batch_size, - collate_fn=data_collator, - ).with_options(dataset_options) - - tf_eval_dataset = model.prepare_tf_dataset( - eval_dataset, - shuffle=False, - batch_size=total_eval_batch_size, - collate_fn=data_collator, - drop_remainder=True, - ).with_options(dataset_options) - - model.compile(optimizer=optimizer, metrics=["accuracy"], jit_compile=training_args.xla) - # endregion - - def compute_metrics(preds, labels): - predictions = preds["logits"] - preds = np.argmax(predictions, axis=1) - return {"accuracy": (preds == labels).astype(np.float32).mean().item()} - - # region tuning - if optim_args.tune: - from intel_extension_for_transformers.transformers import metrics, objectives, QuantizationConfig, TFOptimization - optimization = TFOptimization( - model=model, - args=training_args, - train_dataset=tf_train_dataset, - eval_dataset=tf_eval_dataset, - compute_metrics=compute_metrics, - task_type=strategy.cluster_resolver.task_type if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - task_id=strategy.cluster_resolver.task_id if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - ) - - # use customized eval function - tune_metric = metrics.Metric( - name="accuracy", greater_is_better=True, is_relative=True, criterion=optim_args.perf_tol, - ) - quantization_config = QuantizationConfig( - framework="tensorflow", - approach="POSTTRAININGSTATIC", - metrics=[tune_metric], - objectives=[objectives.performance] - ) - quantized_model = optimization.quantize(quant_config=quantization_config) - exit(0) - # endregion - - # region Training - eval_metrics = None - if training_args.do_train: - history = model.fit( - tf_train_dataset, - validation_data=tf_eval_dataset, - epochs=int(training_args.num_train_epochs), - ) - model.save("finetuned_model") - eval_metrics = {key: val[-1] for key, val in history.history.items()} - # endregion - - # region Evaluation - if training_args.do_eval: - num_examples = sum(1 for _ in ( - tf_eval_dataset.unbatch() if hasattr(tf_eval_dataset, "unbatch") else tf_eval_dataset)) - - if optim_args.int8: - model = tf.saved_model.load(training_args.output_dir) - else: - from intel_extension_for_transformers.transformers.utils.utility_tf import keras2SavedModel - model = keras2SavedModel(model) - - logger.info(f"***** Running Evaluation *****") - logger.info(f" Num examples in dataset = {num_examples}") - logger.info(f" Batch size = {training_args.per_device_eval_batch_size}") - - preds: np.ndarray = None - label_ids: np.ndarray = None - infer = model.signatures["serving_default"] - - if optim_args.accuracy_only: - iterations = 1 - warmup = 0 - else: - iterations = 10 - warmup = 5 - latency_list = [] - - for idx in range(iterations): - iteration_time = 0 - for i, (inputs, labels) in enumerate(tf_eval_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - - start = time.time() - results = infer(**inputs) - iteration_time += time.time() - start - if idx == 0: # only accumulate once all the preds and labels - if preds is None: - preds = results["Identity"].numpy() - else: - preds = np.append(preds, results["Identity"].numpy(), axis=0) - if label_ids is None: - label_ids = labels[0].numpy() if isinstance( - labels, list) else labels.numpy() - else: - label_ids = np.append( - label_ids, - labels[0].numpy() if isinstance(labels, list) else labels.numpy(), - axis=0) - latency_list.append(iteration_time) - logger.info("Iteration {} time: {} sec".format(idx, iteration_time)) - - test_predictions = {"logits": preds} - eval_metrics = compute_metrics(test_predictions, label_ids) - logger.info("\nEvaluation result: ") - logger.info("Accuracy: {}".format(eval_metrics["accuracy"])) - - average_iteration_time = np.array(latency_list[warmup:]).mean() - logger.info( - "Throughput: {} samples/sec".format( - num_examples / average_iteration_time) - ) - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/examples/huggingface/tensorflow/multiple-choice/quantization/run_tuning.sh b/examples/huggingface/tensorflow/multiple-choice/quantization/run_tuning.sh deleted file mode 100644 index 79e6c5b7e87..00000000000 --- a/examples/huggingface/tensorflow/multiple-choice/quantization/run_tuning.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_tuning - -} - -# init params -function init_params { - topology="distilbert" - tuned_checkpoint="saved_results" - extra_cmd="" - batch_size=8 - MAX_SEQ_LENGTH=128 - model_type="bert" - approach="PostTrainingStatic" - cache_dir="cache" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --output_model=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - --worker=*) - worker=$(echo $var |cut -f2 -d=) - ;; - --task_index=*) - task_index=$(echo $var |cut -f2 -d=) - ;; - --cache_dir=*) - cache_dir=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - -# run_tuning -function run_tuning { - if [ "${topology}" = "distilbert_swag" ]; then - script="run_swag.py" - model_name_or_path="Rocketknight1/bert-base-uncased-finetuned-swag" - approach="PostTrainingStatic" - # add following parameters for quicker debugging - extra_cmd=$extra_cmd" --max_train_samples 512 --max_eval_samples 1024 --perf_tol 0.035" - fi - - if [ "${worker}" = "" ] - then - python -u ${script} \ - --model_name_or_path ${model_name_or_path} \ - --output_dir ${tuned_checkpoint} \ - --quantization_approach ${approach} \ - --do_train \ - --tune \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - ${extra_cmd} - else - python -u ${script} \ - --model_name_or_path ${model_name_or_path} \ - --task_name ${TASK_NAME} \ - --output_dir ${tuned_checkpoint} \ - --quantization_approach ${approach} \ - --do_train \ - --tune \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --worker "${worker}" \ - --task_index ${task_index} \ - ${extra_cmd} - fi -} - -main "$@" diff --git a/examples/huggingface/tensorflow/text-classification/pruning/README.md b/examples/huggingface/tensorflow/text-classification/pruning/README.md deleted file mode 100644 index b636b9de404..00000000000 --- a/examples/huggingface/tensorflow/text-classification/pruning/README.md +++ /dev/null @@ -1,86 +0,0 @@ -Step-by-Step -========= - -This document describes the step-by-step instructions for reproducing the pruning on models for the text classification (GLUE) tasks. - -# Prerequisite -## 1. Installation - -Make sure you have installed Intel® Extension for Transformers and all the dependencies in the current example: - -```shell -pip install intel-extension-for-transformers -pip install -r requirements.txt -pip install transformers==4.34.1 -``` ->**Note**: Please use transformers no higher than 4.34.1 - - -# Run - -## 1. Run Command (Shell) - -- Topology: - - distilbert_base_sst2 - -``` -bash run_tuning.sh --topology=[topology] -``` - -``` -bash run_benchmark.sh --topology=[topology] --mode=benchmark --use_pruned_model=true -``` - -## 2. Run Command (Python) - -``` -python run_glue.py \ - --model_name_or_path distilbert-base-uncased-finetuned-sst-2-english \ - --task_name sst2 \ - --prune \ - --do_train \ - --do_eval \ - --output_dir ./tmp/sst2_output \ - --overwrite_output_dir -``` - -# Multi-node Usage - -We also supported Distributed Data Parallel training on multi nodes settings for pruning. - -The default strategy we used is `MultiWorkerMirroredStrategy` in Tensorflow, and with `task_type` set as "worker", we are expected to pass following extra parameters to the script: - -* `worker`: a string of your worker ip addresses which is separated by comma and there should not be space between each two of them - -* `task_index`: 0 should be set on the chief node (leader) and 1, 2, 3... should be set as the rank of other follower nodes - -## Multi-node Example - -* On leader node - -``` -bash run_tuning.sh --topology=distilbert_base_sst2 --worker="localhost:12345,localhost:23456" --task_index=0 -``` - -which is equal to - -``` -python run_glue.py \ - --model_name_or_path distilbert-base-uncased-finetuned-sst-2-english \ - --task_name sst2 \ - --prune \ - --do_train \ - --do_eval \ - --output_dir ./tmp/sst2_output \ - --overwrite_output_dir \ - --worker "localhost:12345,localhost:23456" \ - --task_index 0 -``` - -* On follower node - -``` -bash run_tuning.sh --topology=distilbert_base_sst2 --worker="localhost:12345,localhost:23456" --task_index=1 -``` - -Please replace the worker ip address list with your own. diff --git a/examples/huggingface/tensorflow/text-classification/pruning/requirements.txt b/examples/huggingface/tensorflow/text-classification/pruning/requirements.txt deleted file mode 100644 index 245a729ec94..00000000000 --- a/examples/huggingface/tensorflow/text-classification/pruning/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -accelerate -datasets >= 1.17 -sentencepiece != 0.1.92 -protobuf -intel-tensorflow -transformers diff --git a/examples/huggingface/tensorflow/text-classification/pruning/run_benchmark.sh b/examples/huggingface/tensorflow/text-classification/pruning/run_benchmark.sh deleted file mode 100644 index 76c9b07045f..00000000000 --- a/examples/huggingface/tensorflow/text-classification/pruning/run_benchmark.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_benchmark - -} - -# init params -function init_params { - iters=100 - batch_size=64 - tuned_checkpoint=saved_results - topology="distilbert_base_sst2" - mode="benchmark" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --mode=*) - mode=$(echo $var |cut -f2 -d=) - ;; - --batch_size=*) - batch_size=$(echo $var |cut -f2 -d=) - ;; - --iters=*) - iters=$(echo ${var} |cut -f2 -d=) - ;; - --use_pruned_model=*) - use_pruned_model=$(echo ${var} |cut -f2 -d=) - ;; - --config=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - - -# run_benchmark -function run_benchmark { - extra_cmd='' - MAX_SEQ_LENGTH=128 - - if [[ ${mode} == "accuracy" ]]; then - mode_cmd=" --accuracy_only" - elif [[ ${mode} == "benchmark" ]]; then - mode_cmd=" --benchmark " - else - echo "Error: No such mode: ${mode}" - exit 1 - fi - - if [ "${topology}" = "distilbert_base_sst2" ]; then - TASK_NAME='sst2' - model_name_or_path=distilbert-base-uncased-finetuned-sst-2-english - fi - - if [[ ${use_pruned_model} == "true" ]]; then - extra_cmd=$extra_cmd" --use_pruned_model" - fi - - python -u ./run_glue.py \ - --model_name_or_path ${model_name_or_path} \ - --task_name ${TASK_NAME} \ - --do_eval \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --overwrite_cache \ - ${mode_cmd} \ - ${extra_cmd} - -} - -main "$@" diff --git a/examples/huggingface/tensorflow/text-classification/pruning/run_glue.py b/examples/huggingface/tensorflow/text-classification/pruning/run_glue.py deleted file mode 100644 index 67c35ff2471..00000000000 --- a/examples/huggingface/tensorflow/text-classification/pruning/run_glue.py +++ /dev/null @@ -1,689 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -# Copyright 2020 The HuggingFace Inc. team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" Finetuning the library models for sequence classification on GLUE.""" -# You can also adapt this script on your own text classification task. Pointers for this are left as comments. - -import logging -import os -import sys -import numpy as np -import tensorflow as tf -import time -import transformers -from dataclasses import dataclass, field -from typing import Optional - -from datasets import load_dataset, load_metric - -from transformers import ( - AutoConfig, - AutoTokenizer, - DataCollatorWithPadding, - DefaultDataCollator, - HfArgumentParser, - PretrainedConfig, - TFAutoModelForSequenceClassification, - TFTrainingArguments, - set_seed, -) -from transformers.trainer_utils import get_last_checkpoint, is_main_process -from transformers.utils import check_min_version - - -# region Helper functions - - -class SavePretrainedCallback(tf.keras.callbacks.Callback): - # Hugging Face models have a save_pretrained() method that saves both the weights and the necessary - # metadata to allow them to be loaded as a pretrained model in future. This is a simple Keras callback - # that saves the model with this method after each epoch. - def __init__(self, output_dir, **kwargs): - super().__init__() - self.output_dir = output_dir - - def on_epoch_end(self, epoch, logs=None): - self.model.save_pretrained(self.output_dir) - - -# endregion - - -# Will error if the minimal version of Transformers is not installed. Remove at your own risks. -check_min_version("4.17.0") - -task_to_keys = { - "cola": ("sentence", None), - "mnli": ("premise", "hypothesis"), - "mrpc": ("sentence1", "sentence2"), - "qnli": ("question", "sentence"), - "qqp": ("question1", "question2"), - "rte": ("sentence1", "sentence2"), - "sst2": ("sentence", None), - "stsb": ("sentence1", "sentence2"), - "wnli": ("sentence1", "sentence2"), -} - -logger = logging.getLogger(__name__) - - -# region Command-line arguments -@dataclass -class DataTrainingArguments: - """ - Arguments pertaining to what data we are going to input our model for training and eval. - - Using `HfArgumentParser` we can turn this class - into argparse arguments to be able to specify them on - the command line. - """ - - task_name: str = field( - metadata={"help": "The name of the task to train on: " + ", ".join(task_to_keys.keys())}, - ) - predict_file: str = field( - metadata={"help": "A file containing user-supplied examples to make predictions for"}, - default=None, - ) - max_seq_length: int = field( - default=128, - metadata={ - "help": "The maximum total input sequence length after tokenization. Sequences longer " - "than this will be truncated, sequences shorter will be padded." - }, - ) - overwrite_cache: bool = field( - default=False, metadata={"help": "Overwrite the cached preprocessed datasets or not."} - ) - pad_to_max_length: bool = field( - default=False, - metadata={ - "help": "Whether to pad all samples to `max_seq_length`. " - "If False, will pad the samples dynamically when batching to the maximum length in the batch." - }, - ) - max_train_samples: Optional[int] = field( - default=None, - metadata={ - "help": "For debugging purposes or quicker training, truncate the number of training examples to this " - "value if set." - }, - ) - max_eval_samples: Optional[int] = field( - default=None, - metadata={ - "help": "For debugging purposes or quicker training, truncate the number of evaluation examples to this " - "value if set." - }, - ) - max_predict_samples: Optional[int] = field( - default=None, - metadata={ - "help": "For debugging purposes or quicker training, truncate the number of prediction examples to this " - "value if set." - }, - ) - - def __post_init__(self): - self.task_name = self.task_name.lower() - if self.task_name not in task_to_keys.keys(): - raise ValueError("Unknown task, you should pick one in " + ",".join(task_to_keys.keys())) - - -@dataclass -class ModelArguments: - """ - Arguments pertaining to which model/config/tokenizer we are going to fine-tune from. - """ - - model_name_or_path: str = field( - metadata={"help": "Path to pretrained model or model identifier from huggingface.co/models"} - ) - config_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained config name or path if not the same as model_name"} - ) - tokenizer_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained tokenizer name or path if not the same as model_name"} - ) - cache_dir: Optional[str] = field( - default=None, - metadata={"help": "Where do you want to store the pretrained models downloaded from huggingface.co"}, - ) - use_fast_tokenizer: bool = field( - default=True, - metadata={"help": "Whether to use one of the fast tokenizer (backed by the tokenizers library) or not."}, - ) - model_revision: str = field( - default="main", - metadata={"help": "The specific model version to use (can be a branch name, tag name or commit id)."}, - ) - use_auth_token: bool = field( - default=False, - metadata={ - "help": "Will use the token generated when running `transformers-cli login` (necessary to use this script " - "with private models)." - }, - ) - - -@dataclass -class OptimizationArguments: - """ - Arguments pertaining to what type of optimization we are going to apply on the model. - """ - - prune: bool = field( - default=False, - metadata={"help": "Whether or not to apply prune."}, - ) - pruning_approach: Optional[str] = field( - default="BasicMagnitude", - metadata={"help": "Pruning approach. Supported approach is basic_magnite."}, - ) - target_sparsity_ratio: Optional[float] = field( - default=None, - metadata={"help": "Targeted sparsity when pruning the model."}, - ) - metric_name: Optional[str] = field( - default=None, - metadata={"help": "Metric used for the tuning strategy."}, - ) - tolerance_mode: Optional[str] = field( - default="relative", - metadata={"help": "Metric tolerance model, expected to be relative or absolute."}, - ) - perf_tol: Optional[float] = field( - default=0.01, - metadata={"help": "Performance tolerance when optimizing the model."}, - ) - benchmark: bool = field( - default=False, - metadata={"help": "Run benchmark."}) - use_pruned_model: bool = field( - default=False, - metadata={"help":"Whether to use pretrained pruned model."}) - accuracy_only: bool = field( - default=False, - metadata={"help":"Whether to only test accuracy for model tuned by Neural Compressor."}) - -@dataclass -class DistributedArguments: - """ - Arguments setting the distributed multinode environment - """ - - worker: str = field( - default=None, - metadata={"help": "List of node ip addresses in a string, and there should not be space between addresses."}, - ) - task_index: int = field( - default=0, - metadata={"help": "Worker index, and 0 represents the chief worker while other workers are set as 1,2,3..."}, - ) -# endregion - -def main(): - # region Argument parsing - # See all possible arguments in src/transformers/training_args.py - # or by passing the --help flag to this script. - # We now keep distinct sets of args, for a cleaner separation of concerns. - - parser = HfArgumentParser((ModelArguments, DataTrainingArguments, TFTrainingArguments, OptimizationArguments, DistributedArguments)) - if len(sys.argv) == 2 and sys.argv[1].endswith(".json"): - # If we pass only one argument to the script and it's the path to a json file, - # let's parse it to get our arguments. - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1])) - else: - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_args_into_dataclasses() - - if not (training_args.do_train or training_args.do_eval or training_args.do_predict): - exit("Must specify at least one of --do_train, --do_eval or --do_predict!") - # endregion - - # region Set the multinode environment, the strategy and paths - strategy = None - worker_list = None - if distributed_args.worker is not None: - logger.info("distributed environment initialization...") - - worker_list = distributed_args.worker.split(",") - - from intel_extension_for_transformers.transformers.utils.utility_tf import distributed_init - distributed_init(worker_list, "worker", distributed_args.task_index) - - strategy = tf.distribute.MultiWorkerMirroredStrategy() - from intel_extension_for_transformers.transformers.utils.utility_tf import get_filepath - training_args.output_dir = get_filepath(training_args.output_dir, strategy.cluster_resolver.task_type, strategy.cluster_resolver.task_id) - else: - strategy = training_args.strategy - #endregion - - # region Checkpoints - checkpoint = None - if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir: - checkpoint = get_last_checkpoint(training_args.output_dir) - if checkpoint is None and len(os.listdir(training_args.output_dir)) > 0: - raise ValueError( - f"Output directory ({training_args.output_dir}) already exists and is not empty. " - "Use --overwrite_output_dir to overcome." - ) - elif checkpoint is not None and training_args.resume_from_checkpoint is None: - logger.info( - f"Checkpoint detected, resuming training at {checkpoint}. To avoid this behavior, change " - "the `--output_dir` or add `--overwrite_output_dir` to train from scratch." - ) - # endregion - - # region Logging - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%m/%d/%Y %H:%M:%S", - handlers=[logging.StreamHandler(sys.stdout)], - ) - logger.setLevel(logging.INFO if is_main_process(training_args.local_rank) else logging.WARN) - - # Set the verbosity to info of the Transformers logger (on main process only): - if is_main_process(training_args.local_rank): - transformers.utils.logging.set_verbosity_info() - transformers.utils.logging.enable_default_handler() - transformers.utils.logging.enable_explicit_format() - logger.info(f"Training/evaluation parameters {training_args}") - # endregion - - # region Dataset and labels - # Set seed before initializing model. - set_seed(training_args.seed) - - # Downloading and loading a dataset from the hub. In distributed training, the load_dataset function guarantee - # that only one local process can concurrently download the dataset. - datasets = load_dataset( - "glue", - data_args.task_name, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - # See more about loading any type of standard or custom dataset at - # https://huggingface.co/docs/datasets/loading_datasets.html. - - is_regression = data_args.task_name == "stsb" - if not is_regression: - label_list = datasets["train"].features["label"].names - num_labels = len(label_list) - else: - num_labels = 1 - - if data_args.predict_file is not None: - logger.info("Preparing user-supplied file for predictions...") - - data_files = {"data": data_args.predict_file} - - for key in data_files.keys(): - logger.info(f"Loading a local file for {key}: {data_files[key]}") - - if data_args.predict_file.endswith(".csv"): - # Loading a dataset from local csv files - user_dataset = load_dataset("csv", data_files=data_files, cache_dir=model_args.cache_dir) - else: - # Loading a dataset from local json files - user_dataset = load_dataset("json", data_files=data_files, cache_dir=model_args.cache_dir) - needed_keys = task_to_keys[data_args.task_name] - for key in needed_keys: - assert key in user_dataset["data"].features, f"Your supplied predict_file is missing the {key} key!" - datasets["user_data"] = user_dataset["data"] - # endregion - - # region Load model config and tokenizer - # - # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently - # download model & vocab. - config = AutoConfig.from_pretrained( - model_args.config_name if model_args.config_name else model_args.model_name_or_path, - num_labels=num_labels, - finetuning_task=data_args.task_name, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - ) - tokenizer = AutoTokenizer.from_pretrained( - model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path, - cache_dir=model_args.cache_dir, - use_fast=model_args.use_fast_tokenizer, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - ) - # endregion - - # region Dataset preprocessing - sentence1_key, sentence2_key = task_to_keys[data_args.task_name] - non_label_column_names = [name for name in datasets["train"].column_names if name != "label"] - - # Padding strategy - if data_args.pad_to_max_length: - padding = "max_length" - else: - # We will pad later, dynamically at batch creation, to the max sequence length in each batch - padding = False - - # Some models have set the order of the labels to use, so let's make sure we do use it. - label_to_id = None - if config.label2id != PretrainedConfig(num_labels=num_labels).label2id and not is_regression: - # Some have all caps in their config, some don't. - label_name_to_id = {k.lower(): v for k, v in config.label2id.items()} - if list(sorted(label_name_to_id.keys())) == list(sorted(label_list)): - label_to_id = {i: int(label_name_to_id[label_list[i]]) for i in range(num_labels)} - else: - logger.warning( - "Your model seems to have been trained with labels, but they don't match the dataset: ", - f"model labels: {list(sorted(label_name_to_id.keys()))}, dataset labels: {list(sorted(label_list))}." - "\nIgnoring the model labels as a result.", - ) - label_to_id = {label: i for i, label in enumerate(label_list)} - if label_to_id is not None: - config.label2id = label_to_id - config.id2label = {id: label for label, id in config.label2id.items()} - elif data_args.task_name is not None and not is_regression: - config.label2id = {l: i for i, l in enumerate(label_list)} - config.id2label = {id: label for label, id in config.label2id.items()} - - if data_args.max_seq_length > tokenizer.model_max_length: - logger.warning( - f"The max_seq_length passed ({data_args.max_seq_length}) is larger than the maximum length for the" - f"model ({tokenizer.model_max_length}). Using max_seq_length={tokenizer.model_max_length}." - ) - max_seq_length = min(data_args.max_seq_length, tokenizer.model_max_length) - - def preprocess_function(examples): - # Tokenize the texts - args = ( - (examples[sentence1_key],) if sentence2_key is None else (examples[sentence1_key], examples[sentence2_key]) - ) - result = tokenizer(*args, padding=padding, max_length=max_seq_length, truncation=True) - - return result - - datasets = datasets.map(preprocess_function, batched=True, load_from_cache_file=not data_args.overwrite_cache) - - if data_args.pad_to_max_length: - data_collator = DefaultDataCollator(return_tensors="tf") - else: - data_collator = DataCollatorWithPadding(tokenizer, return_tensors="tf") - # endregion - - # region Metric function - metric = load_metric("glue", data_args.task_name) - - def compute_metrics(preds, label_ids): - preds = preds["logits"] - preds = np.squeeze(preds) if is_regression else np.argmax(preds, axis=1) - result = metric.compute(predictions=preds, references=label_ids) - if len(result) > 1: - result["combined_score"] = np.mean(list(result.values())).item() - return result - # endregion - - if distributed_args.worker is None: - strategy = training_args.strategy - - with strategy.scope(): - # region Load pretrained model - if checkpoint is None: - model_path = model_args.model_name_or_path - else: - model_path = checkpoint - model = TFAutoModelForSequenceClassification.from_pretrained( - model_path, - config=config, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - ) - # endregion - - # region Optimizer, loss and compilation - optimizer = tf.keras.optimizers.Adam( - learning_rate=training_args.learning_rate, - beta_1=training_args.adam_beta1, - beta_2=training_args.adam_beta2, - epsilon=training_args.adam_epsilon, - clipnorm=training_args.max_grad_norm, - ) - if is_regression: - loss_fn = tf.keras.losses.MeanSquaredError() - metrics = [] - else: - loss_fn = tf.keras.losses.SparseCategoricalCrossentropy( - from_logits=True, reduction=tf.keras.losses.Reduction.SUM - ) - metrics = ["accuracy"] - model.compile(optimizer=optimizer, loss=loss_fn, metrics=metrics) - # endregion - - # region Convert data to a tf.data.Dataset - tf_data = dict() - max_samples = { - "train": data_args.max_train_samples, - "validation": data_args.max_eval_samples, - "validation_matched": data_args.max_eval_samples, - "validation_mismatched": data_args.max_eval_samples, - "test": data_args.max_predict_samples, - "test_matched": data_args.max_predict_samples, - "test_mismatched": data_args.max_predict_samples, - "user_data": None, - } - - for key in datasets.keys(): - if key == "train" or key.startswith("validation"): - assert "label" in datasets[key].features, f"Missing labels from {key} data!" - if key == "train": - shuffle = True - batch_size = training_args.per_device_train_batch_size * (len(worker_list) if worker_list is not None else 1) - drop_remainder = True # Saves us worrying about scaling gradients for the last batch - else: - shuffle = False - batch_size = training_args.per_device_eval_batch_size * (len(worker_list) if worker_list is not None else 1) - drop_remainder = False - samples_limit = max_samples[key] - dataset = datasets[key] - if samples_limit is not None: - dataset = dataset.select(range(samples_limit)) - data = dataset.to_tf_dataset( - columns=[col for col in dataset.column_names if col not in set(non_label_column_names + ["label"])], - shuffle=shuffle, - batch_size=batch_size, - collate_fn=data_collator, - drop_remainder=drop_remainder, - # `label_cols` is needed for user-defined losses, such as in this example - # datasets v2.3.x need "labels", not "label" - label_cols=["labels"] if "label" in dataset.column_names else None, - ) - tf_data[key] = data - # endregion - - # region Pruning - if optim_args.prune: - from intel_extension_for_transformers.transformers import metrics, PrunerConfig, PruningConfig, TFOptimization - optimization = TFOptimization( - model=model, - args=training_args, - train_dataset=tf_data["train"], - eval_dataset=tf_data["validation"], - compute_metrics=compute_metrics, - criterion=loss_fn, - optimizer=optimizer, - task_type=strategy.cluster_resolver.task_type if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - task_id=strategy.cluster_resolver.task_id if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - ) - tune_metric = metrics.Metric( - name="accuracy", greater_is_better=True, is_relative=True, criterion=0.01, - ) - prune_type = 'BasicMagnitude' \ - if optim_args.pruning_approach else optim_args.pruning_approach - target_sparsity_ratio = None \ - if optim_args.target_sparsity_ratio is None else optim_args.target_sparsity_ratio - pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio) - pruning_conf = PruningConfig( - epochs=int(training_args.num_train_epochs), pruner_config=pruner_config, metrics=tune_metric, - framework="tensorflow" - ) - p_model = optimization.prune(pruning_config=pruning_conf) - return - # endregion - - # region Training and validation - if training_args.do_train: - callbacks = [SavePretrainedCallback(output_dir=training_args.output_dir)] - if training_args.do_eval and not data_args.task_name == "mnli": - # Do both evaluation and training in the Keras fit loop, unless the task is MNLI - # because MNLI has two validation sets - validation_data = tf_data["validation"] - else: - validation_data = None - model.fit( - tf_data["train"], - validation_data=validation_data, - epochs=int(training_args.num_train_epochs), - callbacks=callbacks, - ) - # endregion - - # region Evaluation - if training_args.do_eval: - # We normally do validation as part of the Keras fit loop, but we run it independently - # if there was no fit() step (because we didn't train the model) or if the task is MNLI, - # because MNLI has a separate validation-mismatched validation set - logger.info("*** Evaluate ***") - - # Loop to handle MNLI double evaluation (matched, mis-matched) - if data_args.task_name == "mnli": - tasks = ["mnli", "mnli-mm"] - tf_datasets = [tf_data["validation_matched"], tf_data["validation_mismatched"]] - raw_datasets = [datasets["validation_matched"], datasets["validation_mismatched"]] - else: - tasks = [data_args.task_name] - tf_datasets = [tf_data["validation"]] - raw_datasets = [datasets["validation"]] - - total_time = 0 - num_examples = 0 - if optim_args.use_pruned_model: - model = tf.saved_model.load(training_args.output_dir) - for raw_dataset, tf_dataset, task in zip(raw_datasets, tf_datasets, - tasks): - num_examples += sum( - 1 for _ in (tf_dataset.unbatch() - if hasattr(tf_dataset, "unbatch") else tf_dataset - ) - ) - if optim_args.use_pruned_model: - preds: np.ndarray = None - label_ids: np.ndarray = None - infer = model.signatures[list(model.signatures.keys())[0]] - for i, (inputs, labels) in enumerate(tf_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - start = time.time() - results = infer(**inputs) - total_time += time.time() - start - for val in results: - if preds is None: - preds = results[val].numpy() - else: - preds = np.append(preds, results[val].numpy(), axis=0) - if label_ids is None: - label_ids = labels.numpy() - else: - label_ids = np.append(label_ids, labels.numpy(), axis=0) - eval_metrics = compute_metrics({"logits": preds}, label_ids) - else: - start = time.time() - eval_predictions = model.predict(tf_dataset) - total_time += time.time() - start - eval_metrics = compute_metrics(eval_predictions, raw_dataset["label"]) - print(f"Evaluation metrics ({task}):") - print(eval_metrics) - - logger.info("metric ({}) Accuracy: {}".format(task, eval_metrics["accuracy"])) - logger.info( - "Throughput: {} samples/sec".format( - num_examples / total_time) - ) - # endregion - - # region Prediction - if training_args.do_predict or data_args.predict_file: - logger.info("*** Predict ***") - - # Loop to handle MNLI double evaluation (matched, mis-matched) - tasks = [] - tf_datasets = [] - raw_datasets = [] - if training_args.do_predict: - if data_args.task_name == "mnli": - tasks.extend(["mnli", "mnli-mm"]) - tf_datasets.extend([tf_data["test_matched"], tf_data["test_mismatched"]]) - raw_datasets.extend([datasets["test_matched"], datasets["test_mismatched"]]) - else: - tasks.append(data_args.task_name) - tf_datasets.append(tf_data["test"]) - raw_datasets.append(datasets["test"]) - if data_args.predict_file: - tasks.append("user_data") - tf_datasets.append(tf_data["user_data"]) - raw_datasets.append(datasets["user_data"]) - - if optim_args.use_pruned_model: - model = tf.saved_model.load(training_args.output_dir) - - for raw_dataset, tf_dataset, task in zip(raw_datasets, tf_datasets, tasks): - if optim_args.use_pruned_model: - preds: np.ndarray = None - infer = model.signatures[list(model.signatures.keys())[0]] - for i, (inputs, labels) in enumerate(tf_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - results = infer(**inputs) - for val in results: - if preds is None: - preds = results[val].numpy() - else: - preds = np.append(preds, results[val].numpy(), axis=0) - test_predictions = {"logits": preds} - else: - test_predictions = model.predict(tf_dataset) - if "label" in raw_dataset: - test_metrics = compute_metrics(test_predictions, raw_dataset["label"]) - print(f"Test metrics ({task}):") - print(test_metrics) - - if is_regression: - predictions_to_write = np.squeeze(test_predictions["logits"]) - else: - predictions_to_write = np.argmax(test_predictions["logits"], axis=1) - - output_predict_file = os.path.join(training_args.output_dir, f"predict_results_{task}.txt") - with open(output_predict_file, "w") as writer: - logger.info(f"***** Writing prediction results for {task} *****") - writer.write("index\tprediction\n") - for index, item in enumerate(predictions_to_write): - if is_regression: - writer.write(f"{index}\t{item:3.3f}\n") - else: - item = config.id2label[item] - writer.write(f"{index}\t{item}\n") - # endregion - - -if __name__ == "__main__": - main() diff --git a/examples/huggingface/tensorflow/text-classification/pruning/run_tuning.sh b/examples/huggingface/tensorflow/text-classification/pruning/run_tuning.sh deleted file mode 100644 index 3fca9c69a4f..00000000000 --- a/examples/huggingface/tensorflow/text-classification/pruning/run_tuning.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_tuning - -} - -# init params -function init_params { - tuned_checkpoint=saved_results - topology="distilbert_base_sst2" - # topology="bert_base_mrpc_static" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --output_model=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - --worker=*) - worker=$(echo $var |cut -f2 -d=) - ;; - --task_index=*) - task_index=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - -# run_tuning -function run_tuning { - extra_cmd='' - batch_size=64 - if [ "${topology}" = "distilbert_base_sst2" ]; then - TASK_NAME='sst2' - model_name_or_path=distilbert-base-uncased-finetuned-sst-2-english - fi - - if [ "${worker}" = "" ] - then - python -u ./run_glue.py \ - --model_name_or_path ${model_name_or_path} \ - --task_name ${TASK_NAME} \ - --target_sparsity_ratio 0.1 \ - --prune \ - --do_eval \ - --do_train \ - --per_device_train_batch_size ${batch_size} \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --overwrite_output_dir \ - --overwrite_cache - else - python -u ./run_glue.py \ - --model_name_or_path ${model_name_or_path} \ - --task_name ${TASK_NAME} \ - --target_sparsity_ratio 0.1 \ - --prune \ - --do_eval \ - --do_train \ - --per_device_train_batch_size ${batch_size} \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --overwrite_output_dir \ - --overwrite_cache \ - --worker "${worker}" \ - --task_index ${task_index} \ - ${extra_cmd} - fi -} - -main "$@" diff --git a/examples/huggingface/tensorflow/text-classification/quantization/README.md b/examples/huggingface/tensorflow/text-classification/quantization/README.md deleted file mode 100644 index b590228ad0d..00000000000 --- a/examples/huggingface/tensorflow/text-classification/quantization/README.md +++ /dev/null @@ -1,132 +0,0 @@ -Step-by-Step -========= - -This document describes the step-by-step instructions for reproducing the quantization on models for the text classification (GLUE) tasks. - -GLUE is made up of a total of 9 different tasks. Here is how to run the script on one of them: - -# Prerequisite -## 1. Installation - -Make sure you have installed Intel® Extension for Transformers and all the dependencies in the current example: - -```shell -pip install intel-extension-for-transformers -cd ptq -pip install -r requirements.txt -``` - -# Run - -Here are two options: running with the shell script or running with the python script. Basically, they are equivalent and the shell script just wraps the invocation of the python script and is more concise and easy for users to get started. - -## 1. Run Command (Shell) - -- Topology: - - bert_base_mrpc_static - - xlnet_mrpc - - albert_large_mrpc - - legalbert_mrpc - -- To get the int8 model - - ``` - cd ptq - bash run_tuning.sh --topology=[topology] --output_model=./saved_int8 - ``` - -- To benchmark the int8 model - - ``` - cd ptq - bash run_benchmark.sh --topology=[topology] --config=./saved_int8 --mode=benchmark --int8=true - ``` - -## 2. Run Command (Python) - -- model_name_or_path: - - bert-base-cased-finetuned-mrpc - - xlnet-base-cased - - albert-large-v2 - - nlpaueb/legal-bert-small-uncased - -- To get int8 model - -``` -python run_glue.py - --model_name_or_path [model_name_or_path] \ - --task_name mrpc \ - --tune \ - --quantization_approach static \ - --do_train \ - --do_eval \ - --output_dir ./saved_result \ - --overwrite_output_dir -``` - - To reload int8 model - -``` -python run_glue.py - --model_name_or_path [model_name_or_path] \ - --task_name mrpc \ - --benchmark \ - --int8 \ - --do_eval \ - --output_dir ./saved_result \ - --overwrite_output_dir -``` - -> **Notes**: - - quantization_approach in Tensorflow consist of `static`, `qat`. - - task_name consist of cola, sst2, mrpc, stsb, qqp, mnli, qnli, rte, wnli. - - -# Multi-node Usage - -We also supported Distributed Data Parallel training on multi nodes settings for quantization. - -> **Note**: multi node settings boost performance in the training process and may not show good performance with static quantization strategy - -The default strategy we used is `MultiWorkerMirroredStrategy` in Tensorflow, and with `task_type` set as "worker", we are expected to pass following extra parameters to the script: - -* `worker`: a string of your worker ip addresses which is separated by comma and there should not be space between each two of them - -* `task_index`: 0 should be set on the chief node (leader) and 1, 2, 3... should be set as the rank of other follower nodes - -## Multi-node Example - -### 1. Get Int8 Model - -* On leader node - -``` -bash run_tuning.sh --topology=bert_base_mrpc_static --output_model=./saved_int8 --worker="localhost:12345,localhost:23456" --task_index=0 -``` - -* On follower node - -``` -bash run_tuning.sh --topology=bert_base_mrpc_static --output_model=./saved_int8 --worker="localhost:12345,localhost:23456" --task_index=1 -``` - -Please replace the worker ip address list with your own. - -### 2. Reload Int8 Model - -* On leader node - -``` -bash run_benchmark.sh --topology=bert_base_mrpc_static --config=./saved_int8 --mode=benchmark --int8=true --worker="localhost:12345,localhost:23456" --task_index=0 -``` - -* On follower node - -``` -bash run_benchmark.sh --topology=bert_base_mrpc_static --config=./saved_int8 --mode=benchmark --int8=true --worker="localhost:12345,localhost:23456" --task_index=1 -``` - -Please replace the worker ip address list with your own. - - - - diff --git a/examples/huggingface/tensorflow/text-classification/quantization/ptq/requirements.txt b/examples/huggingface/tensorflow/text-classification/quantization/ptq/requirements.txt deleted file mode 100644 index 8067cf9633a..00000000000 --- a/examples/huggingface/tensorflow/text-classification/quantization/ptq/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -datasets >= 1.17 -sentencepiece != 0.1.92 -protobuf -intel-tensorflow -transformers -evaluate -accelerate \ No newline at end of file diff --git a/examples/huggingface/tensorflow/text-classification/quantization/ptq/run_benchmark.sh b/examples/huggingface/tensorflow/text-classification/quantization/ptq/run_benchmark.sh deleted file mode 100644 index 403a0e41b52..00000000000 --- a/examples/huggingface/tensorflow/text-classification/quantization/ptq/run_benchmark.sh +++ /dev/null @@ -1,131 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_benchmark - -} - -# init params -function init_params { - topology="bert_base_mrpc_static" - iters=100 - batch_size=1 - tuned_checkpoint=saved_results - cache_dir="cache" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --mode=*) - mode=$(echo $var |cut -f2 -d=) - ;; - --batch_size=*) - batch_size=$(echo $var |cut -f2 -d=) - ;; - --iters=*) - iters=$(echo ${var} |cut -f2 -d=) - ;; - --int8=*) - int8=$(echo ${var} |cut -f2 -d=) - ;; - --config=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - --worker=*) - worker=$(echo $var |cut -f2 -d=) - ;; - --task_index=*) - task_index=$(echo $var |cut -f2 -d=) - ;; - --cache_dir=*) - cache_dir=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - - -# run_benchmark -function run_benchmark { - extra_cmd='' - MAX_SEQ_LENGTH=128 - - if [[ ${mode} == "accuracy" ]]; then - mode_cmd=" --accuracy_only" - elif [[ ${mode} == "benchmark" ]]; then - mode_cmd=" --benchmark " - else - echo "Error: No such mode: ${mode}" - exit 1 - fi - - if [ "${topology}" = "bert_base_mrpc_static" ]; then - TASK_NAME="mrpc" - model_name_or_path="bert-base-cased-finetuned-mrpc" - elif [ "${topology}" = "legalbert_mrpc" ]; then - TASK_NAME="mrpc" - model_name_or_path="nlpaueb/legal-bert-small-uncased" - elif [ "${topology}" = "xlnet_mrpc" ]; then - TASK_NAME="mrpc" - model_name_or_path="xlnet-base-cased" - elif [ "${topology}" = "albert_large_mrpc" ]; then - TASK_NAME="mrpc" - model_name_or_path="albert-large-v2" - # add following parameters for quicker debugging - extra_cmd=$extra_cmd" --max_eval_samples 48" - fi - - if [[ ${int8} == "true" ]]; then - extra_cmd=$extra_cmd" --int8" - fi - echo $extra_cmd - - if [ "${worker}" = "" ] - then - python -u ../run_glue.py \ - --model_name_or_path ${model_name_or_path} \ - --task_name ${TASK_NAME} \ - --do_eval \ - --max_seq_length ${MAX_SEQ_LENGTH} \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --no_cuda \ - ${mode_cmd} \ - ${extra_cmd} - else - python -u ../run_glue.py \ - --model_name_or_path ${model_name_or_path} \ - --task_name ${TASK_NAME} \ - --do_eval \ - --max_seq_length ${MAX_SEQ_LENGTH} \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --no_cuda \ - --worker "${worker}" \ - --task_index ${task_index} \ - ${mode_cmd} \ - ${extra_cmd} - fi -} - -main "$@" diff --git a/examples/huggingface/tensorflow/text-classification/quantization/ptq/run_tuning.sh b/examples/huggingface/tensorflow/text-classification/quantization/ptq/run_tuning.sh deleted file mode 100644 index c84c8654f62..00000000000 --- a/examples/huggingface/tensorflow/text-classification/quantization/ptq/run_tuning.sh +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_tuning - -} - -# init params -function init_params { - topology="bert_base_mrpc_static" - tuned_checkpoint="saved_results" - extra_cmd="" - batch_size=8 - MAX_SEQ_LENGTH=128 - model_type="bert" - approach="PostTrainingStatic" - cache_dir="cache" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --output_model=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - --worker=*) - worker=$(echo $var |cut -f2 -d=) - ;; - --task_index=*) - task_index=$(echo $var |cut -f2 -d=) - ;; - --cache_dir=*) - cache_dir=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - -# run_tuning -function run_tuning { - batch_size=64 - if [ "${topology}" = "bert_base_mrpc_static" ]; then - TASK_NAME="mrpc" - model_name_or_path="bert-base-cased-finetuned-mrpc" - approach="PostTrainingStatic" - elif [ "${topology}" = "legalbert_mrpc" ]; then - TASK_NAME="mrpc" - model_name_or_path="nlpaueb/legal-bert-small-uncased" - approach="PostTrainingStatic" - extra_cmd=$extra_cmd" --perf_tol 0.1" - elif [ "${topology}" = "xlnet_mrpc" ]; then - TASK_NAME="mrpc" - model_name_or_path="xlnet-base-cased" - approach="PostTrainingStatic" - elif [ "${topology}" = "albert_large_mrpc" ]; then - TASK_NAME="mrpc" - model_name_or_path="albert-large-v2" - approach="PostTrainingStatic" - extra_cmd=$extra_cmd" --perf_tol 0.05" - fi - - if [ "${worker}" = "" ] - then - python -u ../run_glue.py \ - --model_name_or_path ${model_name_or_path} \ - --task_name ${TASK_NAME} \ - --do_eval \ - --max_seq_length ${MAX_SEQ_LENGTH} \ - --per_device_train_batch_size ${batch_size} \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --no_cuda \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --quantization_approach ${approach} \ - --do_train \ - --tune \ - ${extra_cmd} - else - python -u ../run_glue.py \ - --model_name_or_path ${model_name_or_path} \ - --task_name ${TASK_NAME} \ - --do_eval \ - --max_seq_length ${MAX_SEQ_LENGTH} \ - --per_device_train_batch_size ${batch_size} \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --no_cuda \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --quantization_approach ${approach} \ - --do_train \ - --tune \ - --worker "${worker}" \ - --task_index ${task_index} \ - ${extra_cmd} - fi -} - -main "$@" diff --git a/examples/huggingface/tensorflow/text-classification/quantization/run_glue.py b/examples/huggingface/tensorflow/text-classification/quantization/run_glue.py deleted file mode 100644 index b025ba2cc90..00000000000 --- a/examples/huggingface/tensorflow/text-classification/quantization/run_glue.py +++ /dev/null @@ -1,731 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -# Copyright 2020 The HuggingFace Inc. team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" Finetuning the library models for sequence classification on GLUE.""" -# You can also adapt this script on your own text classification task. Pointers for this are left as comments. - -import logging -import os -import sys -import time -from dataclasses import dataclass, field -from typing import Optional - -import numpy as np -import tensorflow as tf -from datasets import load_dataset - -import transformers -from transformers import ( - AutoConfig, - AutoTokenizer, - DataCollatorWithPadding, - DefaultDataCollator, - HfArgumentParser, - PretrainedConfig, - TFAutoModelForSequenceClassification, - TFTrainingArguments, - set_seed, -) -from transformers.trainer_utils import get_last_checkpoint, is_main_process -from transformers.utils import check_min_version - - -# region Helper functions - - -class SavePretrainedCallback(tf.keras.callbacks.Callback): - # Hugging Face models have a save_pretrained() method that saves both the weights and the necessary - # metadata to allow them to be loaded as a pretrained model in future. This is a simple Keras callback - # that saves the model with this method after each epoch. - def __init__(self, output_dir, **kwargs): - super().__init__() - self.output_dir = output_dir - - def on_epoch_end(self, epoch, logs=None): - self.model.save_pretrained(self.output_dir) - - -# endregion - - -# Will error if the minimal version of Transformers is not installed. Remove at your own risks. -check_min_version("4.17.0") - -task_to_keys = { - "cola": ("sentence", None), - "mnli": ("premise", "hypothesis"), - "mrpc": ("sentence1", "sentence2"), - "qnli": ("question", "sentence"), - "qqp": ("question1", "question2"), - "rte": ("sentence1", "sentence2"), - "sst2": ("sentence", None), - "stsb": ("sentence1", "sentence2"), - "wnli": ("sentence1", "sentence2"), -} - -logger = logging.getLogger(__name__) - - -# region Command-line arguments -@dataclass -class DataTrainingArguments: - """ - Arguments pertaining to what data we are going to input our model for training and eval. - - Using `HfArgumentParser` we can turn this class - into argparse arguments to be able to specify them on - the command line. - """ - - task_name: str = field( - metadata={"help": "The name of the task to train on: " + ", ".join(task_to_keys.keys())}, - ) - predict_file: str = field( - metadata={"help": "A file containing user-supplied examples to make predictions for"}, - default=None, - ) - max_seq_length: int = field( - default=128, - metadata={ - "help": "The maximum total input sequence length after tokenization. Sequences longer " - "than this will be truncated, sequences shorter will be padded." - }, - ) - overwrite_cache: bool = field( - default=False, metadata={"help": "Overwrite the cached preprocessed datasets or not."} - ) - pad_to_max_length: bool = field( - default=False, - metadata={ - "help": "Whether to pad all samples to `max_seq_length`. " - "If False, will pad the samples dynamically when batching to the maximum length in the batch." - }, - ) - max_train_samples: Optional[int] = field( - default=None, - metadata={ - "help": "For debugging purposes or quicker training, truncate the number of training examples to this " - "value if set." - }, - ) - max_eval_samples: Optional[int] = field( - default=None, - metadata={ - "help": "For debugging purposes or quicker training, truncate the number of evaluation examples to this " - "value if set." - }, - ) - max_predict_samples: Optional[int] = field( - default=None, - metadata={ - "help": "For debugging purposes or quicker training, truncate the number of prediction examples to this " - "value if set." - }, - ) - - def __post_init__(self): - self.task_name = self.task_name.lower() - if self.task_name not in task_to_keys.keys(): - raise ValueError("Unknown task, you should pick one in " + ",".join(task_to_keys.keys())) - - -@dataclass -class ModelArguments: - """ - Arguments pertaining to which model/config/tokenizer we are going to fine-tune from. - """ - - model_name_or_path: str = field( - metadata={"help": "Path to pretrained model or model identifier from huggingface.co/models"} - ) - config_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained config name or path if not the same as model_name"} - ) - tokenizer_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained tokenizer name or path if not the same as model_name"} - ) - cache_dir: Optional[str] = field( - default=None, - metadata={"help": "Where do you want to store the pretrained models downloaded from huggingface.co"}, - ) - use_fast_tokenizer: bool = field( - default=True, - metadata={"help": "Whether to use one of the fast tokenizer (backed by the tokenizers library) or not."}, - ) - model_revision: str = field( - default="main", - metadata={"help": "The specific model version to use (can be a branch name, tag name or commit id)."}, - ) - use_auth_token: bool = field( - default=False, - metadata={ - "help": "Will use the token generated when running `transformers-cli login` (necessary to use this script " - "with private models)." - }, - ) - - -@dataclass -class OptimizationArguments: - """ - Arguments pertaining to what type of optimization we are going to apply on the model. - """ - - tune: bool = field( - default=False, - metadata={"help": "Whether or not to apply quantization."}, - ) - quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, - ) - metric_name: Optional[str] = field( - default=None, - metadata={"help": "Metric used for the tuning strategy."}, - ) - is_relative: Optional[bool] = field( - default=True, - metadata={"help": "Metric tolerance model, expected to be relative or absolute."}, - ) - perf_tol: Optional[float] = field( - default=0.01, - metadata={"help": "Performance tolerance when optimizing the model."}, - ) - benchmark: bool = field( - default=False, - metadata={"help": "run benchmark."}) - int8: bool = field( - default=False, - metadata={"help":"Whether to use the quantized int8 model."}) - accuracy_only: bool = field( - default=False, - metadata={"help":"Whether to only test accuracy for model tuned by Neural Compressor."}) - -@dataclass -class DistributedArguments: - """ - Arguments setting the distributed multinode environment - """ - - worker: str = field( - default=None, - metadata={"help": "List of node ip addresses in a string, and there should not be space between addresses."}, - ) - task_index: int = field( - default=0, - metadata={"help": "Worker index, and 0 represents the chief worker while other workers are set as 1,2,3..."}, - ) -# endregion - - -def main(): - # region Argument parsing - # See all possible arguments in src/transformers/training_args.py - # or by passing the --help flag to this script. - # We now keep distinct sets of args, for a cleaner separation of concerns. - - parser = HfArgumentParser((ModelArguments, DataTrainingArguments, TFTrainingArguments, OptimizationArguments, DistributedArguments)) - if len(sys.argv) == 2 and sys.argv[1].endswith(".json"): - # If we pass only one argument to the script and it's the path to a json file, - # let's parse it to get our arguments. - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1])) - else: - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_args_into_dataclasses() - - if not (training_args.do_train or training_args.do_eval or training_args.do_predict): - exit("Must specify at least one of --do_train, --do_eval or --do_predict!") - # endregion - - # region Logging - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%m/%d/%Y %H:%M:%S", - handlers=[logging.StreamHandler(sys.stdout)], - ) - logger.setLevel(logging.INFO if is_main_process(training_args.local_rank) else logging.WARN) - - # Set the verbosity to info of the Transformers logger (on main process only): - if is_main_process(training_args.local_rank): - transformers.utils.logging.set_verbosity_info() - transformers.utils.logging.enable_default_handler() - transformers.utils.logging.enable_explicit_format() - logger.info(f"Training/evaluation parameters {training_args}") - # endregion - - # region Set the multinode environment, the strategy and paths - strategy = None - worker_list = None - if distributed_args.worker is not None: - logger.info("distributed environment initialization...") - - worker_list = distributed_args.worker.split(",") - - from intel_extension_for_transformers.transformers.utils.utility_tf import distributed_init - distributed_init(worker_list, "worker", distributed_args.task_index) - - strategy = tf.distribute.MultiWorkerMirroredStrategy() - from intel_extension_for_transformers.transformers.utils.utility_tf import get_filepath - training_args.output_dir = get_filepath(training_args.output_dir, strategy.cluster_resolver.task_type, strategy.cluster_resolver.task_id) - else: - strategy = training_args.strategy - #endregion - - # region Checkpoints - checkpoint = None - if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir: - checkpoint = get_last_checkpoint(training_args.output_dir) - if checkpoint is None and len(os.listdir(training_args.output_dir)) > 0: - raise ValueError( - f"Output directory ({training_args.output_dir}) already exists and is not empty. " - "Use --overwrite_output_dir to overcome." - ) - elif checkpoint is not None and training_args.resume_from_checkpoint is None: - logger.info( - f"Checkpoint detected, resuming training at {checkpoint}. To avoid this behavior, change " - "the `--output_dir` or add `--overwrite_output_dir` to train from scratch." - ) - # endregion - - # region Dataset and labels - # Set seed before initializing model. - set_seed(training_args.seed) - - # Downloading and loading a dataset from the hub. In distributed training, the load_dataset function guarantee - # that only one local process can concurrently download the dataset. - datasets = load_dataset( - "glue", - data_args.task_name, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - # See more about loading any type of standard or custom dataset at - # https://huggingface.co/docs/datasets/loading_datasets.html. - - is_regression = data_args.task_name == "stsb" - if not is_regression: - label_list = datasets["train"].features["label"].names - num_labels = len(label_list) - else: - num_labels = 1 - - if data_args.predict_file is not None: - logger.info("Preparing user-supplied file for predictions...") - - data_files = {"data": data_args.predict_file} - - for key in data_files.keys(): - logger.info(f"Loading a local file for {key}: {data_files[key]}") - - if data_args.predict_file.endswith(".csv"): - # Loading a dataset from local csv files - user_dataset = load_dataset("csv", data_files=data_files, cache_dir=model_args.cache_dir) - else: - # Loading a dataset from local json files - user_dataset = load_dataset("json", data_files=data_files, cache_dir=model_args.cache_dir) - needed_keys = task_to_keys[data_args.task_name] - for key in needed_keys: - assert key in user_dataset["data"].features, f"Your supplied predict_file is missing the {key} key!" - datasets["user_data"] = user_dataset["data"] - # endregion - - # region Load model config and tokenizer - # - # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently - # download model & vocab. - config = AutoConfig.from_pretrained( - model_args.config_name if model_args.config_name else model_args.model_name_or_path, - num_labels=num_labels, - finetuning_task=data_args.task_name, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - _commit_hash="main", - ) - tokenizer = AutoTokenizer.from_pretrained( - model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path, - cache_dir=model_args.cache_dir, - use_fast=model_args.use_fast_tokenizer, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - _commit_hash="main", - ) - # endregion - - # region Dataset preprocessing - sentence1_key, sentence2_key = task_to_keys[data_args.task_name] - non_label_column_names = [name for name in datasets["train"].column_names if name != "label"] - - # Padding strategy - if data_args.pad_to_max_length: - padding = "max_length" - else: - # We will pad later, dynamically at batch creation, to the max sequence length in each batch - padding = False - - # Some models have set the order of the labels to use, so let's make sure we do use it. - label_to_id = None - if config.label2id != PretrainedConfig(num_labels=num_labels).label2id and not is_regression: - # Some have all caps in their config, some don't. - label_name_to_id = {k.lower(): v for k, v in config.label2id.items()} - if list(sorted(label_name_to_id.keys())) == list(sorted(label_list)): - label_to_id = {i: int(label_name_to_id[label_list[i]]) for i in range(num_labels)} - else: - logger.warning( - "Your model seems to have been trained with labels, but they don't match the dataset: ", - f"model labels: {list(sorted(label_name_to_id.keys()))}, dataset labels: {list(sorted(label_list))}." - "\nIgnoring the model labels as a result.", - ) - label_to_id = {label: i for i, label in enumerate(label_list)} - if label_to_id is not None: - config.label2id = label_to_id - config.id2label = {id: label for label, id in config.label2id.items()} - elif data_args.task_name is not None and not is_regression: - config.label2id = {l: i for i, l in enumerate(label_list)} - config.id2label = {id: label for label, id in config.label2id.items()} - - if data_args.max_seq_length > tokenizer.model_max_length: - logger.warning( - f"The max_seq_length passed ({data_args.max_seq_length}) is larger than the maximum length for the" - f"model ({tokenizer.model_max_length}). Using max_seq_length={tokenizer.model_max_length}." - ) - max_seq_length = min(data_args.max_seq_length, tokenizer.model_max_length) - - def preprocess_function(examples): - # Tokenize the texts - args = ( - (examples[sentence1_key],) if sentence2_key is None else (examples[sentence1_key], examples[sentence2_key]) - ) - result = tokenizer(*args, padding=padding, max_length=max_seq_length, truncation=True) - - return result - - datasets = datasets.map(preprocess_function, batched=True, load_from_cache_file=not data_args.overwrite_cache) - - if data_args.pad_to_max_length: - data_collator = DefaultDataCollator(return_tensors="tf") - else: - data_collator = DataCollatorWithPadding(tokenizer, return_tensors="tf") - # endregion - - # region Metric function - from evaluate import load - metric = load("glue", data_args.task_name, cache_dir=model_args.cache_dir) - - def compute_metrics(preds, label_ids): - preds = preds["logits"] - preds = np.squeeze(preds) if is_regression else np.argmax(preds, axis=1) - result = metric.compute(predictions=preds, references=label_ids) - if len(result) > 1: - result["combined_score"] = np.mean(list(result.values())).item() - return result - - # endregion - - def eval_func_mrpc(model): - label_ids: np.ndarray = None - tf_eval_dataset = tf_data["validation"] - - num_examples = sum(1 for _ in ( - tf_eval_dataset.unbatch() if hasattr(tf_eval_dataset, "unbatch") else tf_eval_dataset)) - logger.info(f"***** Running Evaluation *****") - logger.info(f" Num examples in dataset = {num_examples}") - logger.info(f" Batch size = {training_args.per_device_eval_batch_size}") - - preds: np.ndarray = None - infer = model.signatures["serving_default"] - - for idx, (inputs, labels) in enumerate(tf_eval_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - - results = infer(**inputs) - if preds is None: - preds = results["Identity"].numpy() - else: - preds = np.append(preds, results["Identity"].numpy(), axis=0) - - if label_ids is None: - label_ids = labels[0].numpy() if isinstance( - labels, list) else labels.numpy() - else: - label_ids = np.append( - label_ids, - labels[0].numpy() - if isinstance(labels, list) else labels.numpy(), - axis=0) - test_predictions = {"logits": preds} - metrics = compute_metrics(test_predictions, label_ids) - - return metrics["accuracy"] - - with strategy.scope(): - # region Load pretrained model - if checkpoint is None: - model_path = model_args.model_name_or_path - else: - model_path = checkpoint - model = TFAutoModelForSequenceClassification.from_pretrained( - model_path, - config=config, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - ) - # endregion - - # region Optimizer, loss and compilation - optimizer = tf.keras.optimizers.Adam( - learning_rate=training_args.learning_rate, - beta_1=training_args.adam_beta1, - beta_2=training_args.adam_beta2, - epsilon=training_args.adam_epsilon, - clipnorm=training_args.max_grad_norm, - ) - if is_regression: - loss_fn = tf.keras.losses.MeanSquaredError() - metrics = [] - else: - loss_fn = tf.keras.losses.SparseCategoricalCrossentropy( - from_logits=True, reduction=tf.keras.losses.Reduction.SUM - ) - metrics = ["accuracy"] - model.compile(optimizer=optimizer, loss=loss_fn, metrics=metrics) - # endregion - - # region Convert data to a tf.data.Dataset - tf_data = dict() - max_samples = { - "train": data_args.max_train_samples, - "validation": data_args.max_eval_samples, - "validation_matched": data_args.max_eval_samples, - "validation_mismatched": data_args.max_eval_samples, - "test": data_args.max_predict_samples, - "test_matched": data_args.max_predict_samples, - "test_mismatched": data_args.max_predict_samples, - "user_data": None, - } - for key in datasets.keys(): - if key == "train" or key.startswith("validation"): - assert "label" in datasets[key].features, f"Missing labels from {key} data!" - if key == "train": - shuffle = True - batch_size = training_args.per_device_train_batch_size * (len(worker_list) if worker_list is not None else 1) - drop_remainder = True # Saves us worrying about scaling gradients for the last batch - else: - shuffle = False - batch_size = training_args.per_device_eval_batch_size * (len(worker_list) if worker_list is not None else 1) - drop_remainder = False - samples_limit = max_samples[key] - dataset = datasets[key] - if samples_limit is not None: - dataset = dataset.select(range(samples_limit)) - data = dataset.to_tf_dataset( - columns=[col for col in dataset.column_names if col not in set(non_label_column_names + ["label"])], - shuffle=shuffle, - batch_size=batch_size, - collate_fn=data_collator, - drop_remainder=drop_remainder, - # `label_cols` is needed for user-defined losses, such as in this example - # datasets v2.3.x need "labels", not "label" - label_cols=["labels"] if "label" in dataset.column_names else None, - ) - tf_data[key] = data - # endregion - - if optim_args.tune: - from intel_extension_for_transformers.transformers import metrics, objectives, QuantizationConfig, TFOptimization - optimization = TFOptimization( - model=model, - args=training_args, - train_dataset=tf_data["train"], - eval_dataset=tf_data["validation"], - compute_metrics=compute_metrics, - task_type=strategy.cluster_resolver.task_type if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - task_id=strategy.cluster_resolver.task_id if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - ) - - # use customized eval function - optimization.eval_func = eval_func_mrpc - - tune_metric = metrics.Metric( - name="accuracy", greater_is_better=True, is_relative=True, criterion=optim_args.perf_tol, - ) - quantization_config = QuantizationConfig( - framework="tensorflow", - approach="POSTTRAININGSTATIC", - metrics=[tune_metric], - objectives=[objectives.performance] - ) - quantized_model = optimization.quantize(quant_config=quantization_config) - exit(0) - - # region Training and validation - if training_args.do_train: - callbacks = [SavePretrainedCallback(output_dir=training_args.output_dir)] - if training_args.do_eval and not data_args.task_name == "mnli": - # Do both evaluation and training in the Keras fit loop, unless the task is MNLI - # because MNLI has two validation sets - validation_data = tf_data["validation"] - else: - validation_data = None - model.fit( - tf_data["train"], - validation_data=validation_data, - epochs=2, - callbacks=callbacks, - ) - # endregion - - # region Evaluation - if training_args.do_eval: - # We normally do validation as part of the Keras fit loop, but we run it independently - # if there was no fit() step (because we didn't train the model) or if the task is MNLI, - # because MNLI has a separate validation-mismatched validation set - logger.info("*** Evaluate ***") - - # Loop to handle MNLI double evaluation (matched, mis-matched) - if data_args.task_name == "mnli": - tasks = ["mnli", "mnli-mm"] - tf_datasets = [tf_data["validation_matched"], tf_data["validation_mismatched"]] - raw_datasets = [datasets["validation_matched"], datasets["validation_mismatched"]] - else: - tasks = [data_args.task_name] - tf_datasets = [tf_data["validation"]] - raw_datasets = [datasets["validation"]] - - num_examples = 0 - if optim_args.int8: - model = tf.saved_model.load(training_args.output_dir) - else: - from intel_extension_for_transformers.transformers.utils.utility_tf import keras2SavedModel - model = keras2SavedModel(model) - for raw_dataset, tf_dataset, task in zip(raw_datasets, tf_datasets, tasks): - num_examples += sum( - 1 for _ in (tf_dataset.unbatch() - if hasattr(tf_dataset, "unbatch") else tf_dataset - ) - ) - preds: np.ndarray = None - label_ids: np.ndarray = None - infer = model.signatures[list(model.signatures.keys())[0]] - - if optim_args.accuracy_only: - iterations = 1 - warmup = 0 - else: - iterations = 10 - warmup = 5 - latency_list = [] - - for idx in range(iterations): - iteration_time = 0 - for i, (inputs, labels) in enumerate(tf_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - start = time.time() - results = infer(**inputs) - iteration_time += time.time() - start - if idx == 0: # only accumulate once all the preds and labels - if preds is None: - preds = results["Identity"].numpy() - else: - preds = np.append(preds, results["Identity"].numpy(), axis=0) - if label_ids is None: - label_ids = labels.numpy() - else: - label_ids = np.append(label_ids, labels.numpy(), axis=0) - latency_list.append(iteration_time) - logger.info("Iteration {} time: {} sec".format(idx, iteration_time)) - eval_metrics = compute_metrics({"logits": preds}, label_ids) - logger.info("\nEvaluation result: ") - logger.info("metric ({}) Accuracy: {}".format(task, eval_metrics["accuracy"])) - - average_iteration_time = np.array(latency_list[warmup:]).mean() - logger.info( - "Throughput: {} samples/sec".format( - num_examples / average_iteration_time) - ) - - # endregion - - # region Prediction - if training_args.do_predict or data_args.predict_file: - logger.info("*** Predict ***") - - # Loop to handle MNLI double evaluation (matched, mis-matched) - tasks = [] - tf_datasets = [] - raw_datasets = [] - if training_args.do_predict: - if data_args.task_name == "mnli": - tasks.extend(["mnli", "mnli-mm"]) - tf_datasets.extend([tf_data["test_matched"], tf_data["test_mismatched"]]) - raw_datasets.extend([datasets["test_matched"], datasets["test_mismatched"]]) - else: - tasks.append(data_args.task_name) - tf_datasets.append(tf_data["test"]) - raw_datasets.append(datasets["test"]) - if data_args.predict_file: - tasks.append("user_data") - tf_datasets.append(tf_data["user_data"]) - raw_datasets.append(datasets["user_data"]) - - if optim_args.int8: - model = tf.saved_model.load(training_args.output_dir) - - for raw_dataset, tf_dataset, task in zip(raw_datasets, tf_datasets, tasks): - if optim_args.int8: - preds: np.ndarray = None - infer = model.signatures[list(model.signatures.keys())[0]] - for i, (inputs, labels) in enumerate(tf_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - results = infer(**inputs) - for val in results: - if preds is None: - preds = results[val].numpy() - else: - preds = np.append(preds, results[val].numpy(), axis=0) - test_predictions = {"logits": preds} - else: - test_predictions = model.predict(tf_dataset) - if "label" in raw_dataset: - test_metrics = compute_metrics(test_predictions, - raw_dataset["label"]) - print(f"Test metrics ({task}):") - print(test_metrics) - - if is_regression: - predictions_to_write = np.squeeze(test_predictions["logits"]) - else: - predictions_to_write = np.argmax(test_predictions["logits"], axis=1) - - output_predict_file = os.path.join(training_args.output_dir, f"predict_results_{task}.txt") - with open(output_predict_file, "w") as writer: - logger.info(f"***** Writing prediction results for {task} *****") - writer.write("index\tprediction\n") - for index, item in enumerate(predictions_to_write): - if is_regression: - writer.write(f"{index}\t{item:3.3f}\n") - else: - item = config.id2label[item] - writer.write(f"{index}\t{item}\n") - # endregion - - -if __name__ == "__main__": - main() diff --git a/examples/huggingface/tensorflow/token-classification/quantization/README.md b/examples/huggingface/tensorflow/token-classification/quantization/README.md deleted file mode 100644 index 8b05a9c1974..00000000000 --- a/examples/huggingface/tensorflow/token-classification/quantization/README.md +++ /dev/null @@ -1,35 +0,0 @@ -Step-by-Step -========= - -This document describes the step-by-step instructions for reproducing the quantization on models for the token classification (NER) tasks. - -# Prerequisite -## 1. Installation - -Make sure you have installed Intel® Extension for Transformers and all the dependencies in the current example: - -```shell -pip install intel-extension-for-transformers -pip install -r requirements.txt -``` - -# Run - -## 1. Run Command (Shell) - -- Topology: - - bert_base_ner - -- To get the int8 model - - ``` - cd ptq - bash run_tuning.sh --topology=[topology] --output_model=./saved_int8 - ``` - -- To benchmark the int8 model - - ``` - cd ptq - bash run_benchmark.sh --topology=[topology] --config=./saved_int8 --mode=benchmark --int8=true - ``` \ No newline at end of file diff --git a/examples/huggingface/tensorflow/token-classification/quantization/requirements.txt b/examples/huggingface/tensorflow/token-classification/quantization/requirements.txt deleted file mode 100644 index 6e419404871..00000000000 --- a/examples/huggingface/tensorflow/token-classification/quantization/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -datasets >= 1.17 -sentencepiece != 0.1.92 -seqeval -protobuf -intel-tensorflow -transformers -accelerate \ No newline at end of file diff --git a/examples/huggingface/tensorflow/token-classification/quantization/run_benchmark.sh b/examples/huggingface/tensorflow/token-classification/quantization/run_benchmark.sh deleted file mode 100644 index ddf9d917410..00000000000 --- a/examples/huggingface/tensorflow/token-classification/quantization/run_benchmark.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_benchmark - -} - -# init params -function init_params { - topology="bert_base_ner" - iters=100 - batch_size=16 - tuned_checkpoint=saved_results - cache_dir="cache" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --mode=*) - mode=$(echo $var |cut -f2 -d=) - ;; - --batch_size=*) - batch_size=$(echo $var |cut -f2 -d=) - ;; - --iters=*) - iters=$(echo ${var} |cut -f2 -d=) - ;; - --int8=*) - int8=$(echo ${var} |cut -f2 -d=) - ;; - --config=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - --worker=*) - worker=$(echo $var |cut -f2 -d=) - ;; - --task_index=*) - task_index=$(echo $var |cut -f2 -d=) - ;; - --cache_dir=*) - cache_dir=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - - -# run_benchmark -function run_benchmark { - extra_cmd='' - MAX_SEQ_LENGTH=128 - batch_size=1 - - if [[ ${mode} == "accuracy" ]]; then - mode_cmd=" --accuracy_only" - elif [[ ${mode} == "benchmark" ]]; then - mode_cmd=" --benchmark " - else - echo "Error: No such mode: ${mode}" - exit 1 - fi - - if [ "${topology}" = "bert_base_ner" ]; then - TASK_NAME="ner" - model_name_or_path="dslim/bert-base-NER" - approach="PostTrainingStatic" - dataset_name=conll2003 - fi - - if [[ ${int8} == "true" ]]; then - extra_cmd=$extra_cmd" --int8" - fi - echo $extra_cmd - - if [ "${worker}" = "" ] - then - python -u run_ner.py \ - --model_name_or_path ${model_name_or_path} \ - --dataset_name ${dataset_name} \ - --task_name ${TASK_NAME} \ - --pad_to_max_length \ - --do_eval \ - --max_length ${MAX_SEQ_LENGTH} \ - --per_device_eval_batch_size ${batch_size} \ - --max_eval_samples 408 \ - --output_dir ${tuned_checkpoint} \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --no_cuda \ - ${mode_cmd} \ - ${extra_cmd} - else - python -u ../run_ner.py \ - --model_name_or_path ${model_name_or_path} \ - --task_name ${TASK_NAME} \ - --dataset_name ${dataset_name} \ - --pad_to_max_length \ - --do_eval \ - --max_length ${MAX_SEQ_LENGTH} \ - --per_device_eval_batch_size ${batch_size} \ - --max_eval_samples 408 \ - --output_dir ${tuned_checkpoint} \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --no_cuda \ - --worker "${worker}" \ - --task_index ${task_index} \ - ${mode_cmd} \ - ${extra_cmd} - fi -} - -main "$@" diff --git a/examples/huggingface/tensorflow/token-classification/quantization/run_ner.py b/examples/huggingface/tensorflow/token-classification/quantization/run_ner.py deleted file mode 100644 index 30b9855c97f..00000000000 --- a/examples/huggingface/tensorflow/token-classification/quantization/run_ner.py +++ /dev/null @@ -1,696 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 -# Copyright 2021 The HuggingFace Inc. team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Fine-tuning a 🤗 Transformers model on token classification tasks (NER, POS, CHUNKS) relying on the accelerate library -without using a Trainer. -""" - -import logging -import sys -import random -import time -from dataclasses import dataclass, field -from typing import Optional - -from datasets import ClassLabel, load_dataset, load_metric -import numpy as np -import tensorflow as tf - -import transformers -from transformers import ( - AutoConfig, - AutoTokenizer, - DataCollatorForTokenClassification, - HfArgumentParser, - TFAutoModelForTokenClassification, - TFTrainingArguments, - set_seed, -) -from transformers.utils.versions import require_version -from transformers.trainer_utils import get_last_checkpoint, is_main_process - -logger = logging.getLogger(__name__) -require_version("datasets>=1.8.0", "To fix: pip install -r examples/tensorflow/token-classification/requirements.txt") - -class SavePretrainedCallback(tf.keras.callbacks.Callback): - # Hugging Face models have a save_pretrained() method that saves both the weights and the necessary - # metadata to allow them to be loaded as a pretrained model in future. This is a simple Keras callback - # that saves the model with this method after each epoch. - def __init__(self, output_dir, **kwargs): - super().__init__() - self.output_dir = output_dir - - def on_epoch_end(self, epoch, logs=None): - self.model.save_pretrained(self.output_dir) - - -# region Command-line arguments -@dataclass -class ModelArguments: - """ - Arguments pertaining to which model/config/tokenizer we are going to fine-tune from. - """ - - model_name_or_path: str = field( - metadata={"help": "Path to pretrained model or model identifier from huggingface.co/models"} - ) - config_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained config name or path if not the same as model_name"} - ) - tokenizer_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained tokenizer name or path if not the same as model_name"} - ) - cache_dir: Optional[str] = field( - default=None, - metadata={"help": "Where do you want to store the pretrained models downloaded from huggingface.co"}, - ) - model_revision: str = field( - default="main", - metadata={"help": "The specific model version to use (can be a branch name, tag name or commit id)."}, - ) - use_auth_token: bool = field( - default=False, - metadata={ - "help": ( - "Will use the token generated when running `huggingface-cli login` (necessary to use this script " - "with private models)." - ) - }, - ) - -@dataclass -class DataTrainingArguments: - """ - Arguments pertaining to what data we are going to input our model for training and eval. - """ - - task_name: Optional[str] = field(default="ner", metadata={"help": "The name of the task (ner, pos...)."}) - dataset_name: Optional[str] = field( - default=None, metadata={"help": "The name of the dataset to use (via the datasets library)."} - ) - dataset_config_name: Optional[str] = field( - default=None, metadata={"help": "The configuration name of the dataset to use (via the datasets library)."} - ) - train_file: Optional[str] = field( - default=None, metadata={"help": "The input training data file (a csv or JSON file)."} - ) - validation_file: Optional[str] = field( - default=None, - metadata={"help": "An optional input evaluation data file to evaluate on (a csv or JSON file)."}, - ) - test_file: Optional[str] = field( - default=None, - metadata={"help": "An optional input test data file to predict on (a csv or JSON file)."}, - ) - text_column_name: Optional[str] = field( - default=None, metadata={"help": "The column name of text to input in the file (a csv or JSON file)."} - ) - label_column_name: Optional[str] = field( - default=None, metadata={"help": "The column name of label to input in the file (a csv or JSON file)."} - ) - overwrite_cache: bool = field( - default=False, metadata={"help": "Overwrite the cached training and evaluation sets"} - ) - preprocessing_num_workers: Optional[int] = field( - default=None, - metadata={"help": "The number of processes to use for the preprocessing."}, - ) - max_length: Optional[int] = field(default=256, metadata={"help": "Max length (in tokens) for truncation/padding"}) - pad_to_max_length: bool = field( - default=False, - metadata={ - "help": ( - "Whether to pad all samples to model maximum sentence length. " - "If False, will pad the samples dynamically when batching to the maximum length in the batch. More " - "efficient on GPU but very bad for TPU." - ) - }, - ) - max_train_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of training examples to this " - "value if set." - ) - }, - ) - max_eval_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of evaluation examples to this " - "value if set." - ) - }, - ) - max_predict_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of prediction examples to this " - "value if set." - ) - }, - ) - label_all_tokens: bool = field( - default=False, - metadata={ - "help": ( - "Whether to put the label for one word on all tokens of generated by that word or just on the " - "one (in which case the other tokens will have a padding index)." - ) - }, - ) - return_entity_level_metrics: bool = field( - default=False, - metadata={"help": "Whether to return all the entity levels during evaluation or just the overall ones."}, - ) - - def __post_init__(self): - if self.dataset_name is None and self.train_file is None and self.validation_file is None: - raise ValueError("Need either a dataset name or a training/validation file.") - else: - if self.train_file is not None: - extension = self.train_file.split(".")[-1] - assert extension in ["csv", "json"], "`train_file` should be a csv or a json file." - if self.validation_file is not None: - extension = self.validation_file.split(".")[-1] - assert extension in ["csv", "json"], "`validation_file` should be a csv or a json file." - self.task_name = self.task_name.lower() - -@dataclass -class OptimizationArguments: - """ - Arguments pertaining to what type of optimization we are going to apply on the model. - """ - - tune: bool = field( - default=False, - metadata={"help": "Whether or not to apply quantization."}, - ) - quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, - ) - metric_name: Optional[str] = field( - default=None, - metadata={"help": "Metric used for the tuning strategy."}, - ) - is_relative: Optional[bool] = field( - default=True, - metadata={"help": "Metric tolerance model, expected to be relative or absolute."}, - ) - perf_tol: Optional[float] = field( - default=0.01, - metadata={"help": "Performance tolerance when optimizing the model."}, - ) - benchmark: bool = field( - default=False, - metadata={"help": "run benchmark."}) - int8: bool = field( - default=False, - metadata={"help":"Whether to use the quantized int8 model."}) - accuracy_only: bool = field( - default=False, - metadata={"help":"Whether to only test accuracy for model tuned by Neural Compressor."}) - -@dataclass -class DistributedArguments: - """ - Arguments setting the distributed multinode environment - """ - - worker: str = field( - default=None, - metadata={"help": "List of node ip addresses in a string, and there should not be space between addresses."}, - ) - task_index: int = field( - default=0, - metadata={"help": "Worker index, and 0 represents the chief worker while other workers are set as 1,2,3..."}, - ) - -# endregion - - -def main(): - # region Argument Parsing - parser = HfArgumentParser((ModelArguments, DataTrainingArguments, TFTrainingArguments, OptimizationArguments, DistributedArguments)) - model_args, data_args, training_args, optim_args, distributed_args = parser.parse_args_into_dataclasses() - # endregion - - # region Setup logging - # we only want one process per machine to log things on the screen. - # accelerator.is_local_main_process is only True for one process per machine. - # region Logging - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%m/%d/%Y %H:%M:%S", - handlers=[logging.StreamHandler(sys.stdout)], - ) - logger.setLevel(logging.INFO if is_main_process(training_args.local_rank) else logging.WARN) - - # Set the verbosity to info of the Transformers logger (on main process only): - if is_main_process(training_args.local_rank): - transformers.utils.logging.set_verbosity_info() - transformers.utils.logging.enable_default_handler() - transformers.utils.logging.enable_explicit_format() - logger.info(f"Training/evaluation parameters {training_args}") - # endregion - - # If passed along, set the training seed now. - if training_args.seed is not None: - set_seed(training_args.seed) - # endregion - - # region Set the multinode environment, the strategy and paths - strategy = None - worker_list = None - if distributed_args.worker is not None: - logger.info("distributed environment initialization...") - - worker_list = distributed_args.worker.split(",") - - from intel_extension_for_transformers.transformers.utils.utility_tf import distributed_init - distributed_init(worker_list, "worker", distributed_args.task_index) - - strategy = tf.distribute.MultiWorkerMirroredStrategy() - from intel_extension_for_transformers.transformers.utils.utility_tf import get_filepath - training_args.output_dir = get_filepath(training_args.output_dir, strategy.cluster_resolver.task_type, strategy.cluster_resolver.task_id) - else: - strategy = training_args.strategy - #endregion - - # region Loading datasets - # Get the datasets: you can either provide your own CSV/JSON/TXT training and evaluation files (see below) - # or just provide the name of one of the public datasets for token classification task available on the hub at https://huggingface.co/datasets/ - # (the dataset will be downloaded automatically from the datasets Hub). - # - # For CSV/JSON files, this script will use the column called 'tokens' or the first column if no column called - # 'tokens' is found. You can easily tweak this behavior (see below). - # - # In distributed training, the load_dataset function guarantee that only one local process can concurrently - # download the dataset. - if data_args.dataset_name is not None: - # Downloading and loading a dataset from the hub. - raw_datasets = load_dataset( - data_args.dataset_name, - data_args.dataset_config_name, - use_auth_token=True if model_args.use_auth_token else None, - cache_dir=model_args.cache_dir, - ) - else: - data_files = {} - if data_args.train_file is not None: - data_files["train"] = data_args.train_file - if data_args.validation_file is not None: - data_files["validation"] = data_args.validation_file - extension = data_args.train_file.split(".")[-1] - raw_datasets = load_dataset( - extension, - data_files=data_files, - use_auth_token=True if model_args.use_auth_token else None, - cache_dir=model_args.cache_dir, - ) - # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at - # https://huggingface.co/docs/datasets/loading_datasets.html. - - if raw_datasets["train"] is not None: - column_names = raw_datasets["train"].column_names - features = raw_datasets["train"].features - else: - column_names = raw_datasets["validation"].column_names - features = raw_datasets["validation"].features - - if data_args.text_column_name is not None: - text_column_name = data_args.text_column_name - elif "tokens" in column_names: - text_column_name = "tokens" - else: - text_column_name = column_names[0] - - if data_args.label_column_name is not None: - label_column_name = data_args.label_column_name - elif f"{data_args.task_name}_tags" in column_names: - label_column_name = f"{data_args.task_name}_tags" - else: - label_column_name = column_names[1] - - # In the event the labels are not a `Sequence[ClassLabel]`, we will need to go through the dataset to get the - # unique labels. - def get_label_list(labels): - unique_labels = set() - for label in labels: - unique_labels = unique_labels | set(label) - label_list = list(unique_labels) - label_list.sort() - return label_list - - if isinstance(features[label_column_name].feature, ClassLabel): - label_list = features[label_column_name].feature.names - # No need to convert the labels since they are already ints. - label_to_id = {i: i for i in range(len(label_list))} - else: - label_list = get_label_list(raw_datasets["train"][label_column_name]) - label_to_id = {l: i for i, l in enumerate(label_list)} - num_labels = len(label_list) - # endregion - - # region Load config and tokenizer - # - # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently - # download model & vocab. - - config = AutoConfig.from_pretrained( - model_args.config_name if model_args.config_name else model_args.model_name_or_path, - num_labels=num_labels, - finetuning_task=data_args.task_name, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - _commit_hash="main", - ) - - tokenizer_name_or_path = model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path - if not tokenizer_name_or_path: - raise ValueError( - "You are instantiating a new tokenizer from scratch. This is not supported by this script." - "You can do it from another script, save it, and load it from here, using --tokenizer_name." - ) - - if config.model_type in {"gpt2", "roberta"}: - tokenizer = AutoTokenizer.from_pretrained(tokenizer_name_or_path, cache_dir=model_args.cache_dir, use_fast=True, - add_prefix_space=True, _commit_hash="main",) - else: - tokenizer = AutoTokenizer.from_pretrained(tokenizer_name_or_path, cache_dir=model_args.cache_dir, use_fast=True, - _commit_hash="main",) - # endregion - - # region Preprocessing the raw datasets - # First we tokenize all the texts. - # should always use padding because the current ptq does not use tf > 2.8 - # so no RaggedTensor is supported - padding = "max_length" if data_args.pad_to_max_length else False - - # Tokenize all texts and align the labels with them. - - def tokenize_and_align_labels(examples): - tokenized_inputs = tokenizer( - examples[text_column_name], - max_length=data_args.max_length, - padding=padding, - truncation=True, - # We use this argument because the texts in our dataset are lists of words (with a label for each word). - is_split_into_words=True, - ) - - labels = [] - for i, label in enumerate(examples[label_column_name]): - word_ids = tokenized_inputs.word_ids(batch_index=i) - previous_word_idx = None - label_ids = [] - for word_idx in word_ids: - # Special tokens have a word id that is None. We set the label to -100 so they are automatically - # ignored in the loss function. - if word_idx is None: - label_ids.append(-100) - # We set the label for the first token of each word. - elif word_idx != previous_word_idx: - label_ids.append(label_to_id[label[word_idx]]) - # For the other tokens in a word, we set the label to either the current label or -100, depending on - # the label_all_tokens flag. - else: - label_ids.append(label_to_id[label[word_idx]] if data_args.label_all_tokens else -100) - previous_word_idx = word_idx - - labels.append(label_ids) - tokenized_inputs["labels"] = labels - return tokenized_inputs - - processed_raw_datasets = raw_datasets.map( - tokenize_and_align_labels, - batched=True, - remove_columns=raw_datasets["train"].column_names, - desc="Running tokenizer on dataset", - ) - - train_dataset = processed_raw_datasets["train"] - eval_dataset = processed_raw_datasets["validation"] - - if data_args.max_train_samples is not None: - max_train_samples = min(len(train_dataset), data_args.max_train_samples) - train_dataset = train_dataset.select(range(max_train_samples)) - - if data_args.max_eval_samples is not None: - max_eval_samples = min(len(eval_dataset), data_args.max_eval_samples) - eval_dataset = eval_dataset.select(range(max_eval_samples)) - - # Log a few random samples from the training set: - for index in random.sample(range(len(train_dataset)), 3): - logger.info(f"Sample {index} of the training set: {train_dataset[index]}.") - # endregion - - # Metrics - metric = load_metric("seqeval") - - def get_labels(y_pred, y_true): - # Transform predictions and references tensos to numpy arrays - - # Remove ignored index (special tokens) - true_predictions = [ - [label_list[p] for (p, l) in zip(pred, gold_label) if l != -100] - for pred, gold_label in zip(y_pred, y_true) - ] - true_labels = [ - [label_list[l] for (p, l) in zip(pred, gold_label) if l != -100] - for pred, gold_label in zip(y_pred, y_true) - ] - return true_predictions, true_labels - - def compute_metrics(predictions, labels): - predictions = predictions["logits"] - predictions = np.argmax(predictions, axis=-1) - - attention_mask = eval_dataset.with_format("tf")["attention_mask"] - labels[attention_mask == 0] = -100 - - # Remove ignored index (special tokens) - preds, refs = get_labels(predictions, labels) - - metric.add_batch( - predictions=preds, - references=refs, - ) - results = metric.compute() - - if data_args.return_entity_level_metrics: - # Unpack nested dictionaries - final_results = {} - for key, value in results.items(): - if isinstance(value, dict): - for n, v in value.items(): - final_results[f"{key}_{n}"] = v - else: - final_results[key] = value - return final_results - else: - return { - "precision": results["overall_precision"], - "recall": results["overall_recall"], - "f1": results["overall_f1"], - "accuracy": results["overall_accuracy"], - } - - # endregion - - with strategy.scope(): - # region Initialize model - if model_args.model_name_or_path: - model = TFAutoModelForTokenClassification.from_pretrained( - model_args.model_name_or_path, - config=config, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - ) - else: - logger.info("Training new model from scratch") - model = TFAutoModelForTokenClassification.from_config(config) - - model.resize_token_embeddings(len(tokenizer)) - # endregion - - # region Create TF datasets - - # We need the DataCollatorForTokenClassification here, as we need to correctly pad labels as - # well as inputs. - collate_fn = DataCollatorForTokenClassification(tokenizer=tokenizer, return_tensors="tf") - total_train_batch_size = training_args.per_device_train_batch_size * (len(worker_list) if worker_list is not None else 1) - - dataset_options = tf.data.Options() - dataset_options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF - - # model.prepare_tf_dataset() wraps a Hugging Face dataset in a tf.data.Dataset which is ready to use in - # training. This is the recommended way to use a Hugging Face dataset when training with Keras. You can also - # use the lower-level dataset.to_tf_dataset() method, but you will have to specify things like column names - # yourself if you use this method, whereas they are automatically inferred from the model input names when - # using model.prepare_tf_dataset() - # For more info see the docs: - # https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.TFPreTrainedModel.prepare_tf_dataset - # https://huggingface.co/docs/datasets/main/en/package_reference/main_classes#datasets.Dataset.to_tf_dataset - - tf_train_dataset = model.prepare_tf_dataset( - train_dataset, - collate_fn=collate_fn, - batch_size=total_train_batch_size, - shuffle=True, - ).with_options(dataset_options) - total_eval_batch_size = training_args.per_device_eval_batch_size * (len(worker_list) if worker_list is not None else 1) - tf_eval_dataset = model.prepare_tf_dataset( - eval_dataset, - collate_fn=collate_fn, - batch_size=total_eval_batch_size, - shuffle=False, - ).with_options(dataset_options) - - # endregion - - # region Optimizer, loss and compilation - optimizer = tf.keras.optimizers.Adam( - learning_rate=training_args.learning_rate, - beta_1=training_args.adam_beta1, - beta_2=training_args.adam_beta2, - epsilon=training_args.adam_epsilon, - clipnorm=training_args.max_grad_norm, - ) - - model.compile(optimizer=optimizer, jit_compile=training_args.xla) - # endregion - - if optim_args.tune: - from intel_extension_for_transformers.transformers import metrics, objectives, QuantizationConfig, TFOptimization - optimization = TFOptimization( - model=model, - args=training_args, - train_dataset=tf_train_dataset, - eval_dataset=tf_eval_dataset, - compute_metrics=compute_metrics, - task_type=strategy.cluster_resolver.task_type if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - task_id=strategy.cluster_resolver.task_id if isinstance(strategy, tf.distribute.MultiWorkerMirroredStrategy) else None, - ) - tune_metric = metrics.Metric( - name="accuracy", greater_is_better=True, is_relative=True, criterion=optim_args.perf_tol, - ) - quantization_config = QuantizationConfig( - framework="tensorflow", - approach="POSTTRAININGSTATIC", - metrics=[tune_metric], - objectives=[objectives.performance] - ) - quantized_model = optimization.quantize(quant_config=quantization_config) - exit(0) - - # region Training - if training_args.do_train: - callbacks = [SavePretrainedCallback(output_dir=training_args.output_dir)] - logger.info("***** Running training *****") - logger.info(f" Num examples = {len(train_dataset)}") - logger.info(f" Num Epochs = {training_args.num_train_epochs}") - logger.info(f" Instantaneous batch size per device = {training_args.per_device_train_batch_size}") - logger.info(f" Total train batch size = {total_train_batch_size}") - # Only show the progress bar once on each machine. - - model.fit( - tf_train_dataset, - validation_data=tf_eval_dataset, - epochs=int(training_args.num_train_epochs), - callbacks=callbacks, - ) - # endregion - - # region Evaluation - if training_args.do_eval: - # We normally do validation as part of the Keras fit loop, but we run it independently - # if there was no fit() step (because we didn't train the model) or if the task is MNLI, - # because MNLI has a separate validation-mismatched validation set - logger.info("*** Evaluate ***") - - tasks = [data_args.task_name] - tf_datasets = [tf_eval_dataset] - raw_datasets = [processed_raw_datasets["validation"]] - - num_examples = 0 - - if optim_args.int8: - model = tf.saved_model.load(training_args.output_dir) - else: - from intel_extension_for_transformers.transformers.utils.utility_tf import keras2SavedModel - model = keras2SavedModel(model) - - for raw_dataset, tf_dataset, task in zip(raw_datasets, tf_datasets, tasks): - num_examples += sum( - 1 for _ in (tf_dataset.unbatch() - if hasattr(tf_dataset, "unbatch") else tf_dataset - ) - ) - - preds: np.ndarray = None - label_ids: np.ndarray = None - infer = model.signatures[list(model.signatures.keys())[0]] - - if optim_args.accuracy_only: - iterations = 1 - warmup = 0 - else: - iterations = 10 - warmup = 5 - latency_list = [] - - for idx in range(iterations): - iteration_time = 0 - for i, (inputs, labels) in enumerate(tf_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - start = time.time() - results = infer(**inputs) - iteration_time += time.time() - start - if idx == 0: # only accumulate once all the preds and labels - for val in results: - if preds is None: - preds = results[val].numpy() - else: - preds = np.append(preds, results[val].numpy(), axis=0) - if label_ids is None: - label_ids = labels.numpy() - else: - label_ids = np.append(label_ids, labels.numpy(), axis=0) - - latency_list.append(iteration_time) - logger.info("Iteration {} time: {} sec".format(idx, iteration_time)) - eval_metrics = compute_metrics({"logits": preds}, label_ids) - logger.info("\nEvaluation result: ") - logger.info("metric ({}) Accuracy: {}".format(task, eval_metrics["accuracy"])) - - average_iteration_time = np.array(latency_list[warmup:]).mean() - logger.info( - "Throughput: {} samples/sec".format( - num_examples / average_iteration_time) - ) - # endregion - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/examples/huggingface/tensorflow/token-classification/quantization/run_tuning.sh b/examples/huggingface/tensorflow/token-classification/quantization/run_tuning.sh deleted file mode 100644 index 415cf26ddd1..00000000000 --- a/examples/huggingface/tensorflow/token-classification/quantization/run_tuning.sh +++ /dev/null @@ -1,104 +0,0 @@ -#!/bin/bash -set -x - -function main { - - init_params "$@" - run_tuning - -} - -# init params -function init_params { - topology="bert_base_ner" - tuned_checkpoint="saved_results" - extra_cmd="" - batch_size=8 - MAX_SEQ_LENGTH=128 - model_type="bert" - approach="PostTrainingStatic" - cache_dir="cache" - for var in "$@" - do - case $var in - --topology=*) - topology=$(echo $var |cut -f2 -d=) - ;; - --dataset_location=*) - dataset_location=$(echo $var |cut -f2 -d=) - ;; - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --output_model=*) - tuned_checkpoint=$(echo $var |cut -f2 -d=) - ;; - --worker=*) - worker=$(echo $var |cut -f2 -d=) - ;; - --task_index=*) - task_index=$(echo $var |cut -f2 -d=) - ;; - --cache_dir=*) - cache_dir=$(echo $var |cut -f2 -d=) - ;; - *) - echo "Error: No such parameter: ${var}" - exit 1 - ;; - esac - done - -} - -# run_tuning -function run_tuning { - batch_size=64 - if [ "${topology}" = "bert_base_ner" ]; then - TASK_NAME="ner" - model_name_or_path="dslim/bert-base-NER" - approach="PostTrainingStatic" - dataset_name=conll2003 - fi - - if [ "${worker}" = "" ] - then - python -u run_ner.py \ - --model_name_or_path ${model_name_or_path} \ - --dataset_name ${dataset_name} \ - --task_name ${TASK_NAME} \ - --pad_to_max_length \ - --do_eval \ - --max_length ${MAX_SEQ_LENGTH} \ - --per_device_train_batch_size ${batch_size} \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --no_cuda \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --quantization_approach ${approach} \ - --tune \ - ${extra_cmd} - else - python -u run_ner.py \ - --model_name_or_path ${model_name_or_path} \ - --dataset_name ${dataset_name} \ - --task_name ${TASK_NAME} \ - --pad_to_max_length \ - --do_eval \ - --max_length ${MAX_SEQ_LENGTH} \ - --per_device_train_batch_size ${batch_size} \ - --per_device_eval_batch_size ${batch_size} \ - --output_dir ${tuned_checkpoint} \ - --no_cuda \ - --overwrite_output_dir \ - --cache_dir ${cache_dir} \ - --quantization_approach ${approach} \ - --tune \ - --worker "${worker}" \ - --task_index ${task_index} \ - ${extra_cmd} - fi -} - -main "$@" diff --git a/intel_extension_for_transformers/transformers/__init__.py b/intel_extension_for_transformers/transformers/__init__.py index c7b129f1ba0..300ba84b71e 100644 --- a/intel_extension_for_transformers/transformers/__init__.py +++ b/intel_extension_for_transformers/transformers/__init__.py @@ -31,7 +31,7 @@ SUPPORTED_DISTILLATION_CRITERION_MODE, DistillationCriterionMode, ) -from .optimizer import NoTrainerOptimizer, Orchestrate_optimizer + from .optimizer_tf import TFOptimization from .pruning import SUPPORTED_PRUNING_MODE, PrunerConfig, PruningMode from .quantization import SUPPORTED_QUANT_MODE, QuantizationMode diff --git a/intel_extension_for_transformers/transformers/optimizer.py b/intel_extension_for_transformers/transformers/optimizer.py deleted file mode 100644 index de952776ffa..00000000000 --- a/intel_extension_for_transformers/transformers/optimizer.py +++ /dev/null @@ -1,447 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Optimization: provides the orchestrate optimizer for Pytorch.""" -import logging -import os -import shlex - -from neural_compressor.experimental import( - common, - Component, - Distillation, - Quantization, - Pruning, -) -from neural_compressor.training import prepare_compression -from neural_compressor.quantization import fit -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, -) -from neural_compressor.experimental.scheduler import Scheduler -from intel_extension_for_transformers.transformers import( - DistillationConfig, - Provider, - PruningConfig -) -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, -) -from intel_extension_for_transformers.transformers.utils.utility import LazyImport -from intel_extension_for_transformers.transformers.quantization import QuantizationMode -from transformers import PreTrainedModel, PretrainedConfig -from transformers.file_utils import WEIGHTS_NAME -from typing import Callable, Optional, Union, List - -torch = LazyImport("torch") - -logger = logging.getLogger(__name__) - - -class Orchestrate_optimizer: - """Orchestrate_optimizer aggregates and orchestrates components such as Quantization, Pruning and Distillation.""" - def __init__( - self, - model, - components: Optional[List[Component]] = [], - eval_func: Optional[Callable] = None, - train_func: Optional[Callable] = None, - output_dir: Optional[str] = "saved_results", - ): - """Init an orchestrate optimizer. - - Args: - model: Model to quantize and/or prune. - components: List of Component objects which contains Quantization, Pruning, Distillation objects. - eval_func: Evaluation function to evaluate the tuning objective. - train_func: Training function which will be combined with pruning. - """ - if len(components) == 0: - raise RuntimeError("`NLPOptimizer` requires at least one `Quantization`, " - "`Pruning` or `Distillation` object") - self.output_dir = output_dir - if hasattr(model, 'config') and isinstance(model.config, PretrainedConfig): - self.model_config = model.config - self.enable_inc_quant = False - self.enable_inc_pruning = False - self.scheduler = Scheduler() - self.scheduler.model = common.Model(model) - - if len(components) > 1: - agent = self.scheduler.combine(*components) - agent.train_func = train_func - agent.eval_func = eval_func - for component in components: - if isinstance(component, Distillation) and hasattr(component, 'criterion'): - agent.criterion = component.criterion - if isinstance(component, Quantization): - self.enable_inc_quant = True - if isinstance(component, Pruning): - self.enable_inc_pruning = True - self.scheduler.append(agent) - else: - self.scheduler.append(*components) - - def fit(self): - """Run the scheduler.""" - self.opt_model = self.scheduler() - self.save_model(self.output_dir) - if self.enable_inc_pruning == True: - stats, sparsity = self.opt_model.report_sparsity() - logger.info(stats) - logger.info(sparsity) - return self.opt_model.model - - def save_model(self, output_dir, tokenizer=None): - """Save the model and tokenizer in the output directory. - - Args: - output_dir: the path to save config.json and pytorch_model.bin. - tokenizer (object, optional): the tokenizer object, use it if you want to - save tokenizer.json in output_dir. Defaults to None. - """ - os.makedirs(shlex.quote(output_dir), exist_ok=True) - torch.save(self.opt_model.quantized_state_dict(), os.path.join(shlex.quote(output_dir), WEIGHTS_NAME)) - if hasattr(self, 'model_config') and isinstance(self.model_config, PretrainedConfig): - if self.enable_inc_quant == True: - self.model_config.torch_dtype = "int8" - self.model_config.save_pretrained(output_dir) - if tokenizer: # pragma: no cover - tokenizer.save_pretrained(output_dir) - logger.info("orchestrate_optimizations model and configure file have saved to {}".format( - output_dir)) - - -class NoTrainerOptimizer: # pragma: no cover - """Optimizer without using Trainer.""" - def __init__( - self, - model, - output_dir: Optional[str] = "saved_results", - ): - """Init a NoTrainerOptimizer object. - - Args: - model: FP32 model specified for low precision tuning. - output_dir: The folder for saving the results. - """ - self.model = model - self.teacher_model = None - self._eval_func = None - self._train_func = None - self._calib_func = None - self._calib_dataloader = None - self.output_dir = output_dir - self.quant_config = None - self.pruning_config = None - self.distillation_config = None - self._provider = Provider.INC.value - self.pruner = None - self.quantizer = None - self.distiller = None - self.in_training = False - self.enable_inc_quant = False - - @property - def eval_func(self): - """Get the evaluation function.""" - return self._eval_func - - @property - def train_func(self): - """Get the train function.""" - return self._train_func - - @property - def calib_func(self): - """Get the calib function.""" - return self._calib_func - - @property - def provider(self): - """Get the provider.""" - return self._provider - - @property - def calib_dataloader(self): - """Get the calibration dataloader.""" - return self._calib_dataloader - - @eval_func.setter - def eval_func(self, func: Callable): - """Set the evaluation function. - - Args: - func: evaluation function. - """ - self._eval_func = func - - @train_func.setter - def train_func(self, func: Callable): - """Set the train function. - - Args: - func: train function. - """ - self._train_func = func - - @provider.setter - def provider(self, provider): - """Set the provider. - - Args: - provider: optimization provider. - """ - self._provider = provider - - @calib_dataloader.setter - def calib_dataloader(self, dataloader): - """Set the calibration dataloader. - - Args: - dataloader: calibration dataloader. - """ - # transformer issue #1 - if dataloader.batch_size is None: - from .utils.utility import _build_inc_dataloader - self._calib_dataloader = _build_inc_dataloader(dataloader) - else: - self._calib_dataloader = dataloader - - def _inc_quantize( - self, - quant_config, - provider: str = Provider.INC.value, - ): - """Do the quantization.""" - if self._eval_func is not None: - self.quantizer.eval_func = self._eval_func - if self._calib_func is not None: - self.quantizer.calib_func = self._calib_func - if isinstance(quant_config, PostTrainingQuantConfig): - if quant_config.backend == "ipex": - self.model_config = self.model.config # jit model will loss config - if self._calib_dataloader is None: - self._calib_dataloader = self.get_train_dataloader() - self.opt_model = fit(self.model, - conf=quant_config, - calib_dataloader=self._calib_dataloader, - eval_func=self._eval_func) - else: - compression_manager = prepare_compression(self.model, quant_config) - compression_manager.callbacks.on_train_begin() - self.train() - compression_manager.callbacks.on_train_end() - self.opt_model = compression_manager.model - self.enable_inc_quant = True - self.save_model(self.args.output_dir) - return self.opt_model.model - - def quantize( - self, - quant_config: Union[PostTrainingQuantConfig, QuantizationAwareTrainingConfig] = None, - provider: str = Provider.INC.value, - eval_func: Optional[Callable] = None, - train_func: Optional[Callable] = None, - calib_func: Optional[Callable] = None, - calib_dataloader=None, - ): - """Prepare for invoking the _inc_quantize function. - - Args: - quant_config: quantization config. - provider: define the quantization provider. - eval_func: evaluation function. - train_func: train function. - calib_func: calibration function. - calib_dataloader: calibration dataloader. - """ - if eval_func is not None: - self._eval_func = eval_func - if train_func is not None: - self._train_func = train_func - if calib_func is not None: - self._calib_func = calib_func - if calib_dataloader is not None: - self._calib_dataloader = calib_dataloader - - if self.quantizer is None: - self._provider = Provider[provider.upper()].value - - if self._provider == Provider.INC.value: - return self._inc_quantize(quant_config=quant_config, provider=provider) - else: - assert False, "Unsupported provider:{}".format(self._provider) - - def init_pruner( - self, - pruning_config = None, - provider: str = Provider.INC.value, - ): - """Init a Pruning object with config. - - Args: - pruning_config: pruning config. - provider: define the pruning provider. - """ - from neural_compressor.experimental import Pruning - self.pruning_config = pruning_config - self.metrics = self.pruning_config.metrics - self._provider = Provider[provider.upper()].value - - assert isinstance(self.pruning_config, PruningConfig), \ - "please pass a instance of PruningConfig to trainer.prune!" - - pruner = Pruning(self.pruning_config.inc_config) - pruner.model = common.Model(self.model) - - self.pruner = pruner - return pruner - - def prune( - self, - pruning_config = None, - provider: str = Provider.INC.value, - eval_func: Optional[Callable] = None, - train_func: Optional[Callable] = None, - ): - """Do the pruning. - - Args: - pruning_config: pruning config. - provider: define the pruning provider. - eval_func: evaluation function. - train_func: train function. - """ - if self.pruner is None: - self.init_pruner(pruning_config=pruning_config, provider=provider) - if eval_func is not None: - self._eval_func = eval_func - if train_func is not None: - self._train_func = train_func - - self.pruner.eval_func = self._eval_func - - self.pruner.pruning_func = self._train_func - - self.opt_model = self.pruner.fit() - self.save_model(self.output_dir) - stats, sparsity = self.opt_model.report_sparsity() - logger.info(stats) - logger.info(sparsity) - - return self.opt_model.model - - def init_distiller( - self, - distillation_config, - teacher_model, - provider: str = Provider.INC.value, - ): - """Init a Distillation object with config and the teacher model. - - Args: - distillation_config: distillation config. - teacher_model: set the teacher model. - provider: define the distillation provider. - """ - from neural_compressor.experimental import Distillation, common - assert isinstance(distillation_config, DistillationConfig), \ - "please pass a instance of PruningConfig to trainer.prune!" - self.distillation_config = distillation_config - self._provider = Provider[provider.upper()].value - self.metrics = self.distillation_config.metrics - self.teacher_model = teacher_model - - distiller = Distillation(self.distillation_config.inc_config) - distiller.model = common.Model(self.model) - distiller.teacher_model = common.Model(self.teacher_model) - - self.distiller = distiller - return distiller - - def distill( - self, - distillation_config, - teacher_model, - provider: str = Provider.INC.value, - eval_func: Optional[Callable] = None, - train_func: Optional[Callable] = None, - ): - """Do the distillation. - - Args: - distillation_config: distillation config. - teacher_model: set the teacher model. - provider: define the distillation provider. - eval_func: evaluation function. - train_func: train function. - """ - if self.distiller is None: - self.init_distiller( - distillation_config=distillation_config, - teacher_model=teacher_model, - provider=provider - ) - if eval_func is not None: - self._eval_func = eval_func - if train_func is not None: - self._train_func = train_func - - self.distiller.eval_func = self._eval_func - self.distiller.train_func = self._train_func - self.distiller.create_criterion() - - self.opt_model = self.distiller.fit() - self.save_model(self.output_dir) - return self.opt_model.model - - def _save_inc_int8(self, opt_model, output_dir): - """Save the optimized model in the output directory. - - Args: - opt_model: optimized model. - output_dir: output path. - """ - self.model.config.architectures = [self.model.__class__.__name__] - self.model.config.torch_dtype = "int8" - if isinstance(self.model.config, PretrainedConfig): - self.model.config.save_pretrained(output_dir) - weights_file = os.path.join(os.path.abspath( - os.path.expanduser(output_dir)), WEIGHTS_NAME) - torch.save(opt_model.quantized_state_dict(), weights_file) - - def save_model(self, output_dir, tokenizer=None): - """Save the model and tokenizer in the output directory. - - Args: - output_dir: the path to save config.json and pytorch_model.bin. - tokenizer (object, optional): the tokenizer object, use it if you want to - save tokenizer.json in output_dir. Defaults to None. - """ - os.makedirs(shlex.quote(output_dir), exist_ok=True) - torch.save(self.opt_model.quantized_state_dict(), os.path.join(shlex.quote(output_dir), WEIGHTS_NAME)) - if self.enable_inc_quant and self.opt_model: - self._save_inc_int8(self.opt_model, output_dir) - else: - self.model.save_pretrained(output_dir) - self.model.config.save_pretrained(output_dir) - if tokenizer: # pragma: no cover - tokenizer.save_pretrained(output_dir) - logger.info("Optimized model and configure file have saved to {}".format( - output_dir)) diff --git a/intel_extension_for_transformers/transformers/trainer.py b/intel_extension_for_transformers/transformers/trainer.py index a2534977363..387a9466389 100644 --- a/intel_extension_for_transformers/transformers/trainer.py +++ b/intel_extension_for_transformers/transformers/trainer.py @@ -29,18 +29,15 @@ from neural_compressor import __version__ as nc_version from neural_compressor.utils import logger from intel_extension_for_transformers.transformers import ( - DistillationConfig, Provider, - PruningMode, - QuantizationConfig, - QuantizationMode, - PruningConfig, DynamicLengthConfig, BenchmarkConfig, ) from neural_compressor.training import prepare_compression from neural_compressor.quantization import fit from neural_compressor.config import ( + DistillationConfig, + WeightPruningConfig, PostTrainingQuantConfig, QuantizationAwareTrainingConfig, ) @@ -133,11 +130,7 @@ def __init__(self, *args, **kwargs): self._calib_dataloader = None self._resuming_checkpoint = None self.compression_ctrl = None - self.component = None self.enable_inc_quant = False - self.pruner = None - self.quantizer = None - self.distiller = None self.fp32_model = None self.opt_model = None # This flag is set for the engine in the export_to_int8_onnx API. @@ -147,6 +140,7 @@ def __init__(self, *args, **kwargs): self.orchestrate_opt_pruning = False self.dynamic_config = None self.model_config = None + self.compression_manager = None @property def resuming_checkpoint(self): @@ -244,7 +238,7 @@ def builtin_train_func(self, model): """ self.model_wrapped = model self.model = model - train_result = self.train(component=self.component, + train_result = self.train(compression_manager=self.compression_manager, resume_from_checkpoint=self._resuming_checkpoint) metrics = train_result.metrics if not self.orchestrate_opt: @@ -275,10 +269,11 @@ def _inc_quantize( eval_func=self._eval_func) else: compression_manager = prepare_compression(self.model, quant_config) - compression_manager.callbacks.on_train_begin() - self.train() - compression_manager.callbacks.on_train_end() - self.opt_model = compression_manager.model + self.compression_manager = compression_manager + self.compression_manager.callbacks.on_train_begin() + self._train_func(compression_manager.model._model) + self.compression_manager.callbacks.on_train_end() + self.opt_model = self.compression_manager.model self.enable_inc_quant = True self.save_model(self.args.output_dir) return self.opt_model.model @@ -338,54 +333,9 @@ def _save_inc_int8(self, opt_model, output_dir): torch.save(opt_model.quantized_state_dict(), weights_file) logger.info("quantized model and configure file have saved to {}".format(output_dir)) - def init_pruner( - self, - pruning_config=None, - provider: str = Provider.INC.value, - ): - """Initialize the pruner. - - Args: - pruning_config: The path to the YAML configuration file or PruningConf class containing - accuracy goal, pruning objective and related dataloaders etc. - provider: The provider used to quantize. - - Returns: - An objective of neural_compressor Pruning class. - """ - - from neural_compressor.experimental import Pruning - self.pruning_config = pruning_config - self.metrics = self.pruning_config.metrics - self._provider = Provider[provider.upper()].value - - assert isinstance(self.pruning_config, PruningConfig), \ - "please pass a instance of PruningConfig to trainer.prune!" - - pruning_start_epoch, pruning_end_epoch = self.pruning_config.epoch_range - - # pylint: disable=E1101 - if pruning_start_epoch > self.args.num_train_epochs - 1: - logger.warning(f"Pruning end epoch {pruning_start_epoch} is higher than " - f"the total number of training epoch " - f"{self.args.num_train_epochs}. No pruning will be applied.") - - # pylint: disable=E1101 - if pruning_end_epoch > self.args.num_train_epochs - 1: - logger.warning( - f"Pruning end epoch {pruning_end_epoch} is higher than " - f"the total number of training epoch " - f"{self.args.num_train_epochs}. The target sparsity will not be reached.") - - pruner = Pruning(self.pruning_config.inc_config) - pruner.model = self.model - - self.pruner = pruner - return pruner - def prune( self, - pruning_config=None, + pruning_config: Union[WeightPruningConfig] = None, provider: str = Provider.INC.value, eval_func: Optional[Callable] = None, train_func: Optional[Callable] = None, @@ -402,72 +352,19 @@ def prune( Returns: An objective of neural_compressor Pruning class. """ - if self.pruner is None: - self.init_pruner(pruning_config=pruning_config, provider=provider) - if eval_func is not None: - self._eval_func = eval_func - if train_func is not None: - self._train_func = train_func - - if self._eval_func is not None: - self.pruner.eval_func = self._eval_func - else: - assert self.metrics is not None, "Please pass metrics to trainer.pruning.metrics!" - assert self.pruning_config.pruner_config[0].prune_type == PruningMode.BASICMAGNITUDE.value, \ - "Please pass eval_func to trainer.eval_func" - self.pruner.eval_func = self.builtin_eval_func - - if self._train_func is not None: - self.pruner.pruning_func = self._train_func - else: - assert self.pruning_config.pruner_config[0].prune_type == PruningMode.BASICMAGNITUDE.value, \ - "Please pass train_func to trainer.train_func" - self.pruner.pruning_func = self.builtin_train_func - - self.component = self.pruner - self.opt_model = self.pruner.fit() - stats, sparsity = self.opt_model.report_sparsity() - logger.info(stats) - logger.info(sparsity) - + self._eval_func = self.builtin_eval_func if eval_func is None else eval_func + self._train_func = self.builtin_train_func if train_func is None else train_func + compression_manager = prepare_compression(model=self.model, confs=pruning_config) + self.compression_manager = compression_manager + self.compression_manager.callbacks.on_train_begin() + self._train_func(compression_manager.model._model) + self.compression_manager.callbacks.on_train_end() + self.opt_model = self.compression_manager.model return self.opt_model.model - def init_distiller( - self, - distillation_config, - teacher_model: Union[PreTrainedModel, torch.nn.Module], - provider: str = Provider.INC.value, - ): - """The main entry point of automatic distillation tuning. - - Args: - quant_config: The path to the YAML configuration file or DistillationConfig class containing. - accuracy goal, distillation objective and related dataloaders etc. - teacher_model: The model(torch.nn.Module) transfers knowledge to a smaller model. - provider (str): The provider used to quantize. - - Returns: - An objective of neural_compressor Distillation class. - """ - from neural_compressor.experimental import Distillation - assert isinstance(distillation_config, DistillationConfig), \ - "please pass a instance of PruningConfig to trainer.prune!" - self.distillation_config = distillation_config - self._provider = Provider[provider.upper()].value - self.metrics = self.distillation_config.metrics - self.teacher_model = teacher_model - - distiller = Distillation(self.distillation_config.inc_config) - distiller.model = self.model - distiller.teacher_model = self.teacher_model - - self.distiller = distiller - return distiller - def distill( self, - distillation_config, - teacher_model: Union[PreTrainedModel, torch.nn.Module], + distillation_config: Union[DistillationConfig] = None, provider: str = Provider.INC.value, eval_func: Optional[Callable] = None, train_func: Optional[Callable] = None, @@ -477,7 +374,6 @@ def distill( Args: quant_config: The path to the YAML configuration file or DistillationConfig class containing accuracy goal, distillation objective and related dataloaders etc. - teacher_model: The model(torch.nn.Module) transfers knowledge to a smaller model. provider (str): The provider used to quantize. eval_func (:obj:`Callable`, optional: The function to evaluate the model. train_func (:obj:`Callable`, optional: The function to train the model. @@ -485,34 +381,25 @@ def distill( Returns: An objective of neural_compressor Distillation class. """ - if self.distiller is None: - self.init_distiller(distillation_config=distillation_config, - teacher_model=teacher_model, - provider=provider) - if eval_func is not None: - self._eval_func = eval_func - if train_func is not None: - self._train_func = train_func - - if self._eval_func is not None: - self.distiller.eval_func = self._eval_func + if distillation_config.teacher_model is not None: + self.teacher_model = distillation_config.teacher_model else: - assert self.metrics is not None, \ - "Please pass metrics to trainer.distillation.metrics!" - self.distiller.eval_func = self.builtin_eval_func - - self.distiller.train_func = \ - self.builtin_train_func if self._train_func is None else self._train_func - self.distiller.create_criterion() - self.component = self.distiller - self.opt_model = self.distiller.fit() + assert False, "Please provide teacher model for DistillationConfig." + self._eval_func = self.builtin_eval_func if eval_func is None else eval_func + self._train_func = self.builtin_train_func if train_func is None else train_func + + compression_manager = prepare_compression(self.model, distillation_config) + self.compression_manager = compression_manager + self.compression_manager.callbacks.on_train_begin() + self._train_func(compression_manager.model._model) + self.compression_manager.callbacks.on_epoch_end() + self.opt_model = self.compression_manager.model return self.opt_model.model def orchestrate_optimizations( self, config_list, - teacher_model: Optional[Callable] = None, eval_func: Optional[Callable] = None, train_func: Optional[Callable] = None, ): @@ -525,50 +412,503 @@ def orchestrate_optimizations( eval_func (:obj:`Callable`, optional): Evaluation function to evaluate the tuning objective. train_func (:obj:`Callable`, optional): Training function which will be combined with pruning. """ - from intel_extension_for_transformers.transformers.optimizer import Orchestrate_optimizer + # from intel_extension_for_transformers.transformers.optimizer import Orchestrate_optimizer self.orchestrate_opt = True + for config in config_list: + if isinstance(config, DistillationConfig): + self.teacher_model = config.teacher_model + assert self.teacher_model is not None, "Distillation need teacher model, please provide." self._eval_func = self.builtin_eval_func if eval_func is None else eval_func self._train_func = self.builtin_train_func if train_func is None else train_func - components = self.create_optimizer_builtin(config_list, teacher_model) - self.orchestrate_optimizer = Orchestrate_optimizer(self.model, components, \ - eval_func=self.eval_func, train_func=self.train_func, \ - output_dir=self.args.output_dir) - self.component = self.orchestrate_optimizer.scheduler.components[0] - torch_model = self.orchestrate_optimizer.fit() - return torch_model + compression_manager = prepare_compression(model=self.model, confs=config_list) + self.compression_manager = compression_manager + self.compression_manager.callbacks.on_train_begin() + self._train_func(compression_manager.model._model) + self.compression_manager.callbacks.on_train_end() + self.opt_model = self.compression_manager.model + return self.opt_model.model - def create_optimizer_builtin(self, config_list, teacher_model=None): - """The function to create optimizer. + def train( + self, + compression_manager = None, + resume_from_checkpoint: Optional[Union[str, bool]] = None, + trial: Union["optuna.Trial", Dict[str, Any]] = None, + ignore_keys_for_eval: Optional[List[str]] = None, + **kwargs, + ): # pragma: no cover + """The main entry point tor train model. Args: - config_list: The list of configs. - teacher_model (:obj:`Callable`, optional): The model(torch.nn.Module) transfers knowledge - to a smaller model. + compression_manager (:obj:`CompressionManager`, `optional`): handling the training process. + resume_from_checkpoint (:obj:`str` or :obj:`bool`, `optional`): If a :obj:`str`, local path + to a saved checkpoint as saved by a previous instance of :class:`~transformers.Trainer`. + If a :obj:`bool` and equals `True`, load the last checkpoint in `args.output_dir` as saved + by a previous instance of :class:`~transformers.Trainer`. If present, training will resume + from the model/optimizer/scheduler states loaded here. + trial (:obj:`optuna.Trial` or :obj:`Dict[str, Any]`, `optional`): The trial run or the + hyperparameter dictionary for hyperparameter search. + ignore_keys_for_eval (:obj:`List[str]`, `optional`): A list of keys in the output of your model + (if it is a dictionary) that should be ignored when gathering predictions for evaluation + during the training. + kwargs: Additional keyword arguments used to hide deprecated arguments """ - components = [] - for config in config_list: - if isinstance(config, PostTrainingQuantConfig): - component = self.init_quantizer(config) - component.eval_func = self._eval_func - component.q_func = self._train_func - self.enable_inc_quant = True - elif isinstance(config, PruningConfig): - self.orchestrate_opt_pruning = True - component = self.init_pruner(config) - component.eval_func = self._eval_func - component.pruning_func = self._train_func - elif isinstance(config, DistillationConfig): - assert isinstance(teacher_model, torch.nn.Module), \ - "The teacher_model is needed for distiller" - component = self.init_distiller(config, teacher_model) - component.eval_func = self._eval_func - component.train_func = self._train_func - component.create_criterion() - else: # pragma: no cover - assert False, "Orchestrate_optimizations config_list requires at least one" \ - " `QuantizationConfig`, `PruningConfig` or `DistillationConfig` object" - components.append(component) - return components + resume_from_checkpoint = None if not resume_from_checkpoint else resume_from_checkpoint + + # memory metrics - must set up as early as possible + # pylint: disable=E1101 + self._memory_tracker.start() + + # pylint: disable=E1101 + args = self.args + + self.is_in_train = True + + self.compression_manager = compression_manager + + # do_train is not a reliable argument, as it might not be set and .train() still called, so + # the following is a workaround: + if args.fp16_full_eval and not args.do_train: + self._move_model_to_device(self.model, args.device) + + if "model_path" in kwargs: + resume_from_checkpoint = kwargs.pop("model_path") + warnings.warn( + "`model_path` is deprecated and will be removed in a future version. Use `resume_from_checkpoint` " + "instead.", + FutureWarning, + ) + if len(kwargs) > 0: + raise TypeError( + f"train() received got unexpected keyword arguments: {', '.join(list(kwargs.keys()))}." + ) + # This might change the seed so needs to run first. + self._hp_search_setup(trial) + + # Model re-init + model_reloaded = False + if self.model_init is not None: + # Seed must be set before instantiating the model when using model_init. + set_seed(args.seed) + self.model = self.call_model_init(trial) + model_reloaded = True + # Reinitializes optimizer and scheduler + self.optimizer, self.lr_scheduler = None, None + + # Load potential model checkpoint + if isinstance(resume_from_checkpoint, bool) and resume_from_checkpoint: + resume_from_checkpoint = get_last_checkpoint(args.output_dir) + if resume_from_checkpoint is None: + raise ValueError( + f"No valid checkpoint found in output directory ({args.output_dir})") + + if resume_from_checkpoint is not None: + if version.parse(__version__) < version.parse("4.19"): + if not os.path.isfile(os.path.join(resume_from_checkpoint, WEIGHTS_NAME)): + raise ValueError(f"Can't find a valid checkpoint at {resume_from_checkpoint}") + + logger.info(f"Loading model from {resume_from_checkpoint}).") + + if os.path.isfile(os.path.join(resume_from_checkpoint, CONFIG_NAME)): + config = PretrainedConfig.from_json_file( + os.path.join(resume_from_checkpoint, CONFIG_NAME)) + checkpoint_version = config.transformers_version + if checkpoint_version is not None and checkpoint_version != __version__: + logger.warn( + f"You are resuming training from a checkpoint trained with {checkpoint_version} of " + f"Transformers but your current version is {__version__}. " + "This is not recommended and could yield to errors or unwanted behaviors." + ) + + # We load the model state dict on the CPU to avoid an OOM error. + state_dict = torch.load(os.path.join(resume_from_checkpoint, WEIGHTS_NAME), + map_location="cpu") + # If the model is on the GPU, it still works! + self._load_state_dict_in_model(state_dict) + + # release memory + del state_dict + else: + self._load_from_checkpoint(resume_from_checkpoint) + + # If model was re-initialized, put it on the right device and update self.model_wrapped + if model_reloaded: + if self.place_model_on_device: + self._move_model_to_device(self.model, args.device) + self.model_wrapped = self.model + + # Keeping track whether we can can len() on the dataset or not + train_dataset_is_sized = isinstance(self.train_dataset, collections.abc.Sized) + + # Data loader and number of training steps + # pylint: disable=E1101 + train_dataloader = self.get_train_dataloader() + + # Setting up training control variables: + # number of training epochs: num_train_epochs + # number of training steps per epoch: num_update_steps_per_epoch + # total number of training steps to execute: max_steps + total_train_batch_size = args.train_batch_size * args.gradient_accumulation_steps * args.world_size + if train_dataset_is_sized: + num_update_steps_per_epoch = len(train_dataloader) // args.gradient_accumulation_steps + num_update_steps_per_epoch = max(num_update_steps_per_epoch, 1) + if args.max_steps > 0: + max_steps = args.max_steps + num_train_epochs = args.max_steps // num_update_steps_per_epoch + int( + args.max_steps % num_update_steps_per_epoch > 0) + # May be slightly incorrect if the last batch in the training datalaoder has a smaller size but it's + # the best we can do. + num_train_samples = args.max_steps * total_train_batch_size + else: + max_steps = math.ceil(args.num_train_epochs * num_update_steps_per_epoch) + num_train_epochs = math.ceil(args.num_train_epochs) + num_train_samples = len(self.train_dataset) * args.num_train_epochs + else: + # see __init__. max_steps is set when the dataset has no __len__ + max_steps = args.max_steps + # Setting a very large number of epochs so we go as many times as necessary over the iterator. + num_train_epochs = sys.maxsize + num_update_steps_per_epoch = max_steps + num_train_samples = args.max_steps * total_train_batch_size + + # pylint: disable=E1101 + if DebugOption.UNDERFLOW_OVERFLOW in self.args.debug: + if self.args.n_gpu > 1: + # nn.DataParallel(model) replicates the model, creating new variables and module + # references registered here no longer work on other gpus, breaking the module + raise ValueError("Currently --debug underflow_overflow is not supported under DP. " + "Please use DDP (torch.distributed.launch).") + else: + debug_overflow = DebugUnderflowOverflow(self.model) # noqa + + # delay_optimizer_creation = is_sagemaker_mp_enabled() or self.is_fsdp_xla_enabled or self.is_fsdp_enabled + delay_optimizer_creation = is_sagemaker_mp_enabled() + + if not delay_optimizer_creation: + self.create_optimizer_and_scheduler(num_training_steps=max_steps) + + self.state = TrainerState() + self.state.is_hyper_param_search = trial is not None + + # Activate gradient checkpointing if needed + if args.gradient_checkpointing: + self.model.gradient_checkpointing_enable() + + model = self._wrap_model(self.model_wrapped) + + # for the rest of this function `model` is the outside model, whether it was wrapped or not + if model is not self.model: + self.model_wrapped = model + + if delay_optimizer_creation: + self.create_optimizer_and_scheduler(num_training_steps=max_steps) + + # Check if saved optimizer or scheduler states exist + self._load_optimizer_and_scheduler(resume_from_checkpoint) + + # important: at this point: + # self.model is the Transformers Model + # self.model_wrapped is DDP(Transformers Model), Deepspeed(Transformers Model), etc. + + # Train! + num_examples = (self.num_examples(train_dataloader) + if train_dataset_is_sized else total_train_batch_size * args.max_steps) + + logger.info("***** Running training *****") + logger.info(f" Num examples = {num_examples}") + logger.info(f" Num Epochs = {num_train_epochs}") + logger.info(f" Instantaneous batch size per device = {args.per_device_train_batch_size}") + logger.info( + f" Total train batch size (w. parallel, distributed & accumulation) = {total_train_batch_size}" + ) + logger.info(f" Gradient Accumulation steps = {args.gradient_accumulation_steps}") + logger.info(f" Total optimization steps = {max_steps}") + + self.state.epoch = 0 + start_time = time.time() + epochs_trained = 0 + steps_trained_in_current_epoch = 0 + steps_trained_progress_bar = None + + # Check if continuing training from a checkpoint + if resume_from_checkpoint is not None and os.path.isfile( + os.path.join(resume_from_checkpoint, TRAINER_STATE_NAME)): + self.state = TrainerState.load_from_json( + os.path.join(resume_from_checkpoint, TRAINER_STATE_NAME)) + epochs_trained = self.state.global_step // num_update_steps_per_epoch + if not args.ignore_data_skip: + steps_trained_in_current_epoch = self.state.global_step % ( + num_update_steps_per_epoch) + steps_trained_in_current_epoch *= args.gradient_accumulation_steps + else: + steps_trained_in_current_epoch = 0 + + logger.info(" Continuing training from checkpoint, will skip to saved global_step") + logger.info(f" Continuing training from epoch {epochs_trained}") + logger.info(f" Continuing training from global step {self.state.global_step}") + if not args.ignore_data_skip: + logger.info( + f" Will skip the first {epochs_trained} epochs then the first {steps_trained_in_current_epoch} " + "batches in the first epoch. If this takes a lot of time, you can add the `--ignore_data_skip` " + "flag to your launch command, but you will resume the training on data already seen by your model." + ) + if self.is_local_process_zero() and not args.disable_tqdm: + steps_trained_progress_bar = tqdm(total=steps_trained_in_current_epoch) + steps_trained_progress_bar.set_description("Skipping the first batches") + + # Update the references + self.callback_handler.model = self.model + self.callback_handler.optimizer = self.optimizer + self.callback_handler.lr_scheduler = self.lr_scheduler + self.callback_handler.train_dataloader = train_dataloader + self.state.trial_name = self.hp_name(trial) if self.hp_name is not None else None + if trial is not None: + assignments = trial.assignments if self.hp_search_backend == HPSearchBackend.SIGOPT else trial + self.state.trial_params = hp_params(assignments) + else: + self.state.trial_params = None + # This should be the same if the state has been saved but in case the training arguments changed, it's safer + # to set this after the load. + self.state.max_steps = max_steps + self.state.num_train_epochs = num_train_epochs + self.state.is_local_process_zero = self.is_local_process_zero() + self.state.is_world_process_zero = self.is_world_process_zero() + + tr_loss = torch.tensor(0.0).to(args.device) + # _total_loss_scalar is updated every time .item() has to be called on tr_loss and stores the sum of all losses + self._total_loss_scalar = 0.0 + self._globalstep_last_logged = self.state.global_step + model.zero_grad() + + self.control = self.callback_handler.on_train_begin(args, self.state, self.control) + + # Skip the first epochs_trained epochs to get the random state of the dataloader at the right point. + if not args.ignore_data_skip: + for epoch in range(epochs_trained): + # We just need to begin an iteration to create the randomization of the sampler. + for _ in train_dataloader: + break + if self.compression_manager is not None: + if self.teacher_model is not None: + self.teacher_model = self._wrap_model( + self.teacher_model) + # compression_manager.pre_epoch_begin(self.calib_dataloader if self.calib_dataloader else None) + for epoch in range(epochs_trained, num_train_epochs): + if isinstance(train_dataloader, torch.utils.data.dataloader.DataLoader) and \ + isinstance(train_dataloader.sampler, torch.utils.data.distributed.DistributedSampler): + train_dataloader.sampler.set_epoch(epoch) + elif isinstance(train_dataloader.dataset, IterableDatasetShard): + train_dataloader.dataset.set_epoch(epoch) + + epoch_iterator = train_dataloader + + # Reset the past mems state at the beginning of each epoch if necessary. + if args.past_index >= 0: + self._past = None + + steps_in_epoch = (len(epoch_iterator) if train_dataset_is_sized else args.max_steps * + args.gradient_accumulation_steps) + self.control = self.callback_handler.on_epoch_begin(args, self.state, self.control) + if self.compression_manager is not None: + self.compression_manager.callbacks.on_epoch_begin(epoch) + + self.in_training = True + for step, inputs in enumerate(epoch_iterator): + + # Skip past any already trained steps if resuming training + if steps_trained_in_current_epoch > 0: + steps_trained_in_current_epoch -= 1 + if steps_trained_progress_bar is not None: + steps_trained_progress_bar.update(1) + if steps_trained_in_current_epoch == 0: + self._load_rng_state(resume_from_checkpoint) + continue + elif steps_trained_progress_bar is not None: + steps_trained_progress_bar.close() + steps_trained_progress_bar = None + + if step % args.gradient_accumulation_steps == 0: + self.control = self.callback_handler.on_step_begin( + args, self.state, self.control) + if compression_manager is not None: + self.compression_manager.callbacks.on_step_begin(step) + + training_step = self.training_step_length_adaptive if self.dynamic_config is not None and \ + self.dynamic_config.dynamic_training else self.training_step + if ( + ((step + 1) % args.gradient_accumulation_steps != 0) + and args.local_rank != -1 + and args._no_sync_in_gradient_accumulation + ): + # Avoid unnecessary DDP synchronization since there will be no backward pass on this example. + with model.no_sync(): + tr_loss_step = training_step(model, inputs) + else: + tr_loss_step = training_step(model, inputs) + + if args.logging_nan_inf_filter and (torch.isnan(tr_loss_step) + or torch.isinf(tr_loss_step)): + # if loss is nan or inf simply add the average of previous logged losses + tr_loss += tr_loss / (1 + self.state.global_step - + self._globalstep_last_logged) + else: + tr_loss += tr_loss_step + + self.current_flos += float(self.floating_point_ops(inputs)) + + if (step + 1) % args.gradient_accumulation_steps == 0 or ( + # last step in epoch but step is always smaller than gradient_accumulation_steps + steps_in_epoch <= args.gradient_accumulation_steps and + (step + 1) == steps_in_epoch): + # if isinstance(component, Component): + # component.on_post_grad() + + # Gradient clipping + if args.max_grad_norm is not None and args.max_grad_norm > 0: + + if hasattr(self.optimizer, "clip_grad_norm"): + # Some optimizers (like the sharded optimizer) have a specific way to do gradient clipping + self.optimizer.clip_grad_norm(args.max_grad_norm) + elif hasattr(model, "clip_grad_norm_"): + # Some models (like FullyShardedDDP) have a specific way to do gradient clipping + model.clip_grad_norm_(args.max_grad_norm) + else: + # Revert to normal clipping otherwise, handling Apex or full precision + torch.nn.utils.clip_grad_norm_( + model.parameters(), + args.max_grad_norm, + ) + + # # Optimizer step + # if self.compression_ctrl is not None: + # self.compression_ctrl.scheduler.step() + if self.compression_manager is not None: + self.compression_manager.callbacks.on_before_optimizer_step() + optimizer_was_run = True + self.optimizer.step() + if self.compression_manager is not None: + self.compression_manager.callbacks.on_after_optimizer_step() + + if optimizer_was_run: + self.lr_scheduler.step() + + model.zero_grad() + self.state.global_step += 1 + self.state.epoch = epoch + (step + 1) / steps_in_epoch + self.state.curr_loss = tr_loss_step.cpu().detach().item() + self.control = self.callback_handler.on_step_end(args, self.state, + self.control) + + if self.compression_manager is not None: + compression_manager.callbacks.on_step_end() + self._maybe_log_save_evaluate(tr_loss, model, trial, epoch, + ignore_keys_for_eval) + else: + self.control = self.callback_handler.on_substep_end( + args, self.state, self.control) + + if self.control.should_epoch_stop or self.control.should_training_stop: + break + + self.in_training = False + self.control = self.callback_handler.on_epoch_end(args, self.state, self.control) + if self.compression_manager is not None: + self.compression_manager.callbacks.on_epoch_end() + self._maybe_log_save_evaluate(tr_loss, model, trial, epoch, ignore_keys_for_eval) + + # pylint: disable=E1101 + if DebugOption.TPU_METRICS_DEBUG in self.args.debug: + logger.warning( + "You enabled PyTorch/XLA debug metrics but you don't have a TPU " + "configured. Check your training configuration if this is unexpected.") + + if self.control.should_training_stop: + break + + if args.past_index and hasattr(self, "_past"): + # Clean the state at the end of training + delattr(self, "_past") + + logger.info( + "\n\nTraining completed. Do not forget to share your model on huggingface.co/models =)\n\n" + ) + if args.load_best_model_at_end and self.state.best_model_checkpoint is not None: + # Wait for everyone to get here so we are sur the model has been saved by process 0. + if args.local_rank != -1 and args.n_gpu > 1: + torch.distributed.barrier() + + if version.parse(__version__) < version.parse("4.19"): + logger.info( + f"Loading best model from {self.state.best_model_checkpoint} (score: {self.state.best_metric})." + ) + + best_model_path = os.path.join(self.state.best_model_checkpoint, WEIGHTS_NAME) + if os.path.exists(best_model_path): + # We load the model state dict on the CPU to avoid an OOM error. + state_dict = torch.load(best_model_path, map_location="cpu") + # If the model is on the GPU, it still works! + self._load_state_dict_in_model(state_dict) + else: + logger.warn(f"Could not locate the best model at {best_model_path}, " + "if you are running a distributed training on multiple nodes, " + "you should activate `--save_on_each_node`.") + else: + self._load_best_model() + + # add remaining tr_loss + self._total_loss_scalar += tr_loss.item() + train_loss = self._total_loss_scalar / self.state.global_step + + metrics = speed_metrics("train", + start_time, + num_samples=num_train_samples, + num_steps=self.state.max_steps) + self.store_flos() + metrics["total_flos"] = self.state.total_flos + metrics["train_loss"] = train_loss + + self.is_in_train = False + + self._memory_tracker.stop_and_update_metrics(metrics) + + self.log(metrics) + + self.control = self.callback_handler.on_train_end(args, self.state, self.control) + + return TrainOutput(self.state.global_step, train_loss, metrics) + + # pylint: disable=E1101 + def _maybe_log_save_evaluate(self, tr_loss, model, trial, epoch, + ignore_keys_for_eval): # pragma: no cover + if self.control.should_log: + if is_torch_tpu_available(): + xm.mark_step() + + logs: Dict[str, float] = {} + + # all_gather + mean() to get average loss over all processes + tr_loss_scalar = self._nested_gather(tr_loss).mean().item() + + # reset tr_loss to zero + tr_loss -= tr_loss + + logs["loss"] = round( + tr_loss_scalar / (self.state.global_step - self._globalstep_last_logged), 4) + logs["learning_rate"] = self._get_learning_rate() + + self._total_loss_scalar += tr_loss_scalar + self._globalstep_last_logged = self.state.global_step + self.store_flos() + + self.log(logs) + + metrics = None + if self.control.should_evaluate: + metrics = self.evaluate(ignore_keys=ignore_keys_for_eval) + self._report_to_hp_search(trial, epoch, metrics) + + if self.control.should_save: + self._save_checkpoint(model, trial, metrics=metrics) + self.control = self.callback_handler.on_save(self.args, self.state, self.control) # pylint: disable=E1101 def training_step( @@ -656,7 +996,6 @@ def training_step( return loss.detach() - def training_step_length_adaptive( self, model: torch.nn.Module, @@ -853,11 +1192,10 @@ def compute_loss(self, model, inputs, return_outputs=False): # pragma: no cover if self.label_smoother is not None and "labels" in inputs else None teacher_logits = inputs.pop("teacher_logits") if "teacher_logits" in inputs else None - outputs = model(**inputs) - if self.in_training and hasattr(self, "component") and \ - hasattr(self.component, "criterion"): + if self.in_training and hasattr(self, "compression_manager") and \ + hasattr(self.compression_manager, "criterion"): qa_output_merger = lambda outputs: torch.vstack([ torch.vstack([sl, el]) for sl, el in zip(outputs["start_logits"], outputs["end_logits"]) @@ -884,8 +1222,8 @@ def get_logits(outputs): if "start_positions" in inputs and "end_positions" in inputs: # for SQuAD teacher_logits = torch.vstack(list(teacher_logits)) else: - teacher_outputs = self.component.criterion.teacher_model_forward(inputs) - teacher_logits = get_logits(self.component.criterion.teacher_outputs + teacher_outputs = self.compression_manager.criterion.teacher_model_forward(inputs) + teacher_logits = get_logits(self.compression_manager.criterion.teacher_outputs if teacher_outputs is None else teacher_outputs) logits = get_logits(outputs) @@ -899,14 +1237,14 @@ def get_logits(outputs): else: raise AssertionError( "Labels of input data not provided, can't compute loss") - if hasattr(self.component, "on_post_forward"): - self.component.on_post_forward(inputs, teacher_output=teacher_logits) - if hasattr(self.component.criterion, "teacher_outputs"): - self.component.criterion.teacher_outputs = \ - get_logits(self.component.criterion.teacher_outputs) - loss = self.component.criterion(logits, labels) - if hasattr(self.component.criterion, 'add_origin_loss') and \ - self.component.criterion.add_origin_loss: + if hasattr(self.compression_manager, "on_post_forward"): + self.compression_manager.on_post_forward(inputs, teacher_output=teacher_logits) + if hasattr(self.compression_manager.criterion, "teacher_outputs"): + self.compression_manager.criterion.teacher_outputs = \ + get_logits(self.compression_manager.criterion.teacher_outputs) + loss = self.compression_manager.criterion(logits, labels) + if hasattr(self.compression_manager.criterion, 'add_origin_loss') and \ + self.compression_manager.criterion.add_origin_loss: loss = loss + outputs['loss'] else: if self.args.past_index >= 0: @@ -917,7 +1255,8 @@ def get_logits(outputs): else: # We don't use .loss here since the model may return tuples instead of ModelOutput. loss = outputs["loss"] if isinstance(outputs, dict) else outputs[0] - loss = self.component.on_after_compute_loss(inputs, logits, loss, teacher_logits) + if self.compression_manager is not None: + loss = self.compression_manager.on_after_compute_loss(inputs, logits, loss, teacher_logits) if "start_positions" in inputs and "end_positions" in inputs: start_logits, end_logits = qa_output_spliter(logits) outputs = {"start_logits": start_logits, "end_logits": end_logits, "loss": loss} diff --git a/tests/Nightly/test_distillation.py b/tests/Nightly/test_distillation.py index 118c7bb4444..cce4410f09d 100644 --- a/tests/Nightly/test_distillation.py +++ b/tests/Nightly/test_distillation.py @@ -21,14 +21,15 @@ import unittest from datasets import load_dataset, load_metric from intel_extension_for_transformers.transformers import ( - DistillationConfig, - DistillationCriterionMode, metrics, OptimizedModel, - NoTrainerOptimizer ) + +from neural_compressor.config import ( + DistillationConfig, + KnowledgeDistillationLossConfig, +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer -from intel_extension_for_transformers.transformers.distillation import Criterion from transformers import ( AutoModelForSequenceClassification, AutoTokenizer, @@ -48,7 +49,6 @@ def setUpClass(self): self.teacher_model = AutoModelForSequenceClassification.from_pretrained( 'distilbert-base-uncased-finetuned-sst-2-english' ) - self.optimizer = NoTrainerOptimizer(self.model) raw_datasets = load_dataset("glue", "sst2")["validation"] tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased") def preprocess_function(examples): @@ -76,38 +76,32 @@ def compute_metrics(p): preds = np.argmax(preds, axis=1) return metric.compute(predictions=preds, references=p.label_ids) origin_weight = copy.deepcopy(self.model.classifier.weight) - for mode in DistillationCriterionMode: - print("Distillation approach:", mode.value) - self.trainer = NLPTrainer( - model=copy.deepcopy(self.model), - train_dataset=self.dataset, - eval_dataset=self.dataset, - compute_metrics=compute_metrics, - ) - metric_ = metrics.Metric(name="eval_accuracy") - criterion = Criterion( - name='IntermediateLayersLoss', - layer_mappings=[['classifier', 'classifier']], - loss_types=['MSE'], - loss_weight_ratio=[1.0], - add_origin_loss=False - ) if mode.value == "IntermediateLayersKnowledgeDistillationLoss" else None - distillation_conf = DistillationConfig(metrics=metric_, criterion=criterion) - distilled_model = self.trainer.distill( - distillation_config=distillation_conf, teacher_model=self.teacher_model - ) - # By default, model will be saved in tmp_trainer dir. - self.trainer.save_model('./distilled_model') - loaded_model = OptimizedModel.from_pretrained( - './distilled_model', - ) - distilled_weight = copy.deepcopy(distilled_model.classifier.weight) - loaded_weight = copy.deepcopy(loaded_model.classifier.weight) - # check distilled model - self.assertTrue((distilled_weight != origin_weight).any()) - # check loaded model - self.assertTrue((distilled_weight == loaded_weight).all()) - mlflow.end_run() + + self.trainer = NLPTrainer( + model=copy.deepcopy(self.model), + train_dataset=self.dataset, + eval_dataset=self.dataset, + compute_metrics=compute_metrics, + ) + metric_ = metrics.Metric(name="eval_accuracy") + self.trainer.metrics = metric_ + distillation_criterion_conf = KnowledgeDistillationLossConfig(loss_types=["CE", "KL"]) + distillation_conf = DistillationConfig(self.teacher_model, distillation_criterion_conf) + distilled_model = self.trainer.distill( + distillation_config=distillation_conf + ) + # By default, model will be saved in tmp_trainer dir. + self.trainer.save_model('./distilled_model') + loaded_model = OptimizedModel.from_pretrained( + './distilled_model', + ) + distilled_weight = copy.deepcopy(distilled_model.classifier.weight) + loaded_weight = copy.deepcopy(loaded_model.classifier.weight) + # check distilled model + self.assertTrue((distilled_weight != origin_weight).any()) + # check loaded model + self.assertTrue((distilled_weight == loaded_weight).all()) + mlflow.end_run() def test_functional_distil(self): def eval_func(model): @@ -118,27 +112,12 @@ def train_func(model): self.trainer = NLPTrainer(self.model) - distillation_conf = DistillationConfig() + distillation_conf = DistillationConfig(teacher_model=self.teacher_model) self.trainer.distill(distillation_conf, - teacher_model=self.teacher_model, provider="inc", train_func = train_func, eval_func = eval_func,) - def test_no_trainer_distill(self): - def eval_func(model): - return 1 - - def train_func(model): - return model - distillation_conf = DistillationConfig() - self.optimizer.eval_func = eval_func - self.optimizer.train_func = train_func - self.optimizer.distill(distillation_conf, - teacher_model=self.teacher_model, - provider="inc", - train_func = train_func, - eval_func = eval_func,) if __name__ == "__main__": unittest.main() diff --git a/tests/Nightly/test_orchestrate_optimization.py b/tests/Nightly/test_orchestrate_optimization.py index 422b10700a9..7137ccc844d 100644 --- a/tests/Nightly/test_orchestrate_optimization.py +++ b/tests/Nightly/test_orchestrate_optimization.py @@ -20,18 +20,14 @@ import torch.utils.data as data import unittest from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import ( - PrunerConfig, - PruningConfig, +from neural_compressor.config import ( + WeightPruningConfig, DistillationConfig, - QuantizationConfig, - DistillationCriterionMode, - metrics, - objectives, - OptimizedModel, + KnowledgeDistillationLossConfig, + QuantizationAwareTrainingConfig, ) +from intel_extension_for_transformers.transformers import metrics from intel_extension_for_transformers.transformers.trainer import NLPTrainer -from intel_extension_for_transformers.transformers.distillation import Criterion from transformers import ( AutoModelForSequenceClassification, @@ -77,36 +73,26 @@ def compute_metrics(p): preds = p.predictions preds = np.argmax(preds, axis=1) return metric.compute(predictions=preds, references=p.label_ids) - origin_weight = copy.deepcopy(self.model.classifier.weight) - for mode in DistillationCriterionMode: - print("Distillation approach:", mode.value) - self.trainer = NLPTrainer( - model=copy.deepcopy(self.model), - train_dataset=self.dataset, - eval_dataset=self.dataset, - compute_metrics=compute_metrics, - ) - self.trainer.calib_dataloader = self.trainer.get_eval_dataloader() + + self.trainer = NLPTrainer( + model=copy.deepcopy(self.model), + train_dataset=self.dataset, + eval_dataset=self.dataset, + compute_metrics=compute_metrics, + ) + self.trainer.calib_dataloader = self.trainer.get_eval_dataloader() tune_metric = metrics.Metric( name="eval_accuracy", is_relative=True, criterion=0.5 ) - pruner_config = PrunerConfig(prune_type='PatternLock', target_sparsity_ratio=0.9) - pruning_conf = PruningConfig(framework="pytorch_fx",pruner_config=[pruner_config], metrics=tune_metric) - distillation_conf = DistillationConfig(framework="pytorch_fx", metrics=tune_metric) - - objective = objectives.performance - quantization_conf = QuantizationConfig( - approach="QuantizationAwareTraining", - max_trials=600, - metrics=[tune_metric], - objectives=[objective] - ) - - from neural_compressor.adaptor.torch_utils.symbolic_trace import symbolic_trace - self.model = symbolic_trace(self.model, is_qat=True) - self.trainer.model = self.model + self.trainer.metrics = tune_metric + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=0.64, + pruning_scope="local") + distillation_criterion = KnowledgeDistillationLossConfig(loss_types=["CE", "KL"]) + distillation_conf = DistillationConfig(teacher_model=self.teacher_model, criterion=distillation_criterion) + quantization_conf = QuantizationAwareTrainingConfig() conf_list = [pruning_conf, distillation_conf, quantization_conf] - opt_model = self.trainer.orchestrate_optimizations(config_list=conf_list, teacher_model=self.teacher_model) + opt_model = self.trainer.orchestrate_optimizations(config_list=conf_list) self.assertTrue("quantize" in str(type(opt_model.classifier.module))) diff --git a/tests/Nightly/test_pruning.py b/tests/Nightly/test_pruning.py index b7284ddfe6b..01c7045bf2d 100644 --- a/tests/Nightly/test_pruning.py +++ b/tests/Nightly/test_pruning.py @@ -20,11 +20,8 @@ from intel_extension_for_transformers.transformers import ( metrics, OptimizedModel, - PrunerConfig, - PruningConfig, - PruningMode, - NoTrainerOptimizer ) +from neural_compressor.config import WeightPruningConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoModelForSequenceClassification, @@ -63,7 +60,6 @@ def setUpClass(self): train_dataset=self.dummy_dataset, eval_dataset=self.dummy_dataset, ) - self.optimizer = NoTrainerOptimizer(self.model) @classmethod def tearDownClass(self): @@ -72,31 +68,29 @@ def tearDownClass(self): def test_fx_model_prune(self): origin_weight = copy.deepcopy(self.model.classifier.weight) - for mode in PruningMode: - # not supported yet - if mode.name != "BasicMagnitude".upper(): - continue - self.trainer = NLPTrainer( - model=self.model, - train_dataset=self.dummy_dataset, - eval_dataset=self.dummy_dataset, - ) - metric = metrics.Metric(name="eval_loss") - pruner_config = PrunerConfig(prune_type=mode.name, target_sparsity_ratio=0.9) - pruning_conf = PruningConfig(pruner_config=pruner_config, metrics=metric) - agent = self.trainer.init_pruner(pruning_config=pruning_conf) - pruned_model = self.trainer.prune() - # By default, model will be saved in tmp_trainer dir. - self.trainer.save_model('./pruned_model') - loaded_model = OptimizedModel.from_pretrained( - './pruned_model', - ) - pruned_weight = copy.deepcopy(pruned_model.classifier.weight) - loaded_weight = copy.deepcopy(loaded_model.classifier.weight) - # check pruned model - self.assertTrue((pruned_weight != origin_weight).any()) - # check loaded model - self.assertTrue((pruned_weight == loaded_weight).all()) + + self.trainer = NLPTrainer( + model=self.model, + train_dataset=self.dummy_dataset, + eval_dataset=self.dummy_dataset, + ) + metric = metrics.Metric(name="eval_loss") + self.trainer.metrics = metric + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=0.64, + pruning_scope="local") + pruned_model = self.trainer.prune(pruning_config=pruning_conf) + # By default, model will be saved in tmp_trainer dir. + self.trainer.save_model('./pruned_model') + loaded_model = OptimizedModel.from_pretrained( + './pruned_model', + ) + pruned_weight = copy.deepcopy(pruned_model.classifier.weight) + loaded_weight = copy.deepcopy(loaded_model.classifier.weight) + # check pruned model + self.assertTrue((pruned_weight != origin_weight).any()) + # check loaded model + self.assertTrue((pruned_weight == loaded_weight).all()) def test_functional_prune(self): def eval_func(model): @@ -106,27 +100,14 @@ def train_func(model): return model self.trainer = NLPTrainer(self.model) - pruner_conf = PrunerConfig(prune_type='BasicMagnitude', target_sparsity_ratio=0.9) - pruning_conf = PruningConfig(pruner_config=pruner_conf) + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=0.64, + pruning_scope="local") self.trainer.prune(pruning_conf, provider="inc", train_func = train_func, eval_func = eval_func,) - def test_no_trainer_prune(self): - def eval_func(model): - return 1 - - def train_func(model): - return model - pruner_conf = PrunerConfig(prune_type='BasicMagnitude', target_sparsity_ratio=0.9) - pruning_conf = PruningConfig(pruner_config=pruner_conf) - self.optimizer.eval_func = eval_func - self.optimizer.train_func = train_func - self.optimizer.prune(pruning_conf, - provider="inc", - train_func = train_func, - eval_func = eval_func,) if __name__ == "__main__": unittest.main() diff --git a/tests/Nightly/test_tf_distillation.py b/tests/Nightly/test_tf_distillation.py deleted file mode 100644 index d5521845439..00000000000 --- a/tests/Nightly/test_tf_distillation.py +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright (c) 2024 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import shutil -import numpy as np -import unittest -import tensorflow as tf -from datasets import load_dataset, load_metric -from transformers import (TFAutoModelForSequenceClassification, AutoTokenizer, - HfArgumentParser, TFTrainingArguments, set_seed, - DefaultDataCollator) -from intel_extension_for_transformers.transformers import (DistillationConfig, metrics) -from intel_extension_for_transformers.transformers.distillation import Criterion -from intel_extension_for_transformers.transformers.optimizer_tf import TFOptimization - - -class TestDistillation(unittest.TestCase): - @classmethod - def setUpClass(self): - set_seed(42) - self.model = TFAutoModelForSequenceClassification.from_pretrained( - 'hf-internal-testing/tiny-random-distilbert') - self.teacher_model = TFAutoModelForSequenceClassification.from_pretrained( - 'hf-internal-testing/tiny-random-DistilBertForSequenceClassification') - - raw_datasets = load_dataset("glue", "sst2")["validation"] - self.tokenizer = AutoTokenizer.from_pretrained("hf-internal-testing/tiny-random-DistilBertForSequenceClassification") - non_label_column_names = [ - name for name in raw_datasets.column_names if name != "label" - ] - - def preprocess_function(examples): - # Tokenize the texts - args = ((examples['sentence'], )) - result = self.tokenizer(*args, - padding=True, - max_length=64, - truncation=True) - return result - - raw_datasets = raw_datasets.map(preprocess_function, - batched=True, - load_from_cache_file=False) - data_collator = DefaultDataCollator(return_tensors="tf") - dataset = raw_datasets.select(range(10)) - self.dummy_dataset = dataset.to_tf_dataset( - columns=[ - col for col in dataset.column_names - if col not in set(non_label_column_names + ["label"]) - ], - shuffle=False, - batch_size=2, - collate_fn=data_collator, - drop_remainder=False, - # `label_cols` is needed for user-defined losses, such as in this example - # datasets v2.3.x need "labels", not "label" - label_cols=["labels"] - if "label" in dataset.column_names else None, - ) - parser = HfArgumentParser(TFTrainingArguments) - self.args = parser.parse_args_into_dataclasses(args=[ - "--output_dir", "./distilled_model", - "--per_device_eval_batch_size", "2" - ])[0] - optimizer = tf.keras.optimizers.Adam( - learning_rate=self.args.learning_rate, - beta_1=self.args.adam_beta1, - beta_2=self.args.adam_beta2, - epsilon=self.args.adam_epsilon, - clipnorm=self.args.max_grad_norm, - ) - loss_fn = tf.keras.losses.SparseCategoricalCrossentropy( - from_logits=True, reduction=tf.keras.losses.Reduction.SUM) - metrics = ["accuracy"] - self.model.compile(optimizer=optimizer, loss=loss_fn, metrics=metrics) - - @classmethod - def tearDownClass(self): - shutil.rmtree('./tmp', ignore_errors=True) - shutil.rmtree('./distilled_model', ignore_errors=True) - - def test_tf_model_distil(self): - metric = load_metric("glue", "sst2") - def compute_metrics(preds, label_ids): - preds = preds["logits"] - preds = np.argmax(preds, axis=1) - result = metric.compute(predictions=preds, references=label_ids) - if len(result) > 1: - result["combined_score"] = np.mean(list(result.values())).item() - return result - - self.optimizer = TFOptimization(model=self.model, - args=self.args, - train_dataset=self.dummy_dataset, - compute_metrics=compute_metrics) - metric_ = metrics.Metric(name="eval_accuracy") - # 'CrossEntropyLoss', 'SparseCategoricalCrossentropy', 'KnowledgeDistillationLoss' - criterion = Criterion(name='KnowledgeLoss', - layer_mappings=[['classifier', 'classifier']], - loss_types=['CE', 'CE'], - loss_weight_ratio=[0.5, 0.5], - add_origin_loss=False) - distillation_conf = DistillationConfig(metrics=metric_, - criterion=criterion) - def eval_func(model): - return 1 - distilled_model = self.optimizer.distill( - distillation_config=distillation_conf, - teacher_model=self.teacher_model, - eval_func=eval_func, - train_func=self.optimizer.build_train_func - ) - distilled_model2 = self.optimizer.distill( - distillation_config=distillation_conf, - teacher_model=self.teacher_model, - eval_func=None, - train_func=None - ) - self.assertEqual(distilled_model.signatures['serving_default'].output_shapes['Identity'], distilled_model2.signatures['serving_default'].output_shapes['Identity']) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/Nightly/test_tf_pruning.py b/tests/Nightly/test_tf_pruning.py deleted file mode 100644 index 5fa4806957a..00000000000 --- a/tests/Nightly/test_tf_pruning.py +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright (c) 2024 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from intel_extension_for_transformers.transformers.utils.utility_tf import get_filepath -import numpy as np -import os -import shutil -import tensorflow as tf -import unittest -from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import ( - metrics, - PrunerConfig, - PruningConfig, - TFOptimization -) -from transformers import ( - AutoTokenizer, - DefaultDataCollator, - HfArgumentParser, - TFAutoModelForSequenceClassification, - TFTrainingArguments, -) - -os.environ["WANDB_DISABLED"] = "true" - - -class TestTFPruning(unittest.TestCase): - @classmethod - def setUpClass(self): - self.model = TFAutoModelForSequenceClassification.from_pretrained( - 'hf-internal-testing/tiny-random-DistilBertForSequenceClassification' - ) - raw_datasets = load_dataset("glue", "sst2")["validation"] - tokenizer = AutoTokenizer.from_pretrained("hf-internal-testing/tiny-random-DistilBertForSequenceClassification") - non_label_column_names = [name for name in raw_datasets.column_names if name != "label"] - def preprocess_function(examples): - # Tokenize the texts - args = ( - (examples["sentence"],) - ) - result = tokenizer(*args, padding=True, max_length=64, truncation=True) - - return result - raw_datasets = raw_datasets.map(preprocess_function, batched=True, load_from_cache_file=False) - data_collator = DefaultDataCollator(return_tensors="tf") - dataset = raw_datasets.select(range(10)) - self.dummy_dataset = dataset.to_tf_dataset( - columns=[col for col in dataset.column_names if col not in - set(non_label_column_names + ["label"])], - shuffle=False, - batch_size=2, - collate_fn=data_collator, - drop_remainder=False, - # `label_cols` is needed for user-defined losses, such as in this example - # datasets v2.3.x need "labels", not "label" - label_cols=["labels"] if "label" in dataset.column_names else None, - ) - parser = HfArgumentParser(TFTrainingArguments) - self.args = parser.parse_args_into_dataclasses(args=["--output_dir", "./quantized_model", - "--per_device_eval_batch_size", "2"])[0] - optimizer = tf.keras.optimizers.Adam( - learning_rate=self.args.learning_rate, - beta_1=self.args.adam_beta1, - beta_2=self.args.adam_beta2, - epsilon=self.args.adam_epsilon, - clipnorm=self.args.max_grad_norm, - ) - loss_fn = tf.keras.losses.SparseCategoricalCrossentropy( - from_logits=True, reduction=tf.keras.losses.Reduction.SUM - ) - metrics = ["accuracy"] - self.model.compile(optimizer=optimizer, loss=loss_fn, metrics=metrics) - - @classmethod - def tearDownClass(self): - shutil.rmtree('./tmp', ignore_errors=True) - shutil.rmtree('./quantized_model', ignore_errors=True) - - def test_tf_model_quant(self): - # check whether it is possible to set distributed environment - # only for coverage currently - from intel_extension_for_transformers.transformers.utils.utility_tf import distributed_init - distributed_init(["localhost:12345","localhost:23456"], "worker", 0) - self.assertTrue(os.environ['TF_CONFIG'] != None) - del os.environ['TF_CONFIG'] - # check whether filepath can be set correctly if using distributed environment - # only for coverage currently - from intel_extension_for_transformers.transformers.utils.utility_tf import get_filepath - self.assertTrue(type(get_filepath("dummy", "worker", 0)) == str) - self.assertTrue(type(get_filepath("dummy", "worker", 1)) == str) - self.assertTrue(get_filepath("dummy", "worker", 0) != get_filepath("dummy", "worker", 1)) - - metric = load_metric("glue", "sst2") - def compute_metrics(preds, label_ids): - preds = preds["logits"] - preds = np.argmax(preds, axis=1) - result = metric.compute(predictions=preds, references=label_ids) - if len(result) > 1: - result["combined_score"] = np.mean(list(result.values())).item() - return result - self.optimizer = TFOptimization( - model=self.model, - args=self.args, - train_dataset=self.dummy_dataset, - eval_dataset=self.dummy_dataset, - compute_metrics=compute_metrics, - ) - tune_metric = metrics.Metric( - name="accuracy", greater_is_better=True, is_relative=True, criterion=0.01, - ) - prune_type = 'BasicMagnitude' - target_sparsity_ratio = 0.1 - pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio) - pruning_conf = PruningConfig( - epochs=int(1), pruner_config=pruner_config, metrics=tune_metric - ) - p_model = self.optimizer.prune(pruning_config=pruning_conf) - loaded_model = tf.saved_model.load(self.args.output_dir) - p_model = self.optimizer.prune(pruning_config=pruning_conf, - train_dataset=self.dummy_dataset, - eval_dataset=self.dummy_dataset,) - - def eval_func(model): - return 1 - - def train_func(model): - return model - - self.optimizer.prune(pruning_config=pruning_conf, - train_func=train_func, - eval_func=eval_func) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/Nightly/test_tf_quantization.py b/tests/Nightly/test_tf_quantization.py deleted file mode 100644 index 3162950c68a..00000000000 --- a/tests/Nightly/test_tf_quantization.py +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright (c) 2024 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import numpy as np -import os -import shutil -import tensorflow as tf -import unittest -from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import ( - metrics, - objectives, - QuantizationConfig, - TFOptimization -) -# from intel_extension_for_transformers.transformers import metrics, objectives -from transformers import ( - AutoTokenizer, - DefaultDataCollator, - HfArgumentParser, - TFAutoModelForSequenceClassification, - TFTrainingArguments, -) - -os.environ["WANDB_DISABLED"] = "true" - - -class TestTFQuantization(unittest.TestCase): - @classmethod - def setUpClass(self): - self.model = TFAutoModelForSequenceClassification.from_pretrained( - 'hf-internal-testing/tiny-random-DistilBertForSequenceClassification' - ) - raw_datasets = load_dataset("glue", "sst2")["validation"] - tokenizer = AutoTokenizer.from_pretrained("hf-internal-testing/tiny-random-DistilBertForSequenceClassification") - non_label_column_names = [name for name in raw_datasets.column_names if name != "label"] - def preprocess_function(examples): - # Tokenize the texts - args = ( - (examples["sentence"],) - ) - result = tokenizer(*args, padding=True, max_length=64, truncation=True) - - return result - raw_datasets = raw_datasets.map(preprocess_function, batched=True, load_from_cache_file=False) - data_collator = DefaultDataCollator(return_tensors="tf") - dataset = raw_datasets.select(range(10)) - self.dummy_dataset = dataset.to_tf_dataset( - columns=[col for col in dataset.column_names if col not in - set(non_label_column_names + ["label"])], - shuffle=False, - batch_size=2, - collate_fn=data_collator, - drop_remainder=False, - # `label_cols` is needed for user-defined losses, such as in this example - # datasets v2.3.x need "labels", not "label" - label_cols=["labels"] if "label" in dataset.column_names else None, - ) - - - @classmethod - def tearDownClass(self): - shutil.rmtree('./tmp', ignore_errors=True) - shutil.rmtree('./quantized_model', ignore_errors=True) - - def test_tf_model_quant(self): - parser = HfArgumentParser(TFTrainingArguments) - args = parser.parse_args_into_dataclasses(args=["--output_dir", "./quantized_model", - "--per_device_eval_batch_size", "2"]) - metric = load_metric("glue", "sst2") - def compute_metrics(preds, label_ids): - preds = preds["logits"] - preds = np.argmax(preds, axis=1) - result = metric.compute(predictions=preds, references=label_ids) - if len(result) > 1: - result["combined_score"] = np.mean(list(result.values())).item() - return result - self.optimizer = TFOptimization( - model=self.model, - args=args[0], - compute_metrics=compute_metrics - ) - tune_metric = metrics.Metric( - name="accuracy", greater_is_better=True, is_relative=False, criterion=0.5 - ) - quantization_config = QuantizationConfig( - framework="tensorflow", - approach="POSTTRAININGSTATIC", - metrics=[tune_metric], - objectives=[objectives.performance] - ) - quantized_model = self.optimizer.quantize(quant_config=quantization_config, - train_dataset=self.dummy_dataset, eval_dataset=self.dummy_dataset) - loaded_model = tf.saved_model.load(args[0].output_dir) - - def eval_func(model): - return 1 - - def train_func(model): - return model - - self.optimizer.quantize(quant_config=quantization_config, - train_func=train_func, - eval_func=eval_func) - - quantization_config = QuantizationConfig( - framework="tensorflow", - approach="POSTTRAININGSTATIC", - metrics=[tune_metric], - objectives=[objectives.performance], - recipes={"first_conv_or_matmul_quantization": True, - "last_conv_or_matmul_quantization": True, - } - ) - self.optimizer.quantize(quant_config=quantization_config, - train_func=train_func, - eval_func=eval_func) - - -if __name__ == "__main__": - unittest.main() diff --git a/workflows/compression_aware_training/config/README.md b/workflows/compression_aware_training/config/README.md index c72b4ba0af9..86e13e21260 100644 --- a/workflows/compression_aware_training/config/README.md +++ b/workflows/compression_aware_training/config/README.md @@ -23,7 +23,7 @@ output_dir: Path to output directory. overwrite_output_dir: Whether to overwrite Output cache. perf_tol: Performance tolerance when optimizing the model. quantization: Needs to be true in this case. -quantization_approach: Quantization approach. Supported approach are PostTrainingStatic, PostTrainingDynamic and QuantizationAwareTraining. +quantization_approach: Quantization approach. Supported approach are static, dynamic and qat. is_relative: Metric tolerance model, expected to be relative or absolute. int8: Load int8 model. ``` @@ -41,7 +41,7 @@ output_dir: Path to output directory. overwrite_output_dir: Whether to overwrite Output cache. perf_tol: Performance tolerance when optimizing the model. quantization: Needs to be true in this case. -quantization_approach: Quantization approach. Supported approach are PostTrainingStatic, PostTrainingDynamic and QuantizationAwareTraining. +quantization_approach: Quantization approach. Supported approach are static, dynamic and qat. is_relative: Metric tolerance model, expected to be relative or absolute. int8: Load int8 model. ``` diff --git a/workflows/compression_aware_training/config/config.yaml b/workflows/compression_aware_training/config/config.yaml index 48e31757b6e..0bc18386cfe 100755 --- a/workflows/compression_aware_training/config/config.yaml +++ b/workflows/compression_aware_training/config/config.yaml @@ -25,6 +25,6 @@ overwrite_output_dir: true perf_tol: 0.03 quantization: true -quantization_approach: "QuantizationAwareTraining" +quantization_approach: "qat" is_relative: true int8: false diff --git a/workflows/compression_aware_training/config/distillation_with_qat.yaml b/workflows/compression_aware_training/config/distillation_with_qat.yaml index 48e31757b6e..0bc18386cfe 100755 --- a/workflows/compression_aware_training/config/distillation_with_qat.yaml +++ b/workflows/compression_aware_training/config/distillation_with_qat.yaml @@ -25,6 +25,6 @@ overwrite_output_dir: true perf_tol: 0.03 quantization: true -quantization_approach: "QuantizationAwareTraining" +quantization_approach: "qat" is_relative: true int8: false diff --git a/workflows/compression_aware_training/config/qat.yaml b/workflows/compression_aware_training/config/qat.yaml index faf0416ed2f..be783e839bf 100644 --- a/workflows/compression_aware_training/config/qat.yaml +++ b/workflows/compression_aware_training/config/qat.yaml @@ -24,6 +24,6 @@ overwrite_output_dir: true perf_tol: 0.03 quantization: true -quantization_approach: "QuantizationAwareTraining" +quantization_approach: "qat" is_relative: true int8: false diff --git a/workflows/compression_aware_training/config/sat.yaml b/workflows/compression_aware_training/config/sat.yaml index 7731f0dfb69..439828b0f1f 100755 --- a/workflows/compression_aware_training/config/sat.yaml +++ b/workflows/compression_aware_training/config/sat.yaml @@ -16,7 +16,7 @@ model_name_or_path: "Intel/distilbert-base-uncased-sparse-90-unstructured-pruneo teacher_model_name_or_path: "distilbert-base-uncased-finetuned-sst-2-english" task_name: "sst2" sat: true -quantization_approach: "QuantizationAwareTraining" +quantization_approach: "qat" learning_rate: 0.000012 num_train_epochs: 6 do_train: true diff --git a/workflows/compression_aware_training/src/itrex_opt.py b/workflows/compression_aware_training/src/itrex_opt.py index b727d22c412..c1ba546cdc4 100755 --- a/workflows/compression_aware_training/src/itrex_opt.py +++ b/workflows/compression_aware_training/src/itrex_opt.py @@ -28,14 +28,19 @@ # Need to use itrex domain toolkit from intel_extension_for_transformers.transformers import ( - DistillationConfig, - PrunerConfig, - PruningConfig, OptimizedModel, - QuantizationConfig, metrics, objectives, ) +from neural_compressor.config import ( + WeightPruningConfig, + DistillationConfig, + KnowledgeDistillationLossConfig, + QuantizationAwareTrainingConfig, + PostTrainingQuantConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from torch.utils.data import DataLoader from tqdm.auto import tqdm @@ -529,7 +534,7 @@ def compute_metrics(p: EvalPrediction): # Initialize and setup our itrexTrainer from neural_compressor.adaptor.torch_utils.symbolic_trace import symbolic_trace - self.model = symbolic_trace(self.model, self.optim_args.quantization_approach=="QuantizationAwareTraining") + self.model = symbolic_trace(self.model, self.optim_args.quantization_approach=="qat") self.trainer = NLPTrainer( model=self.model, @@ -746,30 +751,38 @@ def _do_quantization_aware_training(self): raise ValueError("do_eval must be set to True for quantization.") self.trainer.save_model(self.training_args.output_dir) - if self.optim_args.quantization_approach != "PostTrainingDynamic": + if self.optim_args.quantization_approach != "dynamic": if not self.training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - elif self.optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - # trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - # early_stopping_threshold)) tune_metric = metrics.Metric( - name=metric_name, - is_relative=self.optim_args.is_relative, - criterion=self.optim_args.perf_tol, + name=metric_name, is_relative=self.optim_args.is_relative, criterion=self.optim_args.perf_tol ) + self.trainer.metrics = tune_metric objective = objectives.performance - quantization_config = QuantizationConfig( - approach=self.optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective], - sampling_size=len(self.train_dataset) // 20, - ) + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if self.optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=self.optim_args.perf_tol, # optional. + ) + if self.optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=self.optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + self.trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = self.trainer.quantize(quant_config=quantization_config) if self.optim_args.benchmark or self.optim_args.accuracy_only: @@ -939,23 +952,15 @@ def get_logits(teacher_model, train_dataset, teacher_train_dataset): tune_metric = metrics.Metric( name=metric_name, is_relative=self.optim_args.is_relative, criterion=self.optim_args.perf_tol ) - prune_type = 'PatternLock' \ - if self.optim_args.pruning_approach else self.optim_args.pruning_approach - target_sparsity_ratio = self.optim_args.target_sparsity_ratio \ - if self.optim_args.target_sparsity_ratio else None - pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio) - pruning_conf = PruningConfig(framework="pytorch_fx",pruner_config=[pruner_config], metrics=tune_metric) - distillation_conf = DistillationConfig(framework="pytorch_fx", metrics=tune_metric) - - objective = objectives.performance - quantization_conf = QuantizationConfig( - approach=self.optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] - ) + self.trainer.metrics = tune_metric + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=self.optim_args.target_sparsity_ratio, + pruning_scope="local") + distillation_criterion = KnowledgeDistillationLossConfig(loss_types=["CE", "KL"]) + distillation_conf = DistillationConfig(teacher_model=self.teacher_model, criterion=distillation_criterion) + quantization_conf = QuantizationAwareTrainingConfig() conf_list = [pruning_conf, distillation_conf, quantization_conf] - model = self.trainer.orchestrate_optimizations(config_list=conf_list, teacher_model=self.teacher_model) + model = self.trainer.orchestrate_optimizations(config_list=conf_list) # ############################################################ print( diff --git a/workflows/compression_aware_training/src/utils.py b/workflows/compression_aware_training/src/utils.py index 46467c2b6ab..2ce1a4c819e 100755 --- a/workflows/compression_aware_training/src/utils.py +++ b/workflows/compression_aware_training/src/utils.py @@ -187,7 +187,7 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply prune."}, ) pruning_approach: Optional[str] = field( - default="BasicMagnitude", + default="magnitude", metadata={"help": "Pruning approach. Supported approach is basic_magnite."}, ) target_sparsity_ratio: Optional[float] = field( @@ -207,9 +207,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, From 91cf74c91d337bc84d5c60ad2955c4ea2f9a8170 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 17 Jun 2024 08:55:48 +0000 Subject: [PATCH 11/22] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- intel_extension_for_transformers/transformers/trainer.py | 2 +- tests/Nightly/test_distillation.py | 4 ++-- tests/Nightly/test_orchestrate_optimization.py | 4 ++-- workflows/compression_aware_training/src/itrex_opt.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/intel_extension_for_transformers/transformers/trainer.py b/intel_extension_for_transformers/transformers/trainer.py index 387a9466389..e3899e2a41f 100644 --- a/intel_extension_for_transformers/transformers/trainer.py +++ b/intel_extension_for_transformers/transformers/trainer.py @@ -387,7 +387,7 @@ def distill( assert False, "Please provide teacher model for DistillationConfig." self._eval_func = self.builtin_eval_func if eval_func is None else eval_func self._train_func = self.builtin_train_func if train_func is None else train_func - + compression_manager = prepare_compression(self.model, distillation_config) self.compression_manager = compression_manager self.compression_manager.callbacks.on_train_begin() diff --git a/tests/Nightly/test_distillation.py b/tests/Nightly/test_distillation.py index cce4410f09d..8f818f38e51 100644 --- a/tests/Nightly/test_distillation.py +++ b/tests/Nightly/test_distillation.py @@ -28,7 +28,7 @@ from neural_compressor.config import ( DistillationConfig, KnowledgeDistillationLossConfig, -) +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoModelForSequenceClassification, @@ -76,7 +76,7 @@ def compute_metrics(p): preds = np.argmax(preds, axis=1) return metric.compute(predictions=preds, references=p.label_ids) origin_weight = copy.deepcopy(self.model.classifier.weight) - + self.trainer = NLPTrainer( model=copy.deepcopy(self.model), train_dataset=self.dataset, diff --git a/tests/Nightly/test_orchestrate_optimization.py b/tests/Nightly/test_orchestrate_optimization.py index 7137ccc844d..d65ece8099c 100644 --- a/tests/Nightly/test_orchestrate_optimization.py +++ b/tests/Nightly/test_orchestrate_optimization.py @@ -85,8 +85,8 @@ def compute_metrics(p): name="eval_accuracy", is_relative=True, criterion=0.5 ) self.trainer.metrics = tune_metric - pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], - target_sparsity=0.64, + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=0.64, pruning_scope="local") distillation_criterion = KnowledgeDistillationLossConfig(loss_types=["CE", "KL"]) distillation_conf = DistillationConfig(teacher_model=self.teacher_model, criterion=distillation_criterion) diff --git a/workflows/compression_aware_training/src/itrex_opt.py b/workflows/compression_aware_training/src/itrex_opt.py index c1ba546cdc4..fcfd5f7eab7 100755 --- a/workflows/compression_aware_training/src/itrex_opt.py +++ b/workflows/compression_aware_training/src/itrex_opt.py @@ -778,7 +778,7 @@ def _do_quantization_aware_training(self): quantization_config = QuantizationAwareTrainingConfig( tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion - ) + ) early_stopping_patience = 2 early_stopping_threshold = 0.001 # optional self.trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ From b794b8afd33182f93aacc4e6c5fe45977737beb5 Mon Sep 17 00:00:00 2001 From: changwangss Date: Mon, 17 Jun 2024 05:17:10 -0700 Subject: [PATCH 12/22] migrate examples Signed-off-by: changwangss --- .../pytorch/question-answering/pruning.ipynb | 16 +- .../orchestrate_optimizations.ipynb | 46 +- .../pytorch/text-classification/pruning.ipynb | 17 +- .../distilbert_base_uncased/run_emotion.py | 18 +- .../sparse/bert_mini/run_bert_mini.sh | 2 +- .../deployment/sparse/bert_mini/run_glue.py | 47 +- .../distilbert_base_uncased/run_distilbert.sh | 2 +- .../sparse/distilbert_base_uncased/run_qa.py | 47 +- .../distillation_for_quantization/run_glue.py | 30 +- .../orchestrate_optimizations/README.md | 4 +- .../orchestrate_optimizations/run_glue.py | 45 +- .../transformers/__init__.py | 12 +- .../transformers/config.py | 645 --------------- .../transformers/distillation.py | 50 -- .../transformers/optimizer_tf.py | 733 ------------------ .../transformers/pruning.py | 73 -- .../transformers/quantization.py | 10 - 17 files changed, 148 insertions(+), 1649 deletions(-) delete mode 100644 intel_extension_for_transformers/transformers/distillation.py delete mode 100644 intel_extension_for_transformers/transformers/optimizer_tf.py delete mode 100644 intel_extension_for_transformers/transformers/pruning.py diff --git a/docs/tutorials/pytorch/question-answering/pruning.ipynb b/docs/tutorials/pytorch/question-answering/pruning.ipynb index 61dde668c8b..b49b7e11e57 100644 --- a/docs/tutorials/pytorch/question-answering/pruning.ipynb +++ b/docs/tutorials/pytorch/question-answering/pruning.ipynb @@ -66,7 +66,8 @@ "import transformers\n", "from dataclasses import dataclass, field\n", "from datasets import load_dataset, load_metric\n", - "from intel_extension_for_transformers.transformers import metrics, OptimizedModel, PrunerConfig, PruningConfig, PruningMode\n", + "from intel_extension_for_transformers.transformers import metrics, OptimizedModel\n", + "from neural_compressor.config import WeightPruningConfig\n", "from trainer_qa import QuestionAnsweringTrainer\n", "from transformers import (\n", " AutoConfig,\n", @@ -225,7 +226,7 @@ " metadata={\"help\": \"Whether or not to apply prune.\"},\n", " )\n", " pruning_approach: Optional[str] = field(\n", - " default=\"BasicMagnitude\",\n", + " default=\"magnitude\",\n", " metadata={\"help\": \"Pruning approach. Supported approach is basic_magnite.\"},\n", " )\n", " target_sparsity_ratio: Optional[float] = field(\n", @@ -278,7 +279,7 @@ ")\n", "optim_args = OptimizationArguments(\n", " tune=True,\n", - " quantization_approach=\"PostTrainingStatic\"\n", + " quantization_approach=\"static\"\n", ")\n", "log_level = training_args.get_process_log_level()" ] @@ -625,11 +626,14 @@ " raise ValueError(\"do_train must be set to True for pruning.\")\n", "\n", " tune_metric = metrics.Metric(name=metric_name)\n", - " prune_type = 'BasicMagnitude' if optim_args.pruning_approach else optim_args.pruning_approach\n", + " prune_type = 'magnitude' if optim_args.pruning_approach else optim_args.pruning_approach\n", " target_sparsity_ratio = optim_args.target_sparsity_ratio \\\n", " if optim_args.target_sparsity_ratio else None\n", - " pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio)\n", - " pruning_conf = PruningConfig(pruner_config=pruner_config, metrics=tune_metric)\n", + " trainer.metrics = tune_metric\n", + " pruning_conf = WeightPruningConfig([{\"start_step\": 0, \"end_step\": 2}],\n", + " target_sparsity=target_sparsity_ratio,\n", + " pruning_scope=\"local\",\n", + " pruning_type=prune_type)\n", "\n", " model = trainer.prune(pruning_config=pruning_conf)\n", " trainer.save_model(training_args.output_dir)" diff --git a/docs/tutorials/pytorch/text-classification/orchestrate_optimizations.ipynb b/docs/tutorials/pytorch/text-classification/orchestrate_optimizations.ipynb index fd8c926085f..6fa3f293695 100644 --- a/docs/tutorials/pytorch/text-classification/orchestrate_optimizations.ipynb +++ b/docs/tutorials/pytorch/text-classification/orchestrate_optimizations.ipynb @@ -71,10 +71,6 @@ "from datasets import load_dataset, load_metric\n", "from intel_extension_for_transformers.transformers import (\n", " metrics,\n", - " PrunerConfig,\n", - " PruningConfig,\n", - " DistillationConfig,\n", - " QuantizationConfig,\n", " OptimizedModel,\n", " objectives\n", ")\n", @@ -93,9 +89,14 @@ " default_data_collator,\n", " set_seed,\n", ")\n", + "from neural_compressor.config import (\n", + " WeightPruningConfig,\n", + " DistillationConfig,\n", + " KnowledgeDistillationLossConfig,\n", + " QuantizationAwareTrainingConfig,\n", + ")\n", "from transformers.trainer_utils import get_last_checkpoint\n", "from transformers.utils import check_min_version\n", - "from transformers.utils.fx import symbolic_trace\n", "from typing import Optional\n", "\n", "\n", @@ -251,7 +252,7 @@ " metadata={\"help\": \"Whether or not to apply prune.\"},\n", " )\n", " pruning_approach: Optional[str] = field(\n", - " default=\"BasicMagnitude\",\n", + " default=\"magnitude\",\n", " metadata={\"help\": \"Pruning approach. Supported approach is basic_magnite.\"},\n", " )\n", " target_sparsity_ratio: Optional[float] = field(\n", @@ -271,9 +272,9 @@ " metadata={\"help\": \"Whether or not to apply quantization.\"},\n", " )\n", " quantization_approach: Optional[str] = field(\n", - " default=\"QuantizationAwareTraining\",\n", - " metadata={\"help\": \"Quantization approach. Supported approach are PostTrainingStatic, \"\n", - " \"PostTrainingDynamic and QuantizationAwareTraining.\"},\n", + " default=\"qat\",\n", + " metadata={\"help\": \"Quantization approach. Supported approach are static, \"\n", + " \"dynamic and qat.\"},\n", " )\n", " metric_name: Optional[str] = field(\n", " default=\"eval_f1\",\n", @@ -341,7 +342,7 @@ ")\n", "optim_args = OptimizationArguments(\n", " tune=True,\n", - " quantization_approach=\"PostTrainingStatic\"\n", + " quantization_approach=\"static\"\n", ")\n", "log_level = training_args.get_process_log_level()\n", "logger.setLevel(log_level)" @@ -618,7 +619,7 @@ "\n", "# Trace model\n", "from neural_compressor.adaptor.torch_utils.symbolic_trace import symbolic_trace\n", - "model = symbolic_trace(model, optim_args.quantization_approach==\"QuantizationAwareTraining\")" + "model = symbolic_trace(model, optim_args.quantization_approach==\"qat\")" ] }, { @@ -671,23 +672,20 @@ " tune_metric = metrics.Metric(\n", " name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol\n", " )\n", - " prune_type = 'PatternLock' \\\n", + " prune_type = 'pattern_lock' \\\n", " if optim_args.pruning_approach else optim_args.pruning_approach\n", " target_sparsity_ratio = optim_args.target_sparsity_ratio \\\n", " if optim_args.target_sparsity_ratio else None\n", - " pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio)\n", - " pruning_conf = PruningConfig(framework=\"pytorch_fx\",pruner_config=[pruner_config], metrics=tune_metric)\n", - " distillation_conf = DistillationConfig(framework=\"pytorch_fx\", metrics=tune_metric)\n", - " \n", - " objective = objectives.performance\n", - " quantization_conf = QuantizationConfig(\n", - " approach=optim_args.quantization_approach,\n", - " max_trials=600,\n", - " metrics=[tune_metric],\n", - " objectives=[objective]\n", - " )\n", + " trainer.metrics = tune_metric\n", + " pruning_conf = WeightPruningConfig([{\"start_step\": 0, \"end_step\": 2}],\n", + " target_sparsity=target_sparsity_ratio,\n", + " pruning_scope=\"local\",\n", + " pruning_type=prune_type)\n", + " distillation_criterion = KnowledgeDistillationLossConfig(loss_types=[\"CE\", \"KL\"])\n", + " distillation_conf = DistillationConfig(teacher_model=teacher_model, criterion=distillation_criterion)\n", + " quantization_conf = QuantizationAwareTrainingConfig()\n", " conf_list = [pruning_conf, distillation_conf, quantization_conf]\n", - " model = trainer.orchestrate_optimizations(config_list=conf_list, teacher_model=teacher_model)" + " model = trainer.orchestrate_optimizations(config_list=conf_list)" ] }, { diff --git a/docs/tutorials/pytorch/text-classification/pruning.ipynb b/docs/tutorials/pytorch/text-classification/pruning.ipynb index 723de2b8f46..53d56051dc5 100644 --- a/docs/tutorials/pytorch/text-classification/pruning.ipynb +++ b/docs/tutorials/pytorch/text-classification/pruning.ipynb @@ -69,10 +69,9 @@ "from datasets import load_dataset, load_metric\n", "from intel_extension_for_transformers.transformers import (\n", " metrics,\n", - " OptimizedModel,\n", - " PrunerConfig,\n", - " PruningConfig,\n", + " OptimizedModel\n", ")\n", + "from neural_compressor.config import WeightPruningConfig\n", "from intel_extension_for_transformers.transformers.trainer import NLPTrainer\n", "from transformers import (\n", " AutoConfig,\n", @@ -283,7 +282,7 @@ ")\n", "optim_args = OptimizationArguments(\n", " tune=True,\n", - " quantization_approach=\"PostTrainingStatic\"\n", + " quantization_approach=\"static\"\n", ")\n", "log_level = training_args.get_process_log_level()\n", "logger.setLevel(log_level)" @@ -465,12 +464,14 @@ ")\n", "\n", "tune_metric = metrics.Metric(name=metric_name)\n", - "prune_type = 'BasicMagnitude' \\\n", - " if optim_args.pruning_approach else optim_args.pruning_approach\n", + "prune_type = 'magnitude' if optim_args.pruning_approach else optim_args.pruning_approach\n", "target_sparsity_ratio = optim_args.target_sparsity_ratio \\\n", " if optim_args.target_sparsity_ratio else None\n", - "pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio)\n", - "pruning_conf = PruningConfig(pruner_config=pruner_config, metrics=tune_metric)\n", + "trainer.metrics = tune_metric\n", + "pruning_conf = WeightPruningConfig([{\"start_step\": 0, \"end_step\": 2}],\n", + " target_sparsity=target_sparsity_ratio,\n", + " pruning_scope=\"local\",\n", + " pruning_type=prune_type)\n", "\n", "model = trainer.prune(pruning_config=pruning_conf)\n", "trainer.save_model(training_args.output_dir)" diff --git a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py index d599c564647..fc8b047c58d 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py +++ b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py @@ -537,25 +537,19 @@ def compute_metrics(p: EvalPrediction): name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) trainer.metrics = tune_metric + tuning_criterion = TuningCriterion(max_trials=600) + accuracy_criterion = AccuracyCriterion( + higher_is_better=False, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. + ) if optim_args.quantization_approach != "qat": - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = PostTrainingQuantConfig( approach=optim_args.quantization_approach, tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion ) else: - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) quantization_config = QuantizationAwareTrainingConfig( tuning_criterion=tuning_criterion, accuracy_criterion=accuracy_criterion diff --git a/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_bert_mini.sh b/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_bert_mini.sh index 48b24477a34..4e36c1330a1 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_bert_mini.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_bert_mini.sh @@ -128,7 +128,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_glue.py index 4400593f0c2..b5c05350e84 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_glue.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -197,9 +203,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -524,27 +530,38 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) + trainer.metrics = tune_metric objective = objectives.performance - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_distilbert.sh b/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_distilbert.sh index 53c694f0a89..43d99aa3419 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_distilbert.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_distilbert.sh @@ -128,7 +128,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" + mode_cmd=$mode_cmd" --tune --quantization_approach static" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_qa.py b/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_qa.py index 373669fb338..af1e10149f3 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_qa.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_qa.py @@ -26,7 +26,13 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel +from neural_compressor.config import ( + PostTrainingQuantConfig, + QuantizationAwareTrainingConfig, + TuningCriterion, + AccuracyCriterion +) from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -211,9 +217,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -646,25 +652,38 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "PostTrainingDynamic": + if optim_args.quantization_approach != "dynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) - if optim_args.quantization_approach == "QuantizationAwareTraining": - early_stopping_patience = 6 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, - early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - quantization_config = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=200, - metrics=[tune_metric], + trainer.metrics = tune_metric + objective = objectives.performance + tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) + accuracy_criterion = AccuracyCriterion( + higher_is_better=True, # optional. + criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". + tolerable_loss=optim_args.perf_tol, # optional. ) + if optim_args.quantization_approach != "qat": + quantization_config = PostTrainingQuantConfig( + approach=optim_args.quantization_approach, + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + else: + quantization_config = QuantizationAwareTrainingConfig( + tuning_criterion=tuning_criterion, + accuracy_criterion=accuracy_criterion + ) + early_stopping_patience = 2 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ + early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/distillation_for_quantization/run_glue.py b/examples/huggingface/pytorch/text-classification/distillation_for_quantization/run_glue.py index 831ecb734ea..2524d5e1ced 100644 --- a/examples/huggingface/pytorch/text-classification/distillation_for_quantization/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/distillation_for_quantization/run_glue.py @@ -31,15 +31,15 @@ from datasets import load_dataset, load_metric from intel_extension_for_transformers.transformers import ( metrics, - PrunerConfig, - PruningConfig, - DistillationConfig, - QuantizationConfig, OptimizedModel, objectives ) +from neural_compressor.config import ( + DistillationConfig, + IntermediateLayersKnowledgeDistillationLossConfig, + QuantizationAwareTrainingConfig, +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer -from intel_extension_for_transformers.transformers.distillation import Criterion from torch.utils.data import DataLoader from tqdm.auto import tqdm from transformers import ( @@ -543,29 +543,21 @@ def compute_metrics(p: EvalPrediction): tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) + trainer.metrics = tune_metric + layer_mappings = [[[f"bert.encoder.layer.{i}", "0"]] for i in range(12)] +\ [[[f"bert.encoder.layer.{i}.attention", "1"]] for i in range(12)] +\ [[["classifier"]]] - distillation_conf = DistillationConfig( - framework="pytorch_fx", metrics=tune_metric, - criterion=Criterion( - name="IntermediateLayersLoss", + criterion_conf = IntermediateLayersKnowledgeDistillationLossConfig( layer_mappings=layer_mappings, loss_types=["MSE"] * len(layer_mappings), loss_weight_ratio=[1.0 / len(layer_mappings)] * len(layer_mappings), add_origin_loss=True - ) - ) - - objective = objectives.performance - quantization_conf = QuantizationConfig( - approach="QuantizationAwareTraining", - max_trials=600, - metrics=[tune_metric], - objectives=[objective] ) + distillation_conf = DistillationConfig(teacher_model=teacher_model, criterion=criterion_conf) + quantization_conf = QuantizationAwareTrainingConfig() conf_list = [distillation_conf, quantization_conf] - model = trainer.orchestrate_optimizations(config_list=conf_list, teacher_model=teacher_model) + model = trainer.orchestrate_optimizations(config_list=conf_list) if optim_args.benchmark or optim_args.accuracy_only: # Load the model obtained after Intel Neural Compressor (INC) quantization diff --git a/examples/huggingface/pytorch/text-classification/orchestrate_optimizations/README.md b/examples/huggingface/pytorch/text-classification/orchestrate_optimizations/README.md index afd199d00c4..461e84d3dd7 100644 --- a/examples/huggingface/pytorch/text-classification/orchestrate_optimizations/README.md +++ b/examples/huggingface/pytorch/text-classification/orchestrate_optimizations/README.md @@ -17,7 +17,7 @@ python run_glue.py \ --model_name_or_path Intel/distilbert-base-uncased-sparse-90-unstructured-pruneofa \ --teacher_model distilbert-base-uncased-finetuned-sst-2-english \ --task_name sst2 \ - --quantization_approach QuantizationAwareTraining \ + --quantization_approach qat \ --do_train \ --do_eval \ --orchestrate_optimization \ @@ -37,7 +37,7 @@ python -m torch.distributed.launch --master_addr= --nproc_per_no --model_name_or_path Intel/distilbert-base-uncased-sparse-90-unstructured-pruneofa \ --teacher_model distilbert-base-uncased-finetuned-sst-2-english \ --task_name sst2 \ - --quantization_approach QuantizationAwareTraining \ + --quantization_approach qat \ --do_train \ --do_eval \ --orchestrate_optimization \ diff --git a/examples/huggingface/pytorch/text-classification/orchestrate_optimizations/run_glue.py b/examples/huggingface/pytorch/text-classification/orchestrate_optimizations/run_glue.py index 26f3cd535b7..89c0f104064 100644 --- a/examples/huggingface/pytorch/text-classification/orchestrate_optimizations/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/orchestrate_optimizations/run_glue.py @@ -30,13 +30,15 @@ from datasets import load_dataset, load_metric from intel_extension_for_transformers.transformers import ( metrics, - PrunerConfig, - PruningConfig, - DistillationConfig, - QuantizationConfig, OptimizedModel, objectives ) +from neural_compressor.config import ( + WeightPruningConfig, + DistillationConfig, + KnowledgeDistillationLossConfig, + QuantizationAwareTrainingConfig, +) from intel_extension_for_transformers.transformers.trainer import NLPTrainer from torch.utils.data import DataLoader from tqdm.auto import tqdm @@ -211,7 +213,7 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply prune."}, ) pruning_approach: Optional[str] = field( - default="BasicMagnitude", + default="magnitude", metadata={"help": "Pruning approach. Supported approach is basic_magnite."}, ) target_sparsity_ratio: Optional[float] = field( @@ -231,9 +233,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="PostTrainingStatic", - metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " - "PostTrainingDynamic and QuantizationAwareTraining."}, + default="static", + metadata={"help": "Quantization approach. Supported approach are static, " + "dynamic and qat."}, ) metric_name: Optional[str] = field( default=None, @@ -637,10 +639,6 @@ def get_logits(teacher_model, train_dataset, teacher_train_dataset): logger.info("***** Number of student model parameters: {:.2f}M *****".format(\ para_counter(model)/10**6)) - # Trace model - from neural_compressor.adaptor.torch_utils.symbolic_trace import symbolic_trace - model = symbolic_trace(model, optim_args.quantization_approach=="QuantizationAwareTraining") - # Initialize our Trainer trainer = NLPTrainer( model=model, @@ -673,23 +671,20 @@ def get_logits(teacher_model, train_dataset, teacher_train_dataset): tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - prune_type = 'PatternLock' \ + prune_type = 'pattern_lock' \ if optim_args.pruning_approach else optim_args.pruning_approach target_sparsity_ratio = optim_args.target_sparsity_ratio \ if optim_args.target_sparsity_ratio else None - pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio) - pruning_conf = PruningConfig(framework="pytorch_fx",pruner_config=[pruner_config], metrics=tune_metric) - distillation_conf = DistillationConfig(framework="pytorch_fx", metrics=tune_metric) - - objective = objectives.performance - quantization_conf = QuantizationConfig( - approach=optim_args.quantization_approach, - max_trials=600, - metrics=[tune_metric], - objectives=[objective] - ) + trainer.metrics = tune_metric + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=target_sparsity_ratio, + pruning_scope="local", + pruning_type=prune_type) + distillation_criterion = KnowledgeDistillationLossConfig(loss_types=["CE", "KL"]) + distillation_conf = DistillationConfig(teacher_model=teacher_model, criterion=distillation_criterion) + quantization_conf = QuantizationAwareTrainingConfig() conf_list = [pruning_conf, distillation_conf, quantization_conf] - model = trainer.orchestrate_optimizations(config_list=conf_list, teacher_model=teacher_model) + model = trainer.orchestrate_optimizations(config_list=conf_list) if optim_args.benchmark or optim_args.accuracy_only: # Load the model obtained after Intel Neural Compressor (INC) quantization diff --git a/intel_extension_for_transformers/transformers/__init__.py b/intel_extension_for_transformers/transformers/__init__.py index 300ba84b71e..94b8091c60e 100644 --- a/intel_extension_for_transformers/transformers/__init__.py +++ b/intel_extension_for_transformers/transformers/__init__.py @@ -19,22 +19,12 @@ from .config import ( WEIGHTS_NAME, BenchmarkConfig, - DistillationConfig, DynamicLengthConfig, Provider, PrunerV2, - PruningConfig, - QuantizationConfig, - TFDistillationConfig, -) -from .distillation import ( - SUPPORTED_DISTILLATION_CRITERION_MODE, - DistillationCriterionMode, + ) -from .optimizer_tf import TFOptimization -from .pruning import SUPPORTED_PRUNING_MODE, PrunerConfig, PruningMode -from .quantization import SUPPORTED_QUANT_MODE, QuantizationMode from .utils import ( MixedPrecisionConfig, BitsAndBytesConfig, diff --git a/intel_extension_for_transformers/transformers/config.py b/intel_extension_for_transformers/transformers/config.py index 640efdb8cf5..8a65234f46e 100644 --- a/intel_extension_for_transformers/transformers/config.py +++ b/intel_extension_for_transformers/transformers/config.py @@ -150,651 +150,6 @@ def __init__( self.latency_constraint = latency_constraint self.evo_eval_metric = evo_eval_metric - -class QuantizationConfig(object): - """Configure the quantization process. - - Args: - framework: Which framework you used - approach: Which quantization approach to use - strategy: Which quantization tuning strategy to use - timeout: Tuning timeout(seconds), 0 means early stop. Combined with max_trials field to decide when to exit - max_trials: Max tune times - metrics: Used to evaluate accuracy of tuning model, no need for NoTrainerOptimize - objectives: Objective with accuracy constraint guaranteed - config_file: Path to the config file - sampling_size: How many samples to use - use_bf16: Whether to use bf16 - recipes: apply recipes for quantization, neural_compressor support below recipes: - 'smooth_quant': whether do smooth quant - 'smooth_quant_args': parameters for smooth_quant - 'fast_bias_correction': whether do fast bias correction - 'weight_correction': whether do weight correction - 'gemm_to_matmul': whether convert gemm to matmul and add, only valid for onnx models - 'graph_optimization_level': support 'DISABLE_ALL', 'ENABLE_BASIC', 'ENABLE_EXTENDED', 'ENABLE_ALL' - only valid for onnx models - 'first_conv_or_matmul_quantization': whether quantize the first conv or matmul - 'last_conv_or_matmul_quantization': whether quantize the last conv or matmul - 'pre_post_process_quantization': whether quantize the ops in preprocess and postprocess - 'add_qdq_pair_to_weight': whether add QDQ pair for weights, only valid for onnxrt_trt_ep - 'optypes_to_exclude_output_quant': don't quantize output of specified optypes - 'dedicated_qdq_pair': whether dedicate QDQ pair, only valid for onnxrt_trt_ep. - """ - def __init__( - self, - framework: str = "pytorch", - approach: str = "PostTrainingStatic", - strategy: str = "basic", - timeout: int = 0, - max_trials: int = 100, - metrics: Union[Metric, List] = None, - objectives: Union[Objective, List] = performance, - config_file: str = None, - sampling_size: int = 100, - use_bf16: bool = False, - recipes: dict = None, - ): - """Init a QuantizationConfig object.""" - super().__init__() - if config_file is None: - self.inc_config = Quantization_Conf() - else: - self.inc_config = Quantization_Conf(config_file) - self.framework = framework - if approach is not None: - self.approach = approach - if strategy is not None: - self.strategy = strategy - if timeout is not None: - self.timeout = timeout - if max_trials is not None: - self.max_trials = max_trials - if metrics is not None: - self.metrics = metrics - else: - self._metrics = None - if objectives is not None: - self.objectives = objectives - else: - self._objectives = None - if sampling_size is not None: - self.sampling_size = sampling_size - self.inc_config.usr_cfg.use_bf16 = use_bf16 - if recipes is not None: - self.recipes = recipes - - @property - def approach(self): - """Get the quantization approach.""" - return self.inc_config.usr_cfg.quantization.approach - - @approach.setter - def approach(self, approach): - """Set the quantization approach.""" - approach = approach.upper() - assert approach in SUPPORTED_QUANT_MODE, \ - f"quantization approach: {approach} is not support!" + \ - "PostTrainingStatic, PostTrainingDynamic and QuantizationAwareTraining are supported!" - self.inc_config.usr_cfg.quantization.approach = QuantizationMode[approach].value - - @property - def input_names(self): - """Get the input names.""" - return self.inc_config.usr_cfg.model.inputs - - @input_names.setter - def input_names(self, input_names): - """Set the input names.""" - assert isinstance(input_names, list), "input_names must be a list" - self.inc_config.usr_cfg.model.inputs = input_names - - @property - def output_names(self): - """Get the output names.""" - return self.inc_config.usr_cfg.model.outputs - - @output_names.setter - def output_names(self, output_names): - """Set the output names.""" - assert isinstance(output_names, list), "output_names must be a list" - self.inc_config.usr_cfg.model.outputs = output_names - - @property - def metrics(self): - """Get the metrics.""" - return self._metrics - - @metrics.setter - def metrics(self, metrics: Union[Metric, List]): - """Set the metrics.""" - self._metrics = metrics - rel_or_abs = {True: "relative", False: "absolute"} - assert isinstance(metrics[0] if isinstance(metrics, list) else metrics, Metric), \ - "metric should be a Metric class!" - if isinstance(metrics, Metric) or len(metrics) == 1: - self.inc_config.usr_cfg.tuning.accuracy_criterion = { - rel_or_abs[metrics[0].is_relative] - if isinstance(metrics, list) else rel_or_abs[metrics.is_relative]: - metrics[0].criterion if isinstance(metrics, list) else metrics.criterion, - "higher_is_better": metrics[0].greater_is_better if isinstance(metrics, list) else - metrics.greater_is_better - } - else: - weights = [metric.weight_ratio for metric in metrics] - if not any(weights): - weight = 1 / len(metrics) - for metric in metrics: - metric.weight_ratio = weight - else: # pragma: no cover - assert all(weights), "Please set the weight ratio for all metrics!" - - assert all(metric.is_relative == metrics[0].is_relative for metric in metrics), \ - "Unsupported different is_relative for different metric now, will support soon!" - assert all(metric.criterion == metrics[0].criterion for metric in metrics), \ - "Unsupported different criterion for different metric now, will support soon!" - - self.inc_config.usr_cfg.tuning.accuracy_criterion = { - rel_or_abs[metrics[0].is_relative]: metrics[0].criterion, - "higher_is_better": metrics[0].greater_is_better - } - - @property - def framework(self): - """Get the framework.""" - return self.inc_config.usr_cfg.model.framework - - @framework.setter - def framework(self, framework): - """Set the framework.""" - assert framework in ["pytorch", "pytorch_fx", "pytorch_ipex", "tensorflow"], \ - "framework: {} is not support!".format(framework) - self.inc_config.usr_cfg.model.framework = framework - - @property - def objectives(self): - """Get the objectives.""" - return self._objectives - - @objectives.setter - def objectives(self, objectives: Union[List, Objective]): - """Set the objectives.""" - self._objectives = objectives - if isinstance(objectives, Objective) or len(objectives) == 1: - self.inc_config.usr_cfg.tuning.objective = objectives.name \ - if isinstance(objectives, Objective) else objectives[0].name - else: - weights = [objective.weight_ratio for objective in objectives] - if not any(weights): - weight = 1 / len(objectives) - for objective in objectives: - objective.weight_ratio = weight - else: - assert all(weights), "Please set the weight ratio for all metrics!" - - self.inc_config.usr_cfg.tuning.multi_objective = { - "objective": [objective.name for objective in objectives], - "higher_is_better": [objective.greater_is_better for objective in objectives], - "weight": [objective.weight_ratio for objective in objectives], - } - - @property - def strategy(self): - """Get the strategy.""" - return self.inc_config.usr_cfg.tuning.strategy.name - - @strategy.setter - def strategy(self, strategy): - """Set the strategy.""" - assert strategy in ["basic", "bayesian", "mse", "mse_v2"], \ - "strategy: {} is not support!".format(strategy) - self.inc_config.usr_cfg.tuning.strategy.name = strategy - if strategy == "mse_v2": - self.inc_config.usr_cfg.tuning.strategy_kwargs = {"confidence_batches": 1} - - @property - def timeout(self): - """Get the timeout.""" - return self.inc_config.usr_cfg.tuning.exit_policy.timeout - - @timeout.setter - def timeout(self, timeout): - """Set the timeout.""" - assert isinstance(timeout, int), "timeout should be integer!" - self.inc_config.usr_cfg.tuning.exit_policy.timeout = timeout - - @property - def op_wise(self): - """Get the op_wise dict.""" - return self.inc_config.usr_cfg.quantization.op_wise - - @op_wise.setter - def op_wise(self, op_wise): - """Set the op_wise dict.""" - self.inc_config.usr_cfg.quantization.op_wise = op_wise - - @property - def optype_wise(self): - """Get the optype_wise dict.""" - return self.inc_config.usr_cfg.quantization.optype_wise - - @optype_wise.setter - def optype_wise(self, optype_wise): - """Set the optype_wise dict.""" - self.inc_config.usr_cfg.quantization.optype_wise = optype_wise - - @property - def max_trials(self): - """Get the number of maximum trials.""" - return self.inc_config.usr_cfg.tuning.exit_policy.max_trials - - @max_trials.setter - def max_trials(self, max_trials): - """Set the number of maximum trials.""" - assert isinstance(max_trials, int), "max_trials should be integer!" - self.inc_config.usr_cfg.tuning.exit_policy.max_trials = max_trials - - @property - def performance_only(self): - """Get the boolean whether to use performance only.""" - return self.inc_config.usr_cfg.tuning.exit_policy.performance_only - - @performance_only.setter - def performance_only(self, performance_only): - """Set the boolean whether to use performance only.""" - assert isinstance(performance_only, boolean), "performance_only should be boolean!" - self.inc_config.usr_cfg.tuning.exit_policy.performance_only = performance_only - - @property - def random_seed(self): - """Get the random seed.""" - return self.inc_config.usr_cfg.tuning.random_seed - - @random_seed.setter - def random_seed(self, random_seed): - """Set the random seed.""" - assert isinstance(random_seed, int), "random_seed should be integer!" - self.inc_config.usr_cfg.tuning.random_seed = random_seed - - @property - def tensorboard(self): - """Get the boolean whether to use tensorboard.""" - return self.inc_config.usr_cfg.tuning.tensorboard - - @tensorboard.setter - def tensorboard(self, tensorboard): - """Set the boolean whether to use tensorboard.""" - assert isinstance(tensorboard, boolean), "tensorboard should be boolean!" - self.inc_config.usr_cfg.tuning.tensorboard = tensorboard - - @property - def output_dir(self): - """Get the output directory.""" - return self.inc_config.usr_cfg.tuning.workspace.path - - @output_dir.setter - def output_dir(self, path): - """Set the output directory.""" - assert isinstance(path, str), "save_path should be a string of directory!" - self.inc_config.usr_cfg.tuning.workspace.path = path - - @property - def resume_path(self): - """Get the resume path.""" - return self.inc_config.usr_cfg.tuning.workspace.resume - - @resume_path.setter - def resume_path(self, path): - """Set the resume path.""" - assert isinstance(path, str), "resume_path should be a string of directory!" - self.inc_config.usr_cfg.tuning.workspace.resume = path - - @property - def sampling_size(self): - """Get the sampling size.""" - return self.inc_config.usr_cfg.quantization.calibration.sampling_size - - @sampling_size.setter - def sampling_size(self, sampling_size): - """Set the sampling size.""" - if isinstance(sampling_size, int): - self.inc_config.usr_cfg.quantization.calibration.sampling_size = [sampling_size] - elif isinstance(sampling_size, list): - self.inc_config.usr_cfg.quantization.calibration.sampling_size = sampling_size - else: - assert False, "The sampling_size must be a list of int numbers" - - @property - def recipes(self): - """Get the sampling size.""" - return self.inc_config.usr_cfg.quantization.recipes - - @recipes.setter - def recipes(self, recipes): - """Set recipes.""" - if recipes is not None and not isinstance(recipes, dict): - raise ValueError("recipes should be a dict.") - - # Support PyTorch only - def smooth_quant(val=None): - if val is not None: - return check_value("smooth_quant", val, bool) - else: - return False - - # Support PyTorch only - def smooth_quant_args(val=None): - if val is not None: - check_value("smooth_quant_args", val, dict) - for k, v in val.items(): - if k == "alpha": - assert isinstance(v, str) or isinstance(v, float),\ - "Smooth_quant_args.alpha should be a float or 'auto'." - return True - else: - return {} - - # Support tensorflow, but not enabled now - def fast_bias_correction(val=None): # pragma: no cover - if val is not None: - return check_value("fast_bias_correction", val, bool) - else: - return False - - # Support tensorflow, but not enabled now - def weight_correction(val=None): # pragma: no cover - if val is not None: - return check_value("weight_correction", val, bool) - else: - return False - - # Support Tensorflow only - def first_conv_or_matmul_quantization(val=None): - if val is not None: - return check_value("first_conv_or_matmul_quantization", val, bool) - else: - return True - - # Support Tensorflow only - def last_conv_or_matmul_quantization(val=None): - if val is not None: - return check_value("last_conv_or_matmul_quantization", val, bool) - else: - return True - - RECIPES = {"smooth_quant": smooth_quant, # Only for PyTorch - "smooth_quant_args": smooth_quant_args, # Only for PyTorch - "fast_bias_correction": fast_bias_correction, # Support PyTorch and Tensorflow, not used now. - "weight_correction": weight_correction, # Support PyTorch and Tensorflow, not used now. - "first_conv_or_matmul_quantization": first_conv_or_matmul_quantization, # Only for Tensorflow - "last_conv_or_matmul_quantization": last_conv_or_matmul_quantization, # Only for Tensorflow - } - _recipes = {} - for k in RECIPES.keys(): - if k in recipes and RECIPES[k](recipes[k]): - _recipes.update({k: recipes[k]}) - else: - _recipes.update({k: RECIPES[k]()}) - deep_set(self.inc_config.usr_cfg, 'quantization.recipes', _recipes) - - -class PruningConfig(object): - """Configure the pruning process. - - Args: - framework: Which framework you used - epochs: How many epochs to prune - epoch_range: Epoch range list - initial_sparsity_ratio: Initial sparsity goal, and not needed if pruner_config argument is defined - target_sparsity_ratio: Target sparsity goal, and not needed if pruner_config argument is defined - metrics: Used to evaluate accuracy of tuning model, not needed for NoTrainerOptimizer - pruner_config: Defined pruning behavior, if it is None, then NLP will create a default pruner with - 'BasicMagnitude' pruning typel - config_file: Path to the config file - """ - def __init__( - self, - framework: str = "pytorch", - epochs: int = 1, - epoch_range: List = [0, 4], - initial_sparsity_ratio: float=0.0, - target_sparsity_ratio: float = 0.97, - metrics: Metric = None, - pruner_config: Union[List, Pruner] = None, - config_file: str = None - ): - """Init a PruningConfig object.""" - super().__init__() - self.inc_config = Pruning_Conf(config_file) - self.framework = framework - - if initial_sparsity_ratio is not None: - self.initial_sparsity_ratio = initial_sparsity_ratio - if target_sparsity_ratio is not None: - self.target_sparsity_ratio = target_sparsity_ratio - if epoch_range is not None: - self.epoch_range = epoch_range - if metrics is not None: - self.metrics = metrics - else: - self._metrics = None - if pruner_config is not None: - self.pruner_config = pruner_config - else: - self.init_prune_config() - self.epochs = epochs - - - def init_prune_config(self): - """Init the pruning config.""" - pruner_config = Pruner() - self.inc_config.usr_cfg.pruning.approach.weight_compression['pruners'] = [pruner_config] - - @property - def pruner_config(self): - """Get the pruner config.""" - return self.inc_config.usr_cfg.pruning.approach.weight_compression.pruners - - @pruner_config.setter - def pruner_config(self, pruner_config): - """Set the pruner config.""" - if isinstance(pruner_config, list): - self.inc_config.usr_cfg.pruning.approach.weight_compression.pruners = pruner_config - else: - self.inc_config.usr_cfg.pruning.approach.weight_compression.pruners = [pruner_config] - - @property - def target_sparsity_ratio(self): - """Get the target sparsity ratio.""" - return self.inc_config.usr_cfg.pruning.approach.weight_compression.target_sparsity - - @target_sparsity_ratio.setter - def target_sparsity_ratio(self, target_sparsity_ratio): - """Set the target sparsity ratio.""" - self.inc_config.usr_cfg.pruning.approach.weight_compression.target_sparsity = \ - target_sparsity_ratio - - @property - def initial_sparsity_ratio(self): - """Get the initial sparsity ratio.""" - return self.inc_config.usr_cfg.pruning.approach.weight_compression.initial_sparsity - - @initial_sparsity_ratio.setter - def initial_sparsity_ratio(self, initial_sparsity_ratio): - """Set the initial sparsity ratio.""" - self.inc_config.usr_cfg.pruning.approach.weight_compression.initial_sparsity = \ - initial_sparsity_ratio - - @property - def epoch_range(self): - """Get the epoch range.""" - return [self.inc_config.usr_cfg.pruning.approach.weight_compression.start_epoch, - self.inc_config.usr_cfg.pruning.approach.weight_compression.end_epoch] - - @epoch_range.setter - def epoch_range(self, epoch_range): - """Set the epoch range.""" - assert isinstance(epoch_range, list) and len(epoch_range) == 2, \ - "You should set epoch_range like [a,b] format to match the pruning start and end epoch." - self.inc_config.usr_cfg.pruning.approach.weight_compression.start_epoch = epoch_range[0] - self.inc_config.usr_cfg.pruning.approach.weight_compression.end_epoch = epoch_range[1] - - @property - def epochs(self): - """Get the epochs.""" - eps = self.inc_config.usr_cfg.pruning.train.epoch \ - if hasattr(self.inc_config.usr_cfg.pruning, "train") else 1 - return eps - - @epochs.setter - def epochs(self, epochs): - """Set the epochs.""" - assert isinstance(epochs, int) and epochs > 0, \ - "You should set epochs > 0 and int, not {}.".format(epochs) - self.inc_config.usr_cfg.pruning["train"] = {"epoch": epochs} - - @property - def framework(self): - """Get the framework.""" - return self.inc_config.usr_cfg.model.framework - - @framework.setter - def framework(self, framework): - """Set the framework.""" - assert framework.lower() in ["pytorch", "pytorch_fx", "tensorflow"], \ - "framework: {} is not support!".format(framework) - self.inc_config.usr_cfg.model.framework = framework.lower() - - @property - def metrics(self): - """Get the metrics.""" - return self._metrics - - @metrics.setter - def metrics(self, metrics: Metric): - """Set the metrics.""" - self._metrics = metrics - - -class DistillationConfig(object): - """Configure the distillation process. - - Args: - framework: Which framework you used - criterion: Criterion of training, example: "KnowledgeLoss" - metrics: Metrics for distillation - inc_config: Distillation config - """ - def __init__( - self, - framework: str = "pytorch", - criterion: Criterion = None, - metrics: Metric = None, - inc_config = None - ): - """Init a DistillationConfig object.""" - super().__init__() - self.inc_config = Distillation_Conf(inc_config) - self.framework = framework - if criterion is not None: - self.criterion = criterion - if metrics is not None: - self.metrics = metrics - else: - self._metrics = None - - @property - def framework(self): - """Get the framework.""" - return self.inc_config.usr_cfg.model.framework - - @framework.setter - def framework(self, framework): - """Set the framework.""" - assert framework in ["pytorch", "pytorch_fx", "tensorflow"], \ - "framework: {} is not support!".format(framework) - self.inc_config.usr_cfg.model.framework = framework - - @property - def criterion(self): - """Get the criterion.""" - return self.inc_config.usr_cfg.distillation.train.criterion - - @criterion.setter - def criterion(self, criterion: Criterion): - """Set the criterion.""" - assert criterion.name.upper() in SUPPORTED_DISTILLATION_CRITERION_MODE, \ - "The criterion name must be in ['KnowledgeLoss', 'IntermediateLayersLoss']" - if criterion.name.upper() == DistillationCriterionMode.KNOWLEDGELOSS.name: - assert criterion.temperature is not None, \ - "Please pass the temperature to Criterion.temperature!" - assert criterion.loss_types is not None, \ - "Please pass the loss_types to Criterion.loss_types!" - assert criterion.loss_weight_ratio is not None, \ - "Please pass the loss_weight_ratio to Criterion.loss_weight_ratio!" - self.inc_config.usr_cfg.distillation.train.criterion = { - DistillationCriterionMode.KNOWLEDGELOSS.value: { - "temperature": criterion.temperature, - "loss_types": criterion.loss_types, - "loss_weights": criterion.loss_weight_ratio - } - } - - if criterion.name.upper() == DistillationCriterionMode.INTERMEDIATELAYERSLOSS.name: - assert criterion.layer_mappings is not None, \ - "Please pass the layer_mappings to Criterion.layer_mappings!" - assert criterion.loss_types is not None, \ - "Please pass the loss_types to Criterion.loss_types!" - assert criterion.loss_weight_ratio is not None, \ - "Please pass the loss_weight_ratio to Criterion.loss_weight_ratio!" - assert criterion.add_origin_loss is not None, \ - "Please pass the add_origin_loss to Criterion.add_origin_loss!" - self.inc_config.usr_cfg.distillation.train.criterion = { - DistillationCriterionMode.INTERMEDIATELAYERSLOSS.value: { - "layer_mappings": criterion.layer_mappings, - "loss_types": criterion.loss_types, - "loss_weights": criterion.loss_weight_ratio, - "add_origin_loss": criterion.add_origin_loss - } - } - - @property - def metrics(self): - """Get the metrics.""" - return self._metrics - - @metrics.setter - def metrics(self, metrics): - """Set the metrics.""" - assert isinstance(metrics, Metric), \ - "metric should be a Metric class!" - self._metrics = metrics - - -class TFDistillationConfig(object): - """Configure the distillation process for Tensorflow. - - Args: - loss_types: Type of loss - loss_weights: Weight ratio of loss - train_steps: Steps of training - temperature: Parameter for KnowledgeDistillationLoss - """ - def __init__( - self, - loss_types: list = [], - loss_weights: list = [], - train_steps: list = [], - temperature: float = 1.0 - ): - """Init a TFDistillationConfig object.""" - super().__init__() - self.loss_types = loss_types - self.loss_weights = loss_weights - self.train_steps = train_steps - self.temperature = temperature - - - class BenchmarkConfig: """Config Class for Benchmark. diff --git a/intel_extension_for_transformers/transformers/distillation.py b/intel_extension_for_transformers/transformers/distillation.py deleted file mode 100644 index 9f801b9c112..00000000000 --- a/intel_extension_for_transformers/transformers/distillation.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Distillation: set criterion mode to distillation.""" -from enum import Enum -from typing import List - - -class Criterion(object): - """Criterion class for distillation.""" - def __init__( - self, - name: str = "KNOWLEDGELOSS", - temperature: float = 1.0, - loss_types: List = ['CE', 'CE'], - loss_weight_ratio: List = [0.5, 0.5], - layer_mappings: List = None, - add_origin_loss: bool = False - ): - """Init a Criterion object.""" - self.name = name - self.temperature = temperature - self.loss_types = loss_types - self.loss_weight_ratio = loss_weight_ratio - self.layer_mappings = layer_mappings - self.add_origin_loss = add_origin_loss - - -class DistillationCriterionMode(Enum): - """Criterion mode class for distillation.""" - KNOWLEDGELOSS = "KnowledgeDistillationLoss" - INTERMEDIATELAYERSLOSS = "IntermediateLayersKnowledgeDistillationLoss" - - - -SUPPORTED_DISTILLATION_CRITERION_MODE = \ - set([approach.name for approach in DistillationCriterionMode]) diff --git a/intel_extension_for_transformers/transformers/optimizer_tf.py b/intel_extension_for_transformers/transformers/optimizer_tf.py deleted file mode 100644 index e1ee4f7b416..00000000000 --- a/intel_extension_for_transformers/transformers/optimizer_tf.py +++ /dev/null @@ -1,733 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""TFOptimization: provides the optimization class for Tensorflow.""" -import logging -import pstats -import numpy as np -import os -import time -from neural_compressor import __version__ -from neural_compressor.experimental import common -try: - from neural_compressor.model.model import saved_model_session, get_model_type -except ImportError: - from neural_compressor.model.tensorflow_model import saved_model_session, get_model_type -from intel_extension_for_transformers.transformers import (DistillationConfig, - QuantizationConfig, - PruningConfig) -from intel_extension_for_transformers.transformers.quantization import QuantizationMode -from intel_extension_for_transformers.transformers.utils.metrics import Metric -from intel_extension_for_transformers.transformers.utils.utility import LazyImport -from packaging import version -from transformers import PreTrainedModel -from typing import Callable, Optional, List -from .utils.utility_tf import TFDataloader, TMPPATH, TEACHERPATH, get_filepath - -tf = LazyImport("tensorflow") -logger = logging.getLogger(__name__) -logger.setLevel('INFO') - - -class TFOptimization: - """TFOptimization is the entry class for Tensorflow to use the optimization techniques in neural compressor.""" - def __init__(self, - model: PreTrainedModel, - args, - train_dataset=None, - eval_dataset=None, - compute_metrics: Optional[Callable] = None, - criterion=None, - optimizer=None, - task_type=None, - task_id=None, - strategy=None): - """Init a TFOptimziation object. - - Args: - model: FP32 model specified for low precision tuning - args: Training arguments for TF - train_dataset: Training datas - eval_dataset: Evaluation data - compute_metrics: Metrics computing function during the evaluation process - criterion: Tuning criterion - optimizer: The optimizer you used - task_type: Used for distributed multi-node settings. Default set as "worker" - task_id: Used for distributed multi-node settings. - Set as 0 on the leader node and 1, 2, 3... on the followers - strategy: Equals to MultiWorkerMirroredStrategy if use distributed distributed multi-node settings, - otherwise None - """ - self.model = model - self.teacher_model = None - self.component = None - self.eval_dataset = eval_dataset - self.train_dataset = train_dataset - self._eval_func = None - self._train_func = None - self.quant_config = None - self.pruning_config = None - self.distillation_config = None - self.pruner = None - self.quantizer = None - self.distiller = None - self.in_training = False - self._input_names = None - self._output_names = None - self._inputs = None - self.compute_metrics = compute_metrics - self.args = args - self.optimizer = optimizer - self.task_type = task_type - self.task_id = task_id - self.criterion = criterion if criterion is not None else \ - self.model.loss if hasattr(self.model, "loss") else None - self.model.save_pretrained(get_filepath(TMPPATH, self.task_type, self.task_id), saved_model=True) - _, self.input_names, self.output_names = saved_model_session( - os.path.join(get_filepath(TMPPATH, self.task_type, self.task_id), "saved_model/1"), input_tensor_names=[], - output_tensor_names=[]) - self.eval_distributed = False - self.strategy = strategy - - @property - def inputs(self): - """Get the inputs.""" - return self._inputs - - @inputs.setter - def inputs(self, inputs: dict): - """Set the inputs.""" - self._inputs = inputs - - @property - def input_names(self): - """Get the input names.""" - return self._input_names - - @input_names.setter - def input_names(self, input_names: List): - """Set the input names. - - Args: - input_names: the names of inputs. - """ - self._input_names = input_names - - @property - def output_names(self): - """Get the output names.""" - return self._output_names - - @output_names.setter - def output_names(self, output_names: List): - """Set the output names. - - Args: - output_names: the names of outputs. - """ - self._output_names = output_names - - @property - def eval_func(self): - """Get the evaluation function.""" - return self._eval_func - - @eval_func.setter - def eval_func(self, func: Callable): - """Set the evaluation function. - - Args: - func: evaluation function. - """ - self._eval_func = func - - @property - def train_func(self): - """Get the training function.""" - return self._train_func - - @train_func.setter - def train_func(self, func: Callable): - """Set the training function. - - Args: - func: train function. - """ - self._train_func = func - - @property - def train_dataset(self): - """Get the training dataset.""" - return self._train_dataset - - @train_dataset.setter - def train_dataset(self, train_dataset): - """Set the training dataset. - - Args: - train_dataset: train dataset. - """ - assert isinstance(train_dataset, tf.data.Dataset) or train_dataset is None, \ - "train_dataset should be obj of tf.data.Dataset" - self._train_dataset = train_dataset - - @property - def eval_dataset(self): - """Get the evaluation dataset.""" - return self._eval_dataset - - @eval_dataset.setter - def eval_dataset(self, eval_dataset): - """Set the evaluation dataset. - - Args: - eval_dataset: evaluation dataset. - """ - assert isinstance(eval_dataset, tf.data.Dataset) or eval_dataset is None, \ - "eval_dataset should be obj of tf.data.Dataset" - self._eval_dataset = eval_dataset - - def builtin_eval_func(self, model): - """Customize Evaluate function to inference the model for specified metric on the validation dataset. - - Args: - model ([tf.saved_model.load]): The model will be the class of tf.saved_model.load(quantized_model_path). - - Returns: - [float]: evaluation result, the larger is better. - """ - model_type = None - label_ids: np.ndarray = None - try: - model_type = get_model_type(model) - except ValueError: - logger.info("use keras savedModel") - - num_examples = sum(1 for _ in ( - self._eval_dataset.unbatch() if hasattr(self._eval_dataset, "unbatch") else self._eval_dataset)) - logger.info(f"***** Running Evaluation *****") - logger.info(f" Num examples in dataset = {num_examples}") - logger.info(f" Batch size = {self.args.per_device_eval_batch_size}") - - if model_type is None: - preds: np.ndarray = None - infer = model.signatures["serving_default"] - - for idx, (inputs, labels) in enumerate(self._eval_dataset): - for name in inputs: - inputs[name] = tf.constant(inputs[name].numpy(), dtype=infer.inputs[0].dtype) - - results = infer(**inputs) - for val in results: - if preds is None: - preds = results[val].numpy() - else: - preds = np.append(preds, results[val].numpy(), axis=0) - - if label_ids is None: - label_ids = labels[0].numpy() if isinstance( - labels, list) else labels.numpy() - else: - label_ids = np.append( - label_ids, - labels[0].numpy() - if isinstance(labels, list) else labels.numpy(), - axis=0) - test_predictions = {"logits": preds} - eval_metrics = self.compute_metrics(test_predictions, label_ids) - acc = eval_metrics["accuracy"] - return acc - else: # pragma: no cover - from neural_compressor.adaptor.tf_utils.util import get_tensor_by_name - input_tensor = [get_tensor_by_name(\ - model, x) for x in self.input_names] - output_tensor = [get_tensor_by_name(\ - model, x) for x in self.output_names] - - logger.info("Start to evaluate the TensorFlow model.") - - total_time = 0 - config = tf.compat.v1.ConfigProto() - config.use_per_session_threads = 1 - config.inter_op_parallelism_threads = 1 - sess = tf.compat.v1.Session(graph=model, config=config) - feed_dict = {} - label_ids: np.ndarray = None - preds: np.ndarray = None - for idx, (inputs, labels) in enumerate(self._eval_dataset): - assert len(input_tensor) == len(inputs), \ - 'inputs len must equal with input_tensor' - feed_dict = {} - for name in inputs: - for tensor in input_tensor: - pos = tensor.name.rfind(":") - t_name = tensor.name if pos < 0 else tensor.name[:pos] - if name == t_name: - feed_dict[tensor] = inputs[name].numpy() - break - - start = time.time() - logits = sess.run(output_tensor, feed_dict) - total_time += time.time() - start - if not self.args.prediction_loss_only: - if isinstance(logits, tuple): - logits = logits[0] - - if isinstance(labels, tuple): - labels = labels[0].numpy() - - if isinstance(logits, - list) and len(logits) > 1: # pragma: no cover - for val in logits: - if preds is None: - preds = val - else: - preds = np.append(preds, val, axis=0) - - for val in labels: - if label_ids is None: - label_ids = val.numpy() - else: - label_ids = np.append(label_ids, - val.numpy(), - axis=0) - else: - if preds is None: - preds = logits[0] if isinstance(logits, - list) else logits - else: - preds = np.append( - preds, - logits[0] if isinstance(logits, list) else logits, - axis=0) - - if label_ids is None: - label_ids = labels[0].numpy() if isinstance( - labels, list) else labels.numpy() - else: - label_ids = np.append( - label_ids, - labels[0].numpy() - if isinstance(labels, list) else labels.numpy(), - axis=0) - - if self.compute_metrics is not None and preds is not None and label_ids is not None: - try: - loss = self.criterion( - label_ids, preds) if self.criterion is not None else None - except Exception as e: # pragma: no cover - logger.info(e) - logger.info("There is no loss function or loss compute error, \ - Please compute loss in compute_metrics function" - ) - loss = None - results = self.compute_metrics({"logits": preds}, label_ids) - if loss is not None: - results["loss"] = loss.numpy() - - if isinstance(self.metrics, list): - nums = len(self.metrics) - for metric in self.metrics: - assert metric.name in results.keys(), \ - "Please set metric from {}".format(results.keys()) - if nums == 1: - result = results.get(self.metrics[0].name) - else: # pragma: no cover - result = 0 - for metric in self.metrics: - assert metric.weight_ratio is not None, \ - "Please set weights for metric if you want to use more than one metric" - result += results[metric.name] * metric.weighted - logger.info("metric Accuracy: {}".format(result)) - elif isinstance(self.metrics, Metric): - assert self.metrics.name in results.keys(), \ - "Please set metric from {}".format(results.keys()) - result = results.get(self.metrics.name) - logger.info("metric Accuracy: {}".format(result)) - else: # pragma: no cover - assert False, "Please set the correct metrics format from the README" - else: - result = 0 - logger.info("Throughput: {} samples/sec".format(num_examples / total_time)) - return result - - def init_quantizer( - self, - quant_config, - ): - """Init a Quantization object with config. - - Args: - quant_config: quantization config. - """ - from neural_compressor.experimental import Quantization - - self.quant_config = QuantizationConfig() if quant_config is None else quant_config - self.quant_config.framework = "tensorflow" - self.metrics = self.quant_config.metrics - - quantizer = Quantization(self.quant_config.inc_config) - quantizer.model = common.Model( - os.path.join(get_filepath(TMPPATH, self.task_type, self.task_id),"saved_model/1"), modelType="saved_model") - - self.quantizer = quantizer - return quantizer - - def _inc_quantize( - self, - quant_config, - ): - """Do the quantization. - - Args: - quant_config: quantization config. - """ - if self.quantizer is None: - self.init_quantizer(quant_config=quant_config) - if self._eval_func is not None: - self.quantizer.eval_func = self._eval_func - else: - assert self.metrics is not None, \ - "Please pass the metrics to QuantizationConfig.metrics!" - self.quantizer.eval_func = self.builtin_eval_func - - if self.quant_config.approach == QuantizationMode.POSTTRAININGSTATIC.value: - if self._train_dataset is not None: - self.quantizer.calib_dataloader = TFDataloader( - self._train_dataset, - batch_size=self.args.per_device_train_batch_size) - elif self._eval_dataset is not None: - self.quantizer.calib_dataloader = TFDataloader( - self._eval_dataset, - batch_size=self.args.per_device_eval_batch_size) - else: # pragma: no cover - assert False, "Please pass calibration dataset to TFNoTrainerOptimizer.calib_dataloader" - elif self.quant_config.approach == QuantizationMode.QUANTIZATIONAWARETRAINING.value: # pragma: no cover - assert False, \ - "Unsupported quantization aware training for tensorflow framework" - - opt_model = self.quantizer.fit() - opt_model.save(self.args.output_dir) - logger.info( - "quantized model have saved to {}".format(self.args.output_dir) - ) - return opt_model.model - - def quantize( - self, - quant_config: QuantizationConfig = None, - eval_func: Optional[Callable] = None, - train_func: Optional[Callable] = None, - train_dataset=None, - eval_dataset=None, - ): - """Prepare for invoking INC quantize function. - - Args: - quant_config: quantization config. - eval_func: evaluation function. - train_func: train function. - train_dataset: train dataset. - eval_dataset: evaluation dataset. - """ - if eval_func is not None: - self._eval_func = eval_func - if train_func is not None: - self._train_func = train_func - if train_dataset is not None: - self.train_dataset = train_dataset - - if eval_dataset is not None: - self.eval_dataset = eval_dataset - - return self._inc_quantize(quant_config=quant_config) - - def init_pruner( - self, - pruning_config=None, - ): - """Init a Pruning object with config. - - Args: - pruning_config: pruning config. - """ - from neural_compressor.experimental import Pruning - if pruning_config.framework != 'tensorflow': - logger.warning('pruning_config.framework is {}, should be tensorflow'.format(pruning_config.framework)) - pruning_config.framework = 'tensorflow' - self.pruning_config = pruning_config - self.metrics = self.pruning_config.metrics - - assert isinstance(self.pruning_config, PruningConfig), \ - "please pass a instance of PruningConfig to trainer.prune!" - - pruner = Pruning(self.pruning_config.inc_config) - pruner.model = os.path.join(get_filepath(TMPPATH, self.task_type, self.task_id), "saved_model/1") - pruner.model.model_type = "saved_model" - - self.pruner = pruner - self.component = pruner - return pruner - - def prune( - self, - pruning_config=None, - eval_func: Optional[Callable] = None, - train_func: Optional[Callable] = None, - train_dataset=None, - eval_dataset=None, - ): - """Do the pruning. - - Args: - pruning_config: pruning config. - eval_func: evaluation function. - train_func: train function. - train_dataset: train dataset. - eval_dataset: evaluation dataset. - """ - if self.pruner is None: - self.init_pruner(pruning_config=pruning_config) - if eval_func is not None: - self.eval_func = eval_func - if train_func is not None: - self.train_func = train_func - - if train_dataset is not None: - self.train_dataset = train_dataset - - if eval_dataset is not None: - self.eval_dataset = eval_dataset - - if self._eval_func is not None: - self.pruner.eval_func = self._eval_func - else: - assert self.metrics is not None, \ - "Please pass the metrics to PruningConfig.metrics!" - self.pruner.eval_func = self.builtin_eval_func - - if self.train_func is not None: - if version.parse(__version__) <= version.parse("1.12"): - self.pruner.pruning_func = self._train_func - else: - self.pruner.train_func = self._train_func - else: - if version.parse(__version__) <= version.parse("1.12"): - self.pruner.pruning_func = self.build_train_func - else: - self.pruner.train_func = self.build_train_func - - opt_model = self.pruner.fit() - stats, sparsity = opt_model.report_sparsity() - logger.info(stats) - logger.info(sparsity) - - opt_model.save(self.args.output_dir) - logger.info( - "pruned model have saved to {}".format(self.args.output_dir) - ) - return opt_model.model - - def init_distiller( - self, - distillation_config, - teacher_model: PreTrainedModel, - ): - """Init a Distillation object with config and the teacher model. - - Args: - distillation_config: distillation config. - teacher_model: set the teacher model. - """ - from neural_compressor.experimental import Distillation - assert isinstance(distillation_config, DistillationConfig), \ - "please pass a instance of DistillationConfig to trainer.distill!" - - def train_step(data): - if len(data) == 3: - x, y, sample_weight = data # pragma: no cover - else: - sample_weight = None - x, y = data - with tf.GradientTape() as tape: - y_pred = self.model(x) - teacher_outputs = self.distiller.criterion.teacher_model_forward( - input=x, teacher_model=teacher_model) - - loss = self.model.compute_loss(x, y, y_pred, sample_weight) - # _on_after_compute_loss(self, input, student_output, student_loss, teacher_output=None) - # TODO: check, combile - loss = self.distiller.on_after_compute_loss( - x, y_pred.logits, loss, teacher_outputs.logits) - self.model._validate_target_and_loss(y, loss) - # Run backwards pass. - self.model.optimizer.minimize(loss, - self.model.trainable_variables, - tape=tape) - return self.model.compute_metrics(x, y, y_pred, sample_weight) - - self.model.train_step = train_step - # re-compile - self.model.compile( - optimizer=self.model.optimizer, - loss=self.model.loss, - metrics=self.model.compiled_metrics._user_metrics - ) - - if distillation_config.framework != 'tensorflow': - logger.warning( - 'distillation_config.framework is {}, should be tensorflow'. - format(distillation_config.framework)) - distillation_config.framework = 'tensorflow' - self.distillation_config = distillation_config - self.metrics = self.distillation_config.metrics - self.teacher_model = teacher_model - - distiller = Distillation(self.distillation_config.inc_config) - distiller.model = os.path.join(TMPPATH, "saved_model/1") - distiller.model.model_type = "saved_model" - self.teacher_model.save_pretrained(TEACHERPATH, saved_model=True) - distiller.teacher_model = os.path.join(TEACHERPATH, "saved_model/1") - distiller.teacher_model.model_type = "saved_model" - - self.distiller = distiller - self.component = distiller - return distiller - - def distill( - self, - distillation_config, - teacher_model: PreTrainedModel, - eval_func: Optional[Callable] = None, - train_func: Optional[Callable] = None, - ): - """Do the distillation. - - Args: - distillation_config: distillation config. - teacher_model: set the teacher model. - eval_func: evaluation function. - train_func: train function. - """ - if self.distiller is None: - self.init_distiller( - distillation_config=distillation_config, - teacher_model=teacher_model, - ) - if eval_func is not None: - self._eval_func = eval_func - if train_func is not None: - self._train_func = train_func - else: - self._train_func = self.build_train_func - - self.distiller.eval_func = self._eval_func - self.distiller.train_func = self._train_func - self.distiller.create_criterion() - - opt_model = self.distiller.fit() - opt_model.save(self.args.output_dir) - logger.info( - "distilled model have saved to {}".format(self.args.output_dir) - ) - - return opt_model.model - - def model_builder_builtin(self, arch_paras=None, model_cls=None): - """Specify model_cls to use the built-in model builder. - - Args: - arch_paras: architecture parameters. - model_cls: model information. - """ - config = self.model.config - if arch_paras is not None: - assert isinstance(arch_paras, dict), "Expect arch_paras to be a dict." - for k in arch_paras: - if hasattr(config, k): - config.__setattr__(k, arch_paras[k]) - # for MobileBERT, 'intra_bottleneck_size' is associated with - # 'true_hidden_size', and must have the same values. - if k == 'intra_bottleneck_size': - config.__setattr__('true_hidden_size', arch_paras[k]) - return model_cls.from_config(config) - - def build_train_func(self, model): - """Build the training function for pruning or distillation. - - Args: - model (object): the input model - """ - tf.random.set_seed(1) - epochs = 1 - - component = self.component - prune_model = self.model - model_path = get_filepath(TMPPATH, self.task_type, self.task_id) - - if 'distillation' in self.component.cfg: - epochs = max(epochs, self.component.cfg.distillation.train.get("epoch", 1)) - hooks = self.component.hooks - if 'pruning' in self.component.cfg: - epochs = max(epochs, self.component.cfg.pruning.train.get("epoch", 1)) - callbacks = self.pruner.callbacks - hooks = callbacks['tf_pruning'](self.pruner.model, self.model, - self.pruner.hooks) - - class callback(tf.keras.callbacks.Callback): - def on_train_begin(self, logs=None): - if version.parse(__version__) <= version.parse("1.12"): - hooks['pre_epoch_begin']() # pragma: no cover - else: - hooks['on_train_begin']() - - def on_train_end(self, logs=None): - if version.parse(__version__) <= version.parse("1.12"): - hooks['post_epoch_end']() # pragma: no cover - else: - hooks['on_train_end']() - - def on_epoch_begin(self, epoch, logs=None): - # pylint: disable=E1121 - hooks['on_epoch_begin'](epoch) - - def on_epoch_end(self, epoch, logs=None): - component.model._session = None - prune_model.save_pretrained(model_path, saved_model=True) - component.model = os.path.join(model_path, "saved_model/1") - component.model.model_type = "saved_model" - component.model.sess - hooks['on_epoch_end']() - - # pylint: disable=E1121 - def on_train_batch_begin(self, batch, logs=None): - if version.parse(__version__) <= version.parse("1.12"): - hooks['on_batch_begin'](batch) # pragma: no cover - else: - hooks['on_step_begin'](batch) - - def on_train_batch_end(self, batch, logs=None): - if version.parse(__version__) <= version.parse("1.12"): - hooks['on_batch_end']() # pragma: no cover - else: - hooks['on_step_end']() - - self.model.fit(self.train_dataset, - validation_data=self.eval_dataset, - epochs=epochs, - callbacks=[callback()]) - self.component.model._session = None - self.model.save_pretrained(get_filepath(TMPPATH, self.task_type, self.task_id), saved_model=True) diff --git a/intel_extension_for_transformers/transformers/pruning.py b/intel_extension_for_transformers/transformers/pruning.py deleted file mode 100644 index 9ed8688ebe4..00000000000 --- a/intel_extension_for_transformers/transformers/pruning.py +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Pruning: specify the supported pruning mode.""" - -from packaging import version -from enum import Enum -from neural_compressor.conf.config import Pruner as INCPruner -from typing import Dict, List -from neural_compressor import __version__ as nc_version - - -class PruningMode(Enum): - """Currently support three pruning modes.""" - BASICMAGNITUDE = "basic_magnitude" - PATTERNLOCK = "pattern_lock" - GROUPLASSO = "group_lasso" - - -SUPPORTED_PRUNING_MODE = set([approach.name for approach in PruningMode]) - - -class PrunerConfig(INCPruner): - """Pruner configuration.""" - def __init__(self, epoch_range: List=[0, 4], initial_sparsity_ratio: float=0.0, - target_sparsity_ratio: float=0.97, update_frequency: int=1, - prune_type: str='BasicMagnitude', method: str='per_tensor', - names: List=[], parameters: Dict=None): - """Init the pruner config. - - Args: - epoch_range: A list with length of 2. The first element is the start epoch and the second element - is the end epoch. Pruning will be done from the start epoch to the end epoch. - initial_sparsity_ratio: Initial sparsity goal - target_sparsity_ratio: Target sparsity goal - update_frequency: How many epochs to update once - prune_type: "BasicMagnitude", "PatternLock", or "GroupLasso" - method: TODO (Remove this parameter) - names: A list of layer names that need to be pruned - parameters: A dictionary of extra parameters - """ - if epoch_range is not None: - assert len(epoch_range) == 2, "Please set the epoch_range as [start_epoch, end_epoch]" - self.start_epoch = epoch_range[0] - self.end_epoch = epoch_range[1] - else: # pragma: no cover - self.start_epoch = None - self.end_epoch = None - self.update_frequency = update_frequency - self.target_sparsity = target_sparsity_ratio - self.initial_sparsity = initial_sparsity_ratio - self.update_frequency = update_frequency - assert prune_type.upper() in SUPPORTED_PRUNING_MODE, \ - "prune_type only support {}!".format( - [mode.lower() for mode in SUPPORTED_PRUNING_MODE] - ) - self.prune_type = PruningMode[prune_type.upper()].value - self.method = method - self.names = names - self.parameters = parameters diff --git a/intel_extension_for_transformers/transformers/quantization.py b/intel_extension_for_transformers/transformers/quantization.py index 529abb931f5..d8cc47eaab2 100644 --- a/intel_extension_for_transformers/transformers/quantization.py +++ b/intel_extension_for_transformers/transformers/quantization.py @@ -23,13 +23,3 @@ require_version("neural_compressor>=1.9.0") except: require_version("neural_compressor_full>=1.9.0", "To fix: pip install neural_compressor") - - -class QuantizationMode(Enum): - """Currently support three quantization modes.""" - POSTTRAININGSTATIC = "post_training_static_quant" - POSTTRAININGDYNAMIC = "post_training_dynamic_quant" - QUANTIZATIONAWARETRAINING = "quant_aware_training" - - -SUPPORTED_QUANT_MODE = set([approach.name for approach in QuantizationMode]) From 5eb7617fac5c4911cda974116622e9e341ef0cf7 Mon Sep 17 00:00:00 2001 From: changwangss Date: Mon, 17 Jun 2024 06:02:11 -0700 Subject: [PATCH 13/22] update docs Signed-off-by: changwangss --- docs/distillation.md | 52 ++++++------------- docs/pruning.md | 28 ++++------ .../pruning/basic_magnitude/run_qa.py | 18 ++++--- .../text-classification/pruning/run_glue.py | 20 +++---- .../transformers/config.py | 11 ++-- 5 files changed, 51 insertions(+), 78 deletions(-) diff --git a/docs/distillation.md b/docs/distillation.md index 871bcc73b47..222259f837c 100644 --- a/docs/distillation.md +++ b/docs/distillation.md @@ -49,39 +49,19 @@ Where $D$ is a distance measurement as before, $F_t^{n_i}$ the output feature of ## usage ### Pytorch Script: ```python -from intel_extension_for_transformers.transformers import metric, objectives, DistillationConfig, Criterion + from intel_extension_for_transformers.transformers.trainer import NLPTrainer +from neural_compressor.config import DistillationConfig # Replace transformers.Trainer with NLPTrainer # trainer = transformers.Trainer(......) trainer = NLPTrainer(......) metric = metrics.Metric(name="eval_accuracy") -d_conf = DistillationConfig(metrics=tune_metric) -model = trainer.distill( - distillation_config=d_conf, teacher_model=teacher_model -) +d_conf = DistillationConfig(teacher_model=teacher_model, criterion=criterion) +model = trainer.distill(distillation_config=d_conf) ``` Please refer to [example](../examples/huggingface/pytorch/text-classification/distillation/run_glue.py) for the details. -### Tensorflow Script: -```python -from intel_extension_for_transformers.transformers import (DistillationConfig, metrics) -from intel_extension_for_transformers.transformers.distillation import Criterion - -optimizer = TFOptimization(...) -metric_ = metrics.Metric(name="eval_accuracy") -criterion = Criterion(name='KnowledgeLoss', - layer_mappings=[['classifier', 'classifier']], - loss_types=['CE', 'CE'], - loss_weight_ratio=[0.5, 0.5], - add_origin_loss=False) -distillation_conf = DistillationConfig(metrics=metric_, - criterion=criterion) -distilled_model = optimizer.distill( - distillation_config=distillation_conf, - teacher_model=teacher_model) -``` -Please refer to [example](../examples/huggingface/tensorflow/text-classification/distillation/run_glue.py) for the details. ### Create an Instance of Metric The Metric defines which metric will be used to measure the performance of tuned models. - example: @@ -94,19 +74,23 @@ The Metric defines which metric will be used to measure the performance of tuned ### Create an Instance of Criterion(Optional) The criterion used in training phase. -- arguments: +- KnowledgeDistillationLossConfig arguments: |Argument |Type |Description |Default value | |:----------|:----------|:-----------------------------------------------|:----------------| - |name |String|Name of criterion, like:"KnowledgeLoss", "IntermediateLayersLoss" |"KnowledgeLoss"| |temperature|Float |parameter for KnowledgeDistillationLoss |1.0 | |loss_types|List of string|Type of loss |['CE', 'CE'] | |loss_weight_ratio|List of float|weight ratio of loss |[0.5, 0.5] | + +- IntermediateLayersKnowledgeDistillationLossConfig arguments: + |Argument |Type |Description |Default value | + |:----------|:----------|:-----------------------------------------------|:----------------| + |loss_types|List of string|Type of loss |['CE', 'CE'] | + |loss_weight_ratio|List of float|weight ratio of loss |[0.5, 0.5] | |layer_mappings|List|parameter for IntermediateLayersLoss |[] | |add_origin_loss|bool|parameter for IntermediateLayersLoss |False | - - example: ```python - criterion = Criterion(name='KnowledgeLoss') + criterion = KnowledgeDistillationLossConfig() ``` ### Create an Instance of DistillationConfig @@ -115,20 +99,18 @@ The DistillationConfig contains all the information related to the model distill - arguments: |Argument |Type |Description |Default value | |:----------|:----------|:-----------------------------------------------|:----------------| - |framework |string |which framework you used |"pytorch" | - |criterion|Criterion |criterion of training |"KnowledgeLoss"| - |metrics |Metric |Used to evaluate accuracy of tuning model, no need for NoTrainerOptimizer|None | + |teacher_model |torch.nn.Module | teacher model object |None | + |criterion|Criterion |criterion of training |KnowledgeLoss object| + - example: ```python - d_conf = DistillationConfig(metrics=metric, criterion=criterion) + d_conf = DistillationConfig(teacher_model=teacher_model, criterion=criterion) ``` ### Distill with Trainer - Distill with Trainer NLPTrainer inherits from transformers.Trainer, so you can create a trainer as in examples of Transformers. Then you can distill model with trainer.distill function. ```python - model = trainer.distill( - distillation_config=d_conf, teacher_model=teacher_model - ) + model = trainer.distill(distillation_config=d_conf) ``` diff --git a/docs/pruning.md b/docs/pruning.md index 3e5b46ae136..f7bdfe86cb6 100644 --- a/docs/pruning.md +++ b/docs/pruning.md @@ -45,7 +45,7 @@ The Metric defines which metric will be used to measure the performance of tuned Please refer to [metrics document](metrics.md) for the details. -### Create list of an instance of PrunerConfig(Optional) +### Create an instance of WeightPruningConfig PrunerConfig defines which pruning algorithm to use and how to apply it during the training process. Intel® Extension for Transformers supports pruning types "BasicMagnitude", "PatternLock", and "GroupLasso". You can create different pruners for different layers. - arguments: @@ -60,26 +60,18 @@ PrunerConfig defines which pruning algorithm to use and how to apply it during t |names|list of string|List of weight name to be pruned. If no weight is specified, all weights of the model will be pruned|[]| |parameters|dict of string|The hyper-parameters for pruning, refer to [the link](https://github.com/intel/neural-compressor/blob/master/docs/source/pruning.md)|None| -- example: - ```python - pruner_config = PrunerConfig(prune_type='BasicMagnitude', target_sparsity_ratio=0.9) - ``` - -### Create an instance of PruningConfig -The PruningConfig contains all the information related to the model pruning behavior. If you have created Metric and PrunerConfig instance, then you can create an instance of PruningConfig. Metric and pruner are optional. - -- arguments: - |Argument |Type |Description |Default value | - |:----------|:----------|:-----------------------------------------------|:----------------| - |framework |string |Which framework you used |"pytorch" | - |initial_sparsity_ratio|float |Initial sparsity goal, if pruner_config argument is defined, it didn't need |0.0| - |target_sparsity_ratio|float |Target sparsity goal, if pruner argument is defined, it didn't need |0.97| - |metrics |Metric |Used to evaluate accuracy of tuning model, no need for NoTrainerOptimizer|None | - |pruner_config |PrunerConfig |Defined pruning behavior, if it is None, then NLP will create a default a pruner with 'BasicMagnitude' pruning type |None | +The WeightPruningConfig contains all the information related to the model pruning behavior. If you have created Metric and WeightPruningConfig instance, then you can create an instance of WeightPruningConfig. Metric and pruner are optional. - example: ```python - pruning_conf = PruningConfig(pruner_config=[pruner_config], metrics=tune_metric) + from neural_compressor.config import WeightPruningConfig + + metric = metrics.Metric(name="eval_accuracy") + trainer.metrics = tune_metric + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=0,9, + pruning_scope="local", + pruning_type="magnitude") ``` ### Prune with Trainer diff --git a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_qa.py b/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_qa.py index 35f572aa50c..8a335ce64b3 100644 --- a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_qa.py @@ -26,7 +26,8 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, OptimizedModel, PrunerConfig, PruningConfig, PruningMode +from intel_extension_for_transformers.transformers import metrics, OptimizedModel +from neural_compressor.config import WeightPruningConfig from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -210,8 +211,8 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply prune."}, ) pruning_approach: Optional[str] = field( - default="BasicMagnitude", - metadata={"help": "Pruning approach. Supported approach is basic_magnite."}, + default="magnitude", + metadata={"help": "Pruning approach. Supported approach is magnite."}, ) target_sparsity_ratio: Optional[float] = field( default=None, @@ -631,12 +632,15 @@ def compute_metrics(p: EvalPrediction): raise ValueError("do_train must be set to True for pruning.") tune_metric = metrics.Metric(name=metric_name) - prune_type = 'BasicMagnitude' if optim_args.pruning_approach else optim_args.pruning_approach + prune_type = optim_args.pruning_approach \ + if optim_args.pruning_approach else 'pattern_lock' target_sparsity_ratio = optim_args.target_sparsity_ratio \ if optim_args.target_sparsity_ratio else None - pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio) - pruning_conf = PruningConfig(pruner_config=pruner_config, metrics=tune_metric) - + trainer.metrics = tune_metric + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=target_sparsity_ratio, + pruning_scope="local", + pruning_type=prune_type) model = trainer.prune(pruning_config=pruning_conf) trainer.save_model(training_args.output_dir) diff --git a/examples/huggingface/pytorch/text-classification/pruning/run_glue.py b/examples/huggingface/pytorch/text-classification/pruning/run_glue.py index 9b0f5edd087..bee4f20a070 100644 --- a/examples/huggingface/pytorch/text-classification/pruning/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/pruning/run_glue.py @@ -29,9 +29,8 @@ from intel_extension_for_transformers.transformers import ( metrics, OptimizedModel, - PrunerConfig, - PruningConfig, ) +from neural_compressor.config import WeightPruningConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -47,7 +46,6 @@ ) from transformers.trainer_utils import get_last_checkpoint from transformers.utils import check_min_version -from transformers.utils.fx import symbolic_trace from typing import Optional @@ -204,8 +202,8 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply prune."}, ) pruning_approach: Optional[str] = field( - default="BasicMagnitude", - metadata={"help": "Pruning approach. Supported approach is basic_magnite."}, + default="magnitude", + metadata={"help": "Pruning approach. Supported approach is magnite."}, ) target_sparsity_ratio: Optional[float] = field( default=None, @@ -521,13 +519,15 @@ def compute_metrics(p: EvalPrediction): raise ValueError("do_train must be set to True for pruning.") tune_metric = metrics.Metric(name=metric_name) - prune_type = 'BasicMagnitude' \ - if optim_args.pruning_approach else optim_args.pruning_approach + prune_type = optim_args.pruning_approach \ + if optim_args.pruning_approach else 'pattern_lock' target_sparsity_ratio = optim_args.target_sparsity_ratio \ if optim_args.target_sparsity_ratio else None - pruner_config = PrunerConfig(prune_type=prune_type, target_sparsity_ratio=target_sparsity_ratio) - pruning_conf = PruningConfig(pruner_config=pruner_config, metrics=tune_metric) - + trainer.metrics = tune_metric + pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=target_sparsity_ratio, + pruning_scope="local", + pruning_type=prune_type) model = trainer.prune(pruning_config=pruning_conf) trainer.save_model(training_args.output_dir) diff --git a/intel_extension_for_transformers/transformers/config.py b/intel_extension_for_transformers/transformers/config.py index 8a65234f46e..a0009e7d3ed 100644 --- a/intel_extension_for_transformers/transformers/config.py +++ b/intel_extension_for_transformers/transformers/config.py @@ -18,16 +18,11 @@ import yaml from enum import Enum -from neural_compressor.conf.config import ( - Distillation_Conf, Pruner, Pruning_Conf, Quantization_Conf -) -from neural_compressor.conf.dotdict import DotDict, deep_set + +from neural_compressor.conf.dotdict import DotDict from .utils.metrics import Metric from .utils.objectives import Objective, performance -from .quantization import QuantizationMode, SUPPORTED_QUANT_MODE -from .distillation import ( - Criterion, DistillationCriterionMode, SUPPORTED_DISTILLATION_CRITERION_MODE -) + from typing import List, Union from xmlrpc.client import boolean From 27145c17163ae4e08a7150dcd85b33a977c54357 Mon Sep 17 00:00:00 2001 From: changwangss Date: Mon, 17 Jun 2024 06:29:48 -0700 Subject: [PATCH 14/22] remove code Signed-off-by: changwangss --- docs/distillation.md | 1 + docs/pruning.md | 41 ++++++------------- .../transformers/trainer.py | 3 -- 3 files changed, 14 insertions(+), 31 deletions(-) diff --git a/docs/distillation.md b/docs/distillation.md index 222259f837c..b74c5349f15 100644 --- a/docs/distillation.md +++ b/docs/distillation.md @@ -56,6 +56,7 @@ from neural_compressor.config import DistillationConfig # trainer = transformers.Trainer(......) trainer = NLPTrainer(......) metric = metrics.Metric(name="eval_accuracy") +trainer.metrics = metric d_conf = DistillationConfig(teacher_model=teacher_model, criterion=criterion) model = trainer.distill(distillation_config=d_conf) ``` diff --git a/docs/pruning.md b/docs/pruning.md index f7bdfe86cb6..f5909bb2008 100644 --- a/docs/pruning.md +++ b/docs/pruning.md @@ -7,32 +7,23 @@ Pruning ## Introduction Pruning is the process of removing redundant parameters of a network. The idea bears similarity to the ["optimal brain damage"](http://yann.lecun.com/exdb/publis/pdf/lecun-90b.pdf) hypothesis by Yann LeCun. There are two types of pruning: Unstructured and Structured. Unstructured pruning means finding and removing the less salient connection in the model, the place could be anywhere in the matrix. Structured pruning means deleting entire blocks, filters, or channels. -## Pruning types - -There are three pruning types in Intel® Extension for Transformers: - -- Magnitude (Unstructured) - - The algorithm prunes the weight by the lowest absolute value at each layer with a given sparsity target. - -- Group Lasso (Structured) - - The algorithm uses Group lasso regularization to prune entire rows, columns, or blocks of parameters that result in a smaller dense network. - -- Pattern Lock (Unstructured & Structured) - - The algorithm locks the sparsity pattern in fine tune phase by freezing those zero values of the weight tensor during the weight update of training. - ## Usage ### Script: ```python -from intel_extension_for_transformers.transformers import metrics, objectives, PrunerConfig, PruningConfig, +from intel_extension_for_transformers.transformers import metrics +from neural_compressor.config import WeightPruningConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer # Replace transformers.Trainer with NLPTrainer # trainer = transformers.Trainer(......) trainer = NLPTrainer(......) metric = metrics.Metric(name="eval_accuracy") -pruner_config = PrunerConfig(prune_type='BasicMagnitude', target_sparsity_ratio=0.9) -p_conf = PruningConfig(pruner_config=[pruner_config], metrics=metric) -model = trainer.prune(pruning_config=p_conf) +trainer.metrics = tune_metric +pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], + target_sparsity=0,9, + pruning_scope="local", + pruning_type="magnitude") +model = trainer.prune(pruning_config=pruning_conf) ``` Please refer to [example](../examples/huggingface/pytorch/text-classification/pruning) for the details. @@ -46,28 +37,22 @@ The Metric defines which metric will be used to measure the performance of tuned Please refer to [metrics document](metrics.md) for the details. ### Create an instance of WeightPruningConfig -PrunerConfig defines which pruning algorithm to use and how to apply it during the training process. Intel® Extension for Transformers supports pruning types "BasicMagnitude", "PatternLock", and "GroupLasso". You can create different pruners for different layers. +[WeightPruningConfig](neural-compressor_neural_compressor_config.py at master · intel_neural-compressor.html) defines which pruning algorithm to use and how to apply it during the training process. Intel® Extension for Transformers supports pruning types "magnitude", "pattern_lock", and "GroupLasso". You can create different pruners for different layers. - arguments: |Argument |Type |Description |Default value | |:----------|:----------|:-----------------------------------------------|:----------------| - |epoch_range|list of integer|Which epochs to pruning |[0, 4] | - |initial_sparsity_ratio|float |Initial sparsity goal |0.0 | - |target_sparsity_ratio|float |Target sparsity goal |0.97 | + |pruning_configs |list of dicts|Which epochs to pruning |[{}] | + |target_sparsity |float |Initial sparsity goal |0.90 | |update_frequency|integer|Frequency to updating sparsity |1 | - |prune_type|string|Pruning algorithm |'BasicMagnitude' | - |method|string|Pruning method |'per_tensor' | - |names|list of string|List of weight name to be pruned. If no weight is specified, all weights of the model will be pruned|[]| - |parameters|dict of string|The hyper-parameters for pruning, refer to [the link](https://github.com/intel/neural-compressor/blob/master/docs/source/pruning.md)|None| + |pruning_type |string|Pruning algorithm |'snip_momentum' | + The WeightPruningConfig contains all the information related to the model pruning behavior. If you have created Metric and WeightPruningConfig instance, then you can create an instance of WeightPruningConfig. Metric and pruner are optional. - example: ```python from neural_compressor.config import WeightPruningConfig - - metric = metrics.Metric(name="eval_accuracy") - trainer.metrics = tune_metric pruning_conf = WeightPruningConfig([{"start_step": 0, "end_step": 2}], target_sparsity=0,9, pruning_scope="local", diff --git a/intel_extension_for_transformers/transformers/trainer.py b/intel_extension_for_transformers/transformers/trainer.py index e3899e2a41f..0d14d3843e4 100644 --- a/intel_extension_for_transformers/transformers/trainer.py +++ b/intel_extension_for_transformers/transformers/trainer.py @@ -306,9 +306,6 @@ def quantize( if calib_dataloader is not None: self._calib_dataloader = calib_dataloader - if self.quantizer is None: - self._provider = Provider[provider.upper()].value - if self._provider == Provider.INC.value: return self._inc_quantize(quant_config=quant_config, provider=provider) else: From ad57437b25ed23aa4f7195535ddbbff7a2f9ee4f Mon Sep 17 00:00:00 2001 From: changwangss Date: Mon, 17 Jun 2024 20:00:25 -0700 Subject: [PATCH 15/22] fix import error Signed-off-by: changwangss --- tests/CI/test_quantization.py | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/tests/CI/test_quantization.py b/tests/CI/test_quantization.py index dce618d7845..60b0719a56b 100644 --- a/tests/CI/test_quantization.py +++ b/tests/CI/test_quantization.py @@ -24,7 +24,6 @@ from intel_extension_for_transformers.transformers import ( metrics, OptimizedModel, - NoTrainerOptimizer, ) from neural_compressor.config import ( PostTrainingQuantConfig, @@ -96,7 +95,6 @@ def setUpClass(self): train_dataset=self.dummy_dataset, eval_dataset=self.dummy_dataset, ) - self.optimizer = NoTrainerOptimizer(self.model) @classmethod def tearDownClass(self): @@ -165,25 +163,6 @@ def train_func(model): train_func = train_func, eval_func = eval_func,) - def test_no_trainer_quant(self): - def eval_func(model): - return 1 - - def train_func(model): - return model - - quantization_config = PostTrainingQuantConfig( - approach='static', - ) - self.optimizer.eval_func = eval_func - self.optimizer.train_func = train_func - self.optimizer.provider = "INC" - self.optimizer.calib_dataloader = self.trainer.get_eval_dataloader() - - opt_model = self.optimizer.quantize(quant_config=quantization_config, - provider="inc", - train_func = train_func, - eval_func = eval_func) def test_online_models(self): model = OptimizedModel.from_pretrained( From 8f0b4381de8ff47a99c8a2d3bc6e94d05fc4e0b5 Mon Sep 17 00:00:00 2001 From: changwangss Date: Mon, 17 Jun 2024 21:43:47 -0700 Subject: [PATCH 16/22] fix ut Signed-off-by: changwangss --- tests/CI/test_quantization.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/CI/test_quantization.py b/tests/CI/test_quantization.py index 60b0719a56b..7f5911855cb 100644 --- a/tests/CI/test_quantization.py +++ b/tests/CI/test_quantization.py @@ -119,7 +119,10 @@ def test_fx_model_quant(self): self.assertTrue(check_onnx('fp32-model.onnx', self.trainer.get_eval_dataloader())) self.trainer.benchmark(num_of_instance=1) - + tune_metric = metrics.Metric( + name="eval_loss", greater_is_better=False, is_relative=False, criterion=0.5 + ) + self.trainer.metrics = tune_metric quantization_config = PostTrainingQuantConfig( approach="static", ) @@ -155,6 +158,10 @@ def train_func(model): return model self.trainer = NLPTrainer(self.model, train_dataset=self.dummy_dataset) + tune_metric = metrics.Metric( + name="eval_loss", greater_is_better=False, is_relative=False, criterion=0.5 + ) + self.trainer.metrics = tune_metric quantization_config = PostTrainingQuantConfig( approach='static', ) From 01649dd5448e6761438d15c8b58700763fe14a4a Mon Sep 17 00:00:00 2001 From: changwangss Date: Tue, 18 Jun 2024 22:46:04 -0700 Subject: [PATCH 17/22] adapt datasets 2.20.0 Signed-off-by: changwangss --- .../pytorch/language-modeling/quantization/run_tuning.sh | 9 ++++++--- .../pytorch/multiple-choice/quantization/run_tuning.sh | 6 ++++-- .../pytorch/question-answering/quantization/run_qa.py | 9 ++++++--- .../question-answering/quantization/run_tuning.sh | 3 ++- .../pytorch/token-classification/quantization/run_ner.py | 8 +++++--- .../token-classification/quantization/run_tuning.sh | 3 ++- .../pytorch/translation/quantization/run_translation.py | 4 +++- 7 files changed, 28 insertions(+), 14 deletions(-) diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh b/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh index 72ac556a30d..b693be23b0c 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh @@ -83,7 +83,8 @@ function run_tuning { --load_best_model_at_end True \ --evaluation_strategy steps \ --save_strategy steps \ - --save_total_limit 1" + --save_total_limit 1 \ + --safe_serialization False" fi elif [ "${topology}" = "gpt_j" ]; then if [ "${task}" = "clm" ]; then @@ -119,7 +120,8 @@ function run_tuning { --evaluation_strategy steps \ --save_strategy steps \ --metric_for_best_model accuracy \ - --save_total_limit 1" + --save_total_limit 1 \ + --safe_serialization False" fi elif [ "${topology}" = "xlnet" ]; then if [ "${task}" = "plm" ]; then @@ -143,7 +145,8 @@ function run_tuning { --evaluation_strategy steps \ --save_strategy steps \ --metric_for_best_model accuracy \ - --save_total_limit 1" + --save_total_limit 1 \ + --safe_serialization False" fi elif [ "${topology}" = "gpt_neox" ]; then if [ "${task}" = "clm" ]; then diff --git a/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh b/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh index e70d28359d7..430d403c1d4 100644 --- a/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh @@ -56,7 +56,8 @@ function run_tuning { --load_best_model_at_end True \ --evaluation_strategy steps \ --save_strategy steps \ - --save_total_limit 1" + --save_total_limit 1 \ + --safe_serialization False" fi python -u ./run_swag.py \ @@ -72,7 +73,8 @@ function run_tuning { --tune \ --pad_to_max_length \ --overwrite_cache \ - --overwrite_output_dir + --overwrite_output_dir \ + ${extra_cmd} } main "$@" diff --git a/examples/huggingface/pytorch/question-answering/quantization/run_qa.py b/examples/huggingface/pytorch/question-answering/quantization/run_qa.py index 03be8e166fc..6f7bebfaa76 100644 --- a/examples/huggingface/pytorch/question-answering/quantization/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/quantization/run_qa.py @@ -326,10 +326,12 @@ def main(): # # In distributed training, the load_dataset function guarantee that only one local process can concurrently # download the dataset. + if data_args.dataset_name is not None: # Downloading and loading a dataset from the hub. raw_datasets = load_dataset( - data_args.dataset_name, data_args.dataset_config_name, cache_dir=model_args.cache_dir + data_args.dataset_name, data_args.dataset_config_name, cache_dir=model_args.cache_dir, + trust_remote_code=True ) else: data_files = {} @@ -343,7 +345,8 @@ def main(): if data_args.test_file is not None: data_files["test"] = data_args.test_file extension = data_args.test_file.split(".")[-1] - raw_datasets = load_dataset(extension, data_files=data_files, field="data", cache_dir=model_args.cache_dir) + raw_datasets = load_dataset(extension, data_files=data_files, field="data", cache_dir=model_args.cache_dir, + trust_remote_code=True) # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at # https://huggingface.co/docs/datasets/loading_datasets.html. @@ -633,7 +636,7 @@ def post_processing_function(examples, features, predictions, stage="eval"): references = [{"id": ex["id"], "answers": ex[answer_column_name]} for ex in examples] return EvalPrediction(predictions=formatted_predictions, label_ids=references) - metric = load_metric("squad_v2" if data_args.version_2_with_negative else "squad") + metric = load_metric("squad_v2" if data_args.version_2_with_negative else "squad", trust_remote_code=True) def compute_metrics(p: EvalPrediction): return metric.compute(predictions=p.predictions, references=p.label_ids) diff --git a/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh b/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh index 13d02db5d17..8930936be2d 100644 --- a/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh @@ -69,7 +69,8 @@ function run_tuning { --load_best_model_at_end True \ --evaluation_strategy steps \ --save_strategy steps \ - --save_total_limit 1" + --save_total_limit 1 \ + --safe_serialization False" elif [ "${topology}" = "bert_large_SQuAD_static" ]; then DATASET_NAME="squad" model_name_or_path="bert-large-uncased-whole-word-masking-finetuned-squad" diff --git a/examples/huggingface/pytorch/token-classification/quantization/run_ner.py b/examples/huggingface/pytorch/token-classification/quantization/run_ner.py index 1b2a187d3f0..d83ae181630 100644 --- a/examples/huggingface/pytorch/token-classification/quantization/run_ner.py +++ b/examples/huggingface/pytorch/token-classification/quantization/run_ner.py @@ -301,7 +301,8 @@ def main(): if data_args.dataset_name is not None: # Downloading and loading a dataset from the hub. raw_datasets = load_dataset( - data_args.dataset_name, data_args.dataset_config_name, cache_dir=model_args.cache_dir + data_args.dataset_name, data_args.dataset_config_name, cache_dir=model_args.cache_dir, + trust_remote_code=True ) else: data_files = {} @@ -312,7 +313,8 @@ def main(): if data_args.test_file is not None: data_files["test"] = data_args.test_file extension = data_args.train_file.split(".")[-1] - raw_datasets = load_dataset(extension, data_files=data_files, cache_dir=model_args.cache_dir) + raw_datasets = load_dataset(extension, data_files=data_files, cache_dir=model_args.cache_dir, + trust_remote_code=True) # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at # https://huggingface.co/docs/datasets/loading_datasets.html. @@ -538,7 +540,7 @@ def tokenize_and_align_labels(examples): data_collator = DataCollatorForTokenClassification(tokenizer, pad_to_multiple_of=8 if training_args.fp16 else None) # Metrics - metric = load_metric("seqeval") + metric = load_metric("seqeval", trust_remote_code=True) def compute_metrics(p): predictions, labels = p diff --git a/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh b/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh index a5194758ca6..5a8ced4ea90 100644 --- a/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh @@ -68,7 +68,8 @@ function run_tuning { --load_best_model_at_end True \ --evaluation_strategy steps \ --save_strategy steps \ - --save_total_limit 1" + --save_total_limit 1 \ + --safe_serialization False" fi python -u ./run_ner.py \ diff --git a/examples/huggingface/pytorch/translation/quantization/run_translation.py b/examples/huggingface/pytorch/translation/quantization/run_translation.py index 00d5cf56319..4d02698d21a 100755 --- a/examples/huggingface/pytorch/translation/quantization/run_translation.py +++ b/examples/huggingface/pytorch/translation/quantization/run_translation.py @@ -367,6 +367,7 @@ def main(): data_args.dataset_config_name, cache_dir=model_args.cache_dir, use_auth_token=True if model_args.use_auth_token else None, + trust_remote_code=True, ) else: data_files = {} @@ -384,6 +385,7 @@ def main(): data_files=data_files, cache_dir=model_args.cache_dir, use_auth_token=True if model_args.use_auth_token else None, + trust_remote_code=True, ) # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at # https://huggingface.co/docs/datasets/loading_datasets.html. @@ -570,7 +572,7 @@ def preprocess_function(examples): ) # Metric - metric = load_metric("sacrebleu") + metric = load_metric("sacrebleu", trust_remote_code=True) def postprocess_text(preds, labels): preds = [pred.strip() for pred in preds] From dcf33695d1019765700718e9624271a6dbe91e02 Mon Sep 17 00:00:00 2001 From: changwangss Date: Wed, 19 Jun 2024 05:22:28 -0700 Subject: [PATCH 18/22] fix typo Signed-off-by: changwangss --- docs/quantization.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/quantization.md b/docs/quantization.md index d3d1b0ea70e..1c9cda3250d 100644 --- a/docs/quantization.md +++ b/docs/quantization.md @@ -134,12 +134,12 @@ Quantization methods include the following three types: ## Get Started ### Script: ```python -from neural_compressor.config import PostTrainingConfig +from neural_compressor.config import PostTrainingQuantConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer # Replace transformers.Trainer with NLPTrainer # trainer = transformers.Trainer(......) trainer = NLPTrainer(......) -q_config = PostTrainingConfig( +q_config = PostTrainingQuantConfig( approach="static" ) model = trainer.quantize(quant_config=q_config) From f1453680bac824a94249e78084e1c7be0d36d496 Mon Sep 17 00:00:00 2001 From: changwangss Date: Thu, 20 Jun 2024 00:53:39 -0700 Subject: [PATCH 19/22] fix qat commands Signed-off-by: changwangss --- docs/api_doc/optimization/optimizer.rst | 7 - docs/devcatalog.md | 7 +- docs/get_started.md | 10 +- docs/quantization.md | 10 +- ...d-whole-word-masking-finetuned-squad.ipynb | 7 +- .../quantization/run_tuning.sh | 6 +- .../quantization/run_tuning.sh | 2 +- .../pruning/group_lasso/README.md | 68 - .../pruning/group_lasso/bert_config.json | 13 - .../pruning/group_lasso/extract_features.py | 298 --- .../pruning/group_lasso/file_utils.py | 263 -- .../pruning/group_lasso/modeling.py | 1285 ---------- .../pruning/group_lasso/optimization.py | 174 -- .../pruning/group_lasso/requirements.txt | 18 - .../pruning/group_lasso/run_squad_sparse.py | 1285 ---------- .../pruning/group_lasso/schedulers.py | 131 - .../group_lasso/scripts/run_squad_sparse.sh | 117 - .../pruning/group_lasso/tokenization.py | 392 --- .../pruning/group_lasso/utils.py | 65 - .../pruning/longformer_triviaqa/README.md | 52 - .../modeling_longformer.py | 2282 ----------------- .../longformer_triviaqa/requirements.txt | 5 - .../longformer_triviaqa/run_qa_no_trainer.py | 1305 ---------- .../scripts/download_data_and_convert.sh | 19 - .../scripts/longformer_base_dense_fintune.sh | 23 - ...ngformer_base_sparse_global_4x1_pruning.sh | 32 - .../pruning/longformer_triviaqa/squad.py | 144 -- .../pruning/longformer_triviaqa/trainer_qa.py | 150 -- .../longformer_triviaqa/utils/__init__.py | 0 .../utils/convert_to_squad_format.py | 143 -- .../utils/dataset_utils.py | 75 - .../longformer_triviaqa/utils/file_utils.py | 38 - .../pruning/longformer_triviaqa/utils_qa.py | 451 ---- .../{basic_magnitude => magnitude}/README.md | 0 .../requirements.txt | 0 .../run_benchmark.sh | 0 .../{basic_magnitude => magnitude}/run_qa.py | 2 +- .../run_tuning.sh | 0 .../trainer_qa.py | 0 .../utils_qa.py | 0 .../quantization/run_tuning.sh | 2 +- .../quantization/run_glue_no_trainer.py | 575 ----- .../quantization/ptq/run_diffusion.py | 8 +- .../quantization/run_tuning.sh | 2 +- .../transformers/trainer.py | 2 +- .../src/finetune_itrex.py | 3 - 46 files changed, 26 insertions(+), 9445 deletions(-) delete mode 100644 docs/api_doc/optimization/optimizer.rst delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/README.md delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/bert_config.json delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/extract_features.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/file_utils.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/modeling.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/optimization.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/requirements.txt delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/run_squad_sparse.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/schedulers.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/scripts/run_squad_sparse.sh delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/tokenization.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/group_lasso/utils.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/README.md delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/modeling_longformer.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/requirements.txt delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/run_qa_no_trainer.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/download_data_and_convert.sh delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/longformer_base_dense_fintune.sh delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/longformer_base_sparse_global_4x1_pruning.sh delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/squad.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/trainer_qa.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/__init__.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/convert_to_squad_format.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/dataset_utils.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/file_utils.py delete mode 100644 examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils_qa.py rename examples/huggingface/pytorch/question-answering/pruning/{basic_magnitude => magnitude}/README.md (100%) rename examples/huggingface/pytorch/question-answering/pruning/{basic_magnitude => magnitude}/requirements.txt (100%) rename examples/huggingface/pytorch/question-answering/pruning/{basic_magnitude => magnitude}/run_benchmark.sh (100%) rename examples/huggingface/pytorch/question-answering/pruning/{basic_magnitude => magnitude}/run_qa.py (99%) rename examples/huggingface/pytorch/question-answering/pruning/{basic_magnitude => magnitude}/run_tuning.sh (100%) rename examples/huggingface/pytorch/question-answering/pruning/{basic_magnitude => magnitude}/trainer_qa.py (100%) rename examples/huggingface/pytorch/question-answering/pruning/{basic_magnitude => magnitude}/utils_qa.py (100%) delete mode 100644 examples/huggingface/pytorch/text-classification/quantization/run_glue_no_trainer.py diff --git a/docs/api_doc/optimization/optimizer.rst b/docs/api_doc/optimization/optimizer.rst deleted file mode 100644 index f4b31c471b9..00000000000 --- a/docs/api_doc/optimization/optimizer.rst +++ /dev/null @@ -1,7 +0,0 @@ -PyTorch Optimizer -============== - -.. autoapisummary:: - - intel_extension_for_transformers.transformers.optimizer.NoTrainerOptimizer - intel_extension_for_transformers.transformers.optimizer.Orchestrate_optimizer diff --git a/docs/devcatalog.md b/docs/devcatalog.md index ab826d913d1..30f371489b2 100644 --- a/docs/devcatalog.md +++ b/docs/devcatalog.md @@ -99,7 +99,8 @@ raw_datasets = raw_datasets.map(lambda e: tokenizer(e['sentence'], truncation=Tr Documentation for API usage can be found [here](https://github.com/intel/intel-extension-for-transformers/tree/main/docs) ```python -from intel_extension_for_transformers.transformers import QuantizationConfig, metrics, objectives +from intel_extension_for_transformers.transformers import metrics, objectives +from neural_compressor.config import PostTrainingQuantConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer # load config, model and metric config = AutoConfig.from_pretrained("distilbert-base-uncased-finetuned-sst-2-english",num_labels=2) @@ -120,7 +121,9 @@ trainer = NLPTrainer(model=model, tokenizer=tokenizer ) # model quantization using trainer -q_config = QuantizationConfig(metrics=[metrics.Metric(name="eval_accuracy")]) +tune_metric = metrics.Metric(name="eval_accuracy") +trainer.metrics = tune_metric +q_config = PostTrainingQuantConfig() model = trainer.quantize(quant_config=q_config) # test sentiment analysis with quantization diff --git a/docs/get_started.md b/docs/get_started.md index 62a603097a9..ea807226f03 100644 --- a/docs/get_started.md +++ b/docs/get_started.md @@ -75,17 +75,17 @@ model = trainer.distill(distillation_config=d_conf, teacher_model=teacher_model) ## Quantized Length Adaptive Transformer Quantized Length Adaptive Transformer leverages sequence-length reduction and low-bit representation techniques to further enhance model inference performance, enabling adaptive sequence-length sizes to accommodate different computational budget requirements with an optimal accuracy efficiency tradeoff. ```python -from intel_extension_for_transformers.transformers import QuantizationConfig, DynamicLengthConfig, metric, objectives +from intel_extension_for_transformers.transformers import DynamicLengthConfig, metric, objectives +from neural_compressor.config import PostTrainingQuantConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer # Replace transformers.Trainer with NLPTrainer # trainer = transformers.Trainer(...) trainer = NLPTrainer(...) metric = metrics.Metric(name="eval_f1", is_relative=True, criterion=0.01) -q_config = QuantizationConfig( - approach="static", - metrics=[metric], - objectives=[objectives.performance] +trainer.metrics = metric +q_config = PostTrainingQuantConfig( + approach="static" ) # Apply the length config dynamic_length_config = DynamicLengthConfig(length_config=length_config) diff --git a/docs/quantization.md b/docs/quantization.md index 1c9cda3250d..93e621a0db9 100644 --- a/docs/quantization.md +++ b/docs/quantization.md @@ -157,16 +157,8 @@ In terms of evaluating the status of a specific model during tuning, we should h Please refer to [objective document](objectives.md) for the details. ### Create an Instance of QuantizationConfig -The QuantizationConfig contains all the information related to the model quantization behavior. If you have created Metric and Objective instance(default Objective is "performance"), then you can create an instance of QuantizationConfig. +The QuantizationConfig contains all the information related to the model quantization behavior. If you have created Metric and Objective instance(default Objective is "performance"), then you can create an instance of PostTrainingQuantConfig or QuantizationAwareTrainingConfig. -- arguments: - -|Argument |Type |Description |Default value | -|:----------|:----------|:-----------------------------------------------|:----------------| -|approach |string |Which quantization approach you used |"static"| -|timeout |integer |Tuning timeout(seconds), 0 means early stop; combine with max_trials field to decide when to exit|0 | -|max_trials |integer |Max tune times |100 | -|objective |list of Objective|Objective with accuracy constraint guaranteed|performance| - example: ```python diff --git a/docs/tutorials/pytorch/question-answering/bert-large-uncased-whole-word-masking-finetuned-squad.ipynb b/docs/tutorials/pytorch/question-answering/bert-large-uncased-whole-word-masking-finetuned-squad.ipynb index 53c79e94b89..3914a427e34 100644 --- a/docs/tutorials/pytorch/question-answering/bert-large-uncased-whole-word-masking-finetuned-squad.ipynb +++ b/docs/tutorials/pytorch/question-answering/bert-large-uncased-whole-word-masking-finetuned-squad.ipynb @@ -1000,10 +1000,9 @@ " is_relative=True, # Metric tolerance mode, True is for relative, otherwise for absolute.\n", " criterion=0.25, # Performance tolerance when optimizing the model.\n", ")\n", - "quantization_config = QuantizationConfig(\n", - " approach=\"static\",\n", - " max_trials=200,\n", - " metrics=[tune_metric],\n", + "trainer_static.metrics = tune_metric\n", + "quantization_config = PostTrainingQuantConfig(\n", + " approach=\"static\"\n", ")\n", "\n", "# run quantization\n", diff --git a/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh b/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh index b693be23b0c..18a709a59e7 100644 --- a/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/language-modeling/quantization/run_tuning.sh @@ -84,7 +84,7 @@ function run_tuning { --evaluation_strategy steps \ --save_strategy steps \ --save_total_limit 1 \ - --safe_serialization False" + --save_safetensors False" fi elif [ "${topology}" = "gpt_j" ]; then if [ "${task}" = "clm" ]; then @@ -121,7 +121,7 @@ function run_tuning { --save_strategy steps \ --metric_for_best_model accuracy \ --save_total_limit 1 \ - --safe_serialization False" + --save_safetensors False" fi elif [ "${topology}" = "xlnet" ]; then if [ "${task}" = "plm" ]; then @@ -146,7 +146,7 @@ function run_tuning { --save_strategy steps \ --metric_for_best_model accuracy \ --save_total_limit 1 \ - --safe_serialization False" + --save_safetensors False" fi elif [ "${topology}" = "gpt_neox" ]; then if [ "${task}" = "clm" ]; then diff --git a/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh b/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh index 430d403c1d4..b8123802f38 100644 --- a/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/multiple-choice/quantization/run_tuning.sh @@ -57,7 +57,7 @@ function run_tuning { --evaluation_strategy steps \ --save_strategy steps \ --save_total_limit 1 \ - --safe_serialization False" + --save_safetensors False" fi python -u ./run_swag.py \ diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/README.md b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/README.md deleted file mode 100644 index f7054bf95fa..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/README.md +++ /dev/null @@ -1,68 +0,0 @@ -Step-by-Step -============ - -This document is used to list steps of reproducing PyTorch BERT pruning result. - -# Prerequisite - -## 1. Environment - -Recommend python 3.7 or higher version. - -### Install [intel-extension-for-transformers]() -``` -pip install intel-extension-for-transformers -``` - -### Install PyTorch - -Install pytorch-gpu, visit [pytorch.org](https://pytorch.org/). -```bash -# Install pytorch -pip3 install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio==0.10.0+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html -``` - -### Install BERT dependency - -```bash -cd examples/pytorch/huggingface/question-answering/pruning/group_lasso -pip3 install -r requirements.txt --ignore-installed PyYAML -``` -```bash -git clone https://github.com/NVIDIA/apex -cd apex -pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./ -``` -> **Note** -> -> If no CUDA runtime is found, please export CUDA_HOME='/usr/local/cuda'. - -## 2. Prepare Dataset - -* For SQuAD task, you should download SQuAD dataset from [SQuAD dataset link](https://rajpurkar.github.io/SQuAD-explorer/). -## 3. Prepare Model -* Please download BERT large pretrained model from [NGC](https://catalog.ngc.nvidia.com/orgs/nvidia/models/bert_pyt_ckpt_large_pretraining_amp_lamb/files?version=20.03.0). -```bash -# wget cmd -wget https://api.ngc.nvidia.com/v2/models/nvidia/bert_pyt_ckpt_large_pretraining_amp_lamb/versions/20.03.0/files/bert_large_pretrained_amp.pt - -# curl cmd -curl -LO https://api.ngc.nvidia.com/v2/models/nvidia/bert_pyt_ckpt_large_pretraining_amp_lamb/versions/20.03.0/files/bert_large_pretrained_amp.pt -``` -# Run -Enter your created conda env, then run the script. -```bash -bash scripts/run_squad_sparse.sh /path/to/model.pt 2.0 16 5e-5 tf32 /path/to/data /path/to/outdir prune_bert.yaml -``` -The default parameters are as follows: -```shell -init_checkpoint=${1:-"/path/to/ckpt_8601.pt"} -epochs=${2:-"2.0"} -batch_size=${3:-"4"} -learning_rate=${4:-"3e-5"} -precision=${5:-"tf32"} -BERT_PREP_WORKING_DIR=${6:-'/path/to/bert_data'} -OUT_DIR=${7:-"./results/SQuAD"} -prune_config=${8:-"prune_bert.yaml"} -``` - >**Note**: For original BERT readme, please refer [BERT README](https://github.com/NVIDIA/DeepLearningExamples/blob/master/PyTorch/LanguageModeling/BERT/README.md) diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/bert_config.json b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/bert_config.json deleted file mode 100644 index a7efa973d74..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/bert_config.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "attention_probs_dropout_prob": 0.1, - "hidden_act": "gelu", - "hidden_dropout_prob": 0.1, - "hidden_size": 1024, - "initializer_range": 0.02, - "intermediate_size": 4096, - "max_position_embeddings": 512, - "num_attention_heads": 16, - "num_hidden_layers": 24, - "type_vocab_size": 2, - "vocab_size": 30522 -} diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/extract_features.py b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/extract_features.py deleted file mode 100644 index dd206f52221..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/extract_features.py +++ /dev/null @@ -1,298 +0,0 @@ -# coding=utf-8 -# Copyright 2018 The Google AI Language Team Authors and The HugginFace Inc. team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Extract pre-computed feature vectors from a PyTorch BERT model.""" - -from __future__ import absolute_import -from __future__ import division -from __future__ import print_function - -import argparse -import collections -import logging -import json -import re - -import torch -from torch.utils.data import TensorDataset, DataLoader, SequentialSampler -from torch.utils.data.distributed import DistributedSampler - -from tokenization import BertTokenizer -from modeling import BertModel - -logging.basicConfig(format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s', - datefmt = '%m/%d/%Y %H:%M:%S', - level = logging.INFO) -logger = logging.getLogger(__name__) - - -class InputExample(object): - - def __init__(self, unique_id, text_a, text_b): - self.unique_id = unique_id - self.text_a = text_a - self.text_b = text_b - - -class InputFeatures(object): - """A single set of features of data.""" - - def __init__(self, unique_id, tokens, input_ids, input_mask, input_type_ids): - self.unique_id = unique_id - self.tokens = tokens - self.input_ids = input_ids - self.input_mask = input_mask - self.input_type_ids = input_type_ids - - -def convert_examples_to_features(examples, seq_length, tokenizer): - """Loads a data file into a list of `InputBatch`s.""" - - features = [] - for (ex_index, example) in enumerate(examples): - tokens_a = tokenizer.tokenize(example.text_a) - - tokens_b = None - if example.text_b: - tokens_b = tokenizer.tokenize(example.text_b) - - if tokens_b: - # Modifies `tokens_a` and `tokens_b` in place so that the total - # length is less than the specified length. - # Account for [CLS], [SEP], [SEP] with "- 3" - _truncate_seq_pair(tokens_a, tokens_b, seq_length - 3) - else: - # Account for [CLS] and [SEP] with "- 2" - if len(tokens_a) > seq_length - 2: - tokens_a = tokens_a[0:(seq_length - 2)] - - # The convention in BERT is: - # (a) For sequence pairs: - # tokens: [CLS] is this jack ##son ##ville ? [SEP] no it is not . [SEP] - # type_ids: 0 0 0 0 0 0 0 0 1 1 1 1 1 1 - # (b) For single sequences: - # tokens: [CLS] the dog is hairy . [SEP] - # type_ids: 0 0 0 0 0 0 0 - # - # Where "type_ids" are used to indicate whether this is the first - # sequence or the second sequence. The embedding vectors for `type=0` and - # `type=1` were learned during pre-training and are added to the wordpiece - # embedding vector (and position vector). This is not *strictly* necessary - # since the [SEP] token unambiguously separates the sequences, but it makes - # it easier for the model to learn the concept of sequences. - # - # For classification tasks, the first vector (corresponding to [CLS]) is - # used as as the "sentence vector". Note that this only makes sense because - # the entire model is fine-tuned. - tokens = [] - input_type_ids = [] - tokens.append("[CLS]") - input_type_ids.append(0) - for token in tokens_a: - tokens.append(token) - input_type_ids.append(0) - tokens.append("[SEP]") - input_type_ids.append(0) - - if tokens_b: - for token in tokens_b: - tokens.append(token) - input_type_ids.append(1) - tokens.append("[SEP]") - input_type_ids.append(1) - - input_ids = tokenizer.convert_tokens_to_ids(tokens) - - # The mask has 1 for real tokens and 0 for padding tokens. Only real - # tokens are attended to. - input_mask = [1] * len(input_ids) - - # Zero-pad up to the sequence length. - while len(input_ids) < seq_length: - input_ids.append(0) - input_mask.append(0) - input_type_ids.append(0) - - assert len(input_ids) == seq_length - assert len(input_mask) == seq_length - assert len(input_type_ids) == seq_length - - if ex_index < 5: - logger.info("*** Example ***") - logger.info("unique_id: %s" % (example.unique_id)) - logger.info("tokens: %s" % " ".join([str(x) for x in tokens])) - logger.info("input_ids: %s" % " ".join([str(x) for x in input_ids])) - logger.info("input_mask: %s" % " ".join([str(x) for x in input_mask])) - logger.info( - "input_type_ids: %s" % " ".join([str(x) for x in input_type_ids])) - - features.append( - InputFeatures( - unique_id=example.unique_id, - tokens=tokens, - input_ids=input_ids, - input_mask=input_mask, - input_type_ids=input_type_ids)) - return features - - -def _truncate_seq_pair(tokens_a, tokens_b, max_length): - """Truncates a sequence pair in place to the maximum length.""" - - # This is a simple heuristic which will always truncate the longer sequence - # one token at a time. This makes more sense than truncating an equal percent - # of tokens from each, since if one sequence is very short then each token - # that's truncated likely contains more information than a longer sequence. - while True: - total_length = len(tokens_a) + len(tokens_b) - if total_length <= max_length: - break - if len(tokens_a) > len(tokens_b): - tokens_a.pop() - else: - tokens_b.pop() - - -def read_examples(input_file): - """Read a list of `InputExample`s from an input file.""" - examples = [] - unique_id = 0 - with open(input_file, "r", encoding='utf-8') as reader: - while True: - line = reader.readline() - if not line: - break - line = line.strip() - text_a = None - text_b = None - m = re.match(r"^(.*) \|\|\| (.*)$", line) - if m is None: - text_a = line - else: - text_a = m.group(1) - text_b = m.group(2) - examples.append( - InputExample(unique_id=unique_id, text_a=text_a, text_b=text_b)) - unique_id += 1 - return examples - - -def main(): - parser = argparse.ArgumentParser() - - ## Required parameters - parser.add_argument("--input_file", default=None, type=str, required=True) - parser.add_argument("--output_file", default=None, type=str, required=True) - parser.add_argument("--bert_model", default=None, type=str, required=True, - help="Bert pre-trained model selected in the list: bert-base-uncased, " - "bert-large-uncased, bert-base-cased, bert-base-multilingual, bert-base-chinese.") - - ## Other parameters - parser.add_argument("--do_lower_case", action='store_true', help="Set this flag if you are using an uncased model.") - parser.add_argument("--layers", default="-1,-2,-3,-4", type=str) - parser.add_argument("--max_seq_length", default=128, type=int, - help="The maximum total input sequence length after WordPiece tokenization. Sequences longer " - "than this will be truncated, and sequences shorter than this will be padded.") - parser.add_argument("--batch_size", default=32, type=int, help="Batch size for predictions.") - parser.add_argument("--local_rank", - type=int, - default=-1, - help = "local_rank for distributed training on gpus") - parser.add_argument("--no_cuda", - action='store_true', - help="Whether not to use CUDA when available") - - args = parser.parse_args() - - if args.local_rank == -1 or args.no_cuda: - device = torch.device("cuda" if torch.cuda.is_available() and not args.no_cuda else "cpu") - n_gpu = torch.cuda.device_count() - else: - device = torch.device("cuda", args.local_rank) - n_gpu = 1 - # Initializes the distributed backend which will take care of synchronizing nodes/GPUs - torch.distributed.init_process_group(backend='nccl') - logger.info("device: {} n_gpu: {} distributed training: {}".format(device, n_gpu, bool(args.local_rank != -1))) - - layer_indexes = [int(x) for x in args.layers.split(",")] - - tokenizer = BertTokenizer.from_pretrained(args.bert_model, do_lower_case=args.do_lower_case) - - examples = read_examples(args.input_file) - - features = convert_examples_to_features( - examples=examples, seq_length=args.max_seq_length, tokenizer=tokenizer) - - unique_id_to_feature = {} - for feature in features: - unique_id_to_feature[feature.unique_id] = feature - - model = BertModel.from_pretrained(args.bert_model) - model.to(device) - - if args.local_rank != -1: - model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank], - output_device=args.local_rank) - elif n_gpu > 1: - model = torch.nn.DataParallel(model) - - all_input_ids = torch.tensor([f.input_ids for f in features], dtype=torch.long) - all_input_mask = torch.tensor([f.input_mask for f in features], dtype=torch.long) - all_example_index = torch.arange(all_input_ids.size(0), dtype=torch.long) - - eval_data = TensorDataset(all_input_ids, all_input_mask, all_example_index) - if args.local_rank == -1: - eval_sampler = SequentialSampler(eval_data) - else: - eval_sampler = DistributedSampler(eval_data) - eval_dataloader = DataLoader(eval_data, sampler=eval_sampler, batch_size=args.batch_size) - - model.eval() - with open(args.output_file, "w", encoding='utf-8') as writer: - for input_ids, input_mask, example_indices in eval_dataloader: - input_ids = input_ids.to(device) - input_mask = input_mask.to(device) - - all_encoder_layers, _ = model(input_ids, token_type_ids=None, attention_mask=input_mask) - all_encoder_layers = all_encoder_layers - - for b, example_index in enumerate(example_indices): - feature = features[example_index.item()] - unique_id = int(feature.unique_id) - # feature = unique_id_to_feature[unique_id] - output_json = collections.OrderedDict() - output_json["linex_index"] = unique_id - all_out_features = [] - for (i, token) in enumerate(feature.tokens): - all_layers = [] - for (j, layer_index) in enumerate(layer_indexes): - layer_output = all_encoder_layers[int(layer_index)].detach().cpu().numpy() - layer_output = layer_output[b] - layers = collections.OrderedDict() - layers["index"] = layer_index - layers["values"] = [ - round(x.item(), 6) for x in layer_output[i] - ] - all_layers.append(layers) - out_features = collections.OrderedDict() - out_features["token"] = token - out_features["layers"] = all_layers - all_out_features.append(out_features) - output_json["features"] = all_out_features - writer.write(json.dumps(output_json) + "\n") - - -if __name__ == "__main__": - main() diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/file_utils.py b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/file_utils.py deleted file mode 100644 index cdefb125839..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/file_utils.py +++ /dev/null @@ -1,263 +0,0 @@ -# Copyright 2018 The Google AI Language Team Authors and The HugginFace Inc. team. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Utilities for working with the local dataset cache. -This file is adapted from the AllenNLP library at https://github.com/allenai/allennlp -Copyright by the AllenNLP authors. -""" - -from __future__ import (absolute_import, division, print_function, unicode_literals) - -import json -import logging -import os -import shutil -import tempfile -from functools import wraps -from hashlib import sha256 -import sys -from io import open - -import boto3 -import requests -from botocore.exceptions import ClientError -from tqdm import tqdm - -try: - from urllib.parse import urlparse -except ImportError: - from urlparse import urlparse - -try: - from pathlib import Path - PYTORCH_PRETRAINED_BERT_CACHE = Path(os.getenv('PYTORCH_PRETRAINED_BERT_CACHE', - Path.home() / '.pytorch_pretrained_bert')) -except AttributeError: - PYTORCH_PRETRAINED_BERT_CACHE = os.getenv('PYTORCH_PRETRAINED_BERT_CACHE', - os.path.join(os.path.expanduser("~"), '.pytorch_pretrained_bert')) - -logger = logging.getLogger(__name__) # pylint: disable=invalid-name - - -def url_to_filename(url, etag=None): - """ - Convert `url` into a hashed filename in a repeatable way. - If `etag` is specified, append its hash to the url's, delimited - by a period. - """ - url_bytes = url.encode('utf-8') - url_hash = sha256(url_bytes) - filename = url_hash.hexdigest() - - if etag: - etag_bytes = etag.encode('utf-8') - etag_hash = sha256(etag_bytes) - filename += '.' + etag_hash.hexdigest() - - return filename - - -def filename_to_url(filename, cache_dir=None): - """ - Return the url and etag (which may be ``None``) stored for `filename`. - Raise ``EnvironmentError`` if `filename` or its stored metadata do not exist. - """ - if cache_dir is None: - cache_dir = PYTORCH_PRETRAINED_BERT_CACHE - if sys.version_info[0] == 3 and isinstance(cache_dir, Path): - cache_dir = str(cache_dir) - - cache_path = os.path.join(cache_dir, filename) - if not os.path.exists(cache_path): - raise EnvironmentError("file {} not found".format(cache_path)) - - meta_path = cache_path + '.json' - if not os.path.exists(meta_path): - raise EnvironmentError("file {} not found".format(meta_path)) - - with open(meta_path, encoding="utf-8") as meta_file: - metadata = json.load(meta_file) - url = metadata['url'] - etag = metadata['etag'] - - return url, etag - - -def cached_path(url_or_filename, cache_dir=None): - """ - Given something that might be a URL (or might be a local path), - determine which. If it's a URL, download the file and cache it, and - return the path to the cached file. If it's already a local path, - make sure the file exists and then return the path. - """ - if cache_dir is None: - cache_dir = PYTORCH_PRETRAINED_BERT_CACHE - if sys.version_info[0] == 3 and isinstance(url_or_filename, Path): - url_or_filename = str(url_or_filename) - if sys.version_info[0] == 3 and isinstance(cache_dir, Path): - cache_dir = str(cache_dir) - - parsed = urlparse(url_or_filename) - - if parsed.scheme in ('http', 'https', 's3'): - # URL, so get it from the cache (downloading if necessary) - return get_from_cache(url_or_filename, cache_dir) - elif os.path.exists(url_or_filename): - # File, and it exists. - return url_or_filename - elif parsed.scheme == '': - # File, but it doesn't exist. - raise EnvironmentError("file {} not found".format(url_or_filename)) - else: - # Something unknown - raise ValueError("unable to parse {} as a URL or as a local path".format(url_or_filename)) - - -def split_s3_path(url): - """Split a full s3 path into the bucket name and path.""" - parsed = urlparse(url) - if not parsed.netloc or not parsed.path: - raise ValueError("bad s3 path {}".format(url)) - bucket_name = parsed.netloc - s3_path = parsed.path - # Remove '/' at beginning of path. - if s3_path.startswith("/"): - s3_path = s3_path[1:] - return bucket_name, s3_path - - -def s3_request(func): - """ - Wrapper function for s3 requests in order to create more helpful error - messages. - """ - - @wraps(func) - def wrapper(url, *args, **kwargs): - try: - return func(url, *args, **kwargs) - except ClientError as exc: - if int(exc.response["Error"]["Code"]) == 404: - raise EnvironmentError("file {} not found".format(url)) - else: - raise - - return wrapper - - -@s3_request -def s3_etag(url): - """Check ETag on S3 object.""" - s3_resource = boto3.resource("s3") - bucket_name, s3_path = split_s3_path(url) - s3_object = s3_resource.Object(bucket_name, s3_path) - return s3_object.e_tag - - -@s3_request -def s3_get(url, temp_file): - """Pull a file directly from S3.""" - s3_resource = boto3.resource("s3") - bucket_name, s3_path = split_s3_path(url) - s3_resource.Bucket(bucket_name).download_fileobj(s3_path, temp_file) - - -def http_get(url, temp_file): - req = requests.get(url, stream=True) - content_length = req.headers.get('Content-Length') - total = int(content_length) if content_length is not None else None - progress = tqdm(unit="B", total=total) - for chunk in req.iter_content(chunk_size=1024): - if chunk: # filter out keep-alive new chunks - progress.update(len(chunk)) - temp_file.write(chunk) - progress.close() - - -def get_from_cache(url, cache_dir=None): - """ - Given a URL, look for the corresponding dataset in the local cache. - If it's not there, download it. Then return the path to the cached file. - """ - if cache_dir is None: - cache_dir = PYTORCH_PRETRAINED_BERT_CACHE - if sys.version_info[0] == 3 and isinstance(cache_dir, Path): - cache_dir = str(cache_dir) - - if not os.path.exists(cache_dir): - os.makedirs(cache_dir) - - # Get eTag to add to filename, if it exists. - if url.startswith("s3://"): - etag = s3_etag(url) - else: - response = requests.head(url, allow_redirects=True) - if response.status_code != 200: - raise IOError("HEAD request failed for url {} with status code {}" - .format(url, response.status_code)) - etag = response.headers.get("ETag") - - filename = url_to_filename(url, etag) - - # get cache path to put the file - cache_path = os.path.join(cache_dir, filename) - - if not os.path.exists(cache_path): - # Download to temporary file, then copy to cache dir once finished. - # Otherwise you get corrupt cache entries if the download gets interrupted. - with tempfile.NamedTemporaryFile() as temp_file: - logger.info("%s not found in cache, downloading to %s", url, temp_file.name) - - # GET file object - if url.startswith("s3://"): - s3_get(url, temp_file) - else: - http_get(url, temp_file) - - # we are copying the file before closing it, so flush to avoid truncation - temp_file.flush() - # shutil.copyfileobj() starts at the current position, so go to the start - temp_file.seek(0) - - logger.info("copying %s to cache at %s", temp_file.name, cache_path) - with open(cache_path, 'wb') as cache_file: - shutil.copyfileobj(temp_file, cache_file) - - logger.info("creating metadata file for %s", cache_path) - meta = {'url': url, 'etag': etag} - meta_path = cache_path + '.json' - with open(meta_path, 'w', encoding="utf-8") as meta_file: - json.dump(meta, meta_file) - - logger.info("removing temp file %s", temp_file.name) - - return cache_path - - -def read_set_from_file(filename): - ''' - Extract a de-duped collection (set) of text from a file. - Expected file format is one item per line. - ''' - collection = set() - with open(filename, 'r', encoding='utf-8') as file_: - for line in file_: - collection.add(line.rstrip()) - return collection - - -def get_file_extension(path, dot=True, lower=True): - ext = os.path.splitext(path)[1] - ext = ext if dot else ext[1:] - return ext.lower() if lower else ext diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/modeling.py b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/modeling.py deleted file mode 100644 index cebd2b17f75..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/modeling.py +++ /dev/null @@ -1,1285 +0,0 @@ -# coding=utf-8 -# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. -# Copyright 2018 The Google AI Language Team Authors and The HugginFace Inc. team. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""PyTorch BERT model.""" - -from __future__ import absolute_import, division, print_function, unicode_literals - -import copy -import json -import logging -import math -import os -import shutil -import tarfile -import tempfile -import sys -from io import open - -import torch -from torch import nn -from torch.nn import CrossEntropyLoss -from torch.utils import checkpoint - -sys.path.append('/workspace/bert/') -from file_utils import cached_path - -from torch.nn import Module -from torch.nn.parameter import Parameter -import torch.nn.functional as F -import torch.nn.init as init - -logger = logging.getLogger(__name__) - -PRETRAINED_MODEL_ARCHIVE_MAP = { - 'bert-base-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased.tar.gz", - 'bert-large-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased.tar.gz", - 'bert-base-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased.tar.gz", - 'bert-large-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased.tar.gz", - 'bert-base-multilingual-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-uncased.tar.gz", - 'bert-base-multilingual-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-cased.tar.gz", - 'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese.tar.gz", -} -CONFIG_NAME = 'bert_config.json' -WEIGHTS_NAME = 'pytorch_model.bin' -TF_WEIGHTS_NAME = 'model.ckpt' - -def load_tf_weights_in_bert(model, tf_checkpoint_path): - """ Load tf checkpoints in a pytorch model - """ - try: - import re - import numpy as np - import tensorflow as tf - except ImportError: - print("Loading a TensorFlow models in PyTorch, requires TensorFlow to be installed. Please see " - "https://www.tensorflow.org/install/ for installation instructions.") - raise - tf_path = os.path.abspath(tf_checkpoint_path) - print("Converting TensorFlow checkpoint from {}".format(tf_path)) - # Load weights from TF model - init_vars = tf.train.list_variables(tf_path) - names = [] - arrays = [] - for name, shape in init_vars: - print("Loading TF weight {} with shape {}".format(name, shape)) - array = tf.train.load_variable(tf_path, name) - names.append(name) - arrays.append(array) - - for name, array in zip(names, arrays): - name = name.split('/') - # adam_v and adam_m are variables used in AdamWeightDecayOptimizer to calculated m and v - # which are not required for using pretrained model - if any(n in ["adam_v", "adam_m"] for n in name): - print("Skipping {}".format("/".join(name))) - continue - pointer = model - for m_name in name: - if re.fullmatch(r'[A-Za-z]+_\d+', m_name): - l = re.split(r'_(\d+)', m_name) - else: - l = [m_name] - if l[0] == 'kernel' or l[0] == 'gamma': - pointer = getattr(pointer, 'weight') - elif l[0] == 'output_bias' or l[0] == 'beta': - pointer = getattr(pointer, 'bias') - elif l[0] == 'output_weights': - pointer = getattr(pointer, 'weight') - else: - pointer = getattr(pointer, l[0]) - if len(l) >= 2: - num = int(l[1]) - pointer = pointer[num] - if m_name[-11:] == '_embeddings': - pointer = getattr(pointer, 'weight') - elif m_name == 'kernel': - array = np.ascontiguousarray(np.transpose(array)) - try: - assert pointer.shape == array.shape - except AssertionError as e: - e.args += (pointer.shape, array.shape) - raise - print("Initialize PyTorch weight {}".format(name)) - pointer.data = torch.from_numpy(array) - return model - -def gelu(x): - return x * 0.5 * (1.0 + torch.erf(x / 1.41421)) - -#used only for triton inference -def bias_gelu(bias, y): - x = bias + y - return x * 0.5 * (1.0 + torch.erf(x / 1.41421)) - -# used specifically for training since torch.nn.functional.gelu breaks ONNX export -def bias_gelu_training(bias, y): - x = bias + y - return torch.nn.functional.gelu(x) # Breaks ONNX export - -def bias_tanh(bias, y): - x = bias + y - return torch.tanh(x) - -def swish(x): - return x * torch.sigmoid(x) - -#torch.nn.functional.gelu(x) # Breaks ONNX export -ACT2FN = {"gelu": gelu, "bias_gelu": bias_gelu, "bias_tanh": bias_tanh, "relu": torch.nn.functional.relu, "swish": swish} - -class LinearActivation(Module): - r"""Fused Linear and activation Module. - """ - __constants__ = ['bias'] - - def __init__(self, in_features, out_features, act='gelu', bias=True): - super(LinearActivation, self).__init__() - self.in_features = in_features - self.out_features = out_features - self.act_fn = nn.Identity() # - self.biased_act_fn = None # - self.bias = None # - if isinstance(act, str) or (sys.version_info[0] == 2 and isinstance(act, unicode)): # For TorchScript - if bias and not 'bias' in act: # compatibility - act = 'bias_' + act # - self.biased_act_fn = ACT2FN[act] # - - else: - self.act_fn = ACT2FN[act] - else: - self.act_fn = act - self.weight = Parameter(torch.Tensor(out_features, in_features)) - if bias: - self.bias = Parameter(torch.Tensor(out_features)) - else: - self.register_parameter('bias', None) - self.reset_parameters() - - def reset_parameters(self): - init.kaiming_uniform_(self.weight, a=math.sqrt(5)) - if self.bias is not None: - fan_in, _ = init._calculate_fan_in_and_fan_out(self.weight) - bound = 1 / math.sqrt(fan_in) - init.uniform_(self.bias, -bound, bound) - - def forward(self, input): - if not self.bias is None: - return self.biased_act_fn(self.bias, F.linear(input, self.weight, None)) - else: - return self.act_fn(F.linear(input, self.weight, self.bias)) - - def extra_repr(self): - return 'in_features={}, out_features={}, bias={}'.format( - self.in_features, self.out_features, self.bias is not None - ) - - -class BertConfig(object): - """Configuration class to store the configuration of a `BertModel`. - """ - def __init__(self, - vocab_size_or_config_json_file, - hidden_size=768, - num_hidden_layers=12, - num_attention_heads=12, - intermediate_size=3072, - hidden_act="gelu", - hidden_dropout_prob=0.1, - attention_probs_dropout_prob=0.1, - max_position_embeddings=512, - type_vocab_size=2, - initializer_range=0.02, - output_all_encoded_layers=False): - """Constructs BertConfig. - - Args: - vocab_size_or_config_json_file: Vocabulary size of `inputs_ids` in `BertModel`. - hidden_size: Size of the encoder layers and the pooler layer. - num_hidden_layers: Number of hidden layers in the Transformer encoder. - num_attention_heads: Number of attention heads for each attention layer in - the Transformer encoder. - intermediate_size: The size of the "intermediate" (i.e., feed-forward) - layer in the Transformer encoder. - hidden_act: The non-linear activation function (function or string) in the - encoder and pooler. If string, "gelu", "relu" and "swish" are supported. - hidden_dropout_prob: The dropout probabilitiy for all fully connected - layers in the embeddings, encoder, and pooler. - attention_probs_dropout_prob: The dropout ratio for the attention - probabilities. - max_position_embeddings: The maximum sequence length that this model might - ever be used with. Typically set this to something large just in case - (e.g., 512 or 1024 or 2048). - type_vocab_size: The vocabulary size of the `token_type_ids` passed into - `BertModel`. - initializer_range: The sttdev of the truncated_normal_initializer for - initializing all weight matrices. - """ - if isinstance(vocab_size_or_config_json_file, str) or (sys.version_info[0] == 2 - and isinstance(vocab_size_or_config_json_file, unicode)): - with open(vocab_size_or_config_json_file, "r", encoding='utf-8') as reader: - json_config = json.loads(reader.read()) - for key, value in json_config.items(): - self.__dict__[key] = value - elif isinstance(vocab_size_or_config_json_file, int): - self.vocab_size = vocab_size_or_config_json_file - self.hidden_size = hidden_size - self.num_hidden_layers = num_hidden_layers - self.num_attention_heads = num_attention_heads - self.hidden_act = hidden_act - self.intermediate_size = intermediate_size - self.hidden_dropout_prob = hidden_dropout_prob - self.attention_probs_dropout_prob = attention_probs_dropout_prob - self.max_position_embeddings = max_position_embeddings - self.type_vocab_size = type_vocab_size - self.initializer_range = initializer_range - self.output_all_encoded_layers = output_all_encoded_layers - else: - raise ValueError("First argument must be either a vocabulary size (int)" - "or the path to a pretrained model config file (str)") - - @classmethod - def from_dict(cls, json_object): - """Constructs a `BertConfig` from a Python dictionary of parameters.""" - config = BertConfig(vocab_size_or_config_json_file=-1) - for key, value in json_object.items(): - config.__dict__[key] = value - return config - - @classmethod - def from_json_file(cls, json_file): - """Constructs a `BertConfig` from a json file of parameters.""" - with open(json_file, "r", encoding='utf-8') as reader: - text = reader.read() - return cls.from_dict(json.loads(text)) - - def __repr__(self): - return str(self.to_json_string()) - - def to_dict(self): - """Serializes this instance to a Python dictionary.""" - output = copy.deepcopy(self.__dict__) - return output - - def to_json_string(self): - """Serializes this instance to a JSON string.""" - return json.dumps(self.to_dict(), indent=2, sort_keys=True) + "\n" - -class BertNonFusedLayerNorm(nn.Module): - def __init__(self, hidden_size, eps=1e-12): - """Construct a layernorm module in the TF style (epsilon inside the square root). - """ - super(BertNonFusedLayerNorm, self).__init__() - self.weight = nn.Parameter(torch.ones(hidden_size)) - self.bias = nn.Parameter(torch.zeros(hidden_size)) - self.variance_epsilon = eps - - def forward(self, x): - u = x.mean(-1, keepdim=True) - s = (x - u) - s = s * s - s = s.mean(-1, keepdim=True) - x = (x - u) / torch.sqrt(s + self.variance_epsilon) - return self.weight * x + self.bias - -try: - import apex - #apex.amp.register_half_function(apex.normalization.fused_layer_norm, 'FusedLayerNorm') - import apex.normalization - from apex.normalization.fused_layer_norm import FusedLayerNormAffineFunction - #apex.amp.register_float_function(apex.normalization.FusedLayerNorm, 'forward') - #BertLayerNorm = apex.normalization.FusedLayerNorm - APEX_IS_AVAILABLE = True -except ImportError: - print("Better speed can be achieved with apex installed from https://www.github.com/nvidia/apex.") - #BertLayerNorm = BertNonFusedLayerNorm - APEX_IS_AVAILABLE = False -class BertLayerNorm(Module): - def __init__(self, hidden_size, eps=1e-12): - super(BertLayerNorm, self).__init__() - self.shape = torch.Size((hidden_size,)) - self.eps = eps - self.weight = nn.Parameter(torch.ones(hidden_size)) - self.bias = nn.Parameter(torch.zeros(hidden_size)) - self.apex_enabled = APEX_IS_AVAILABLE - - @torch.jit.unused - def fused_layer_norm(self, x): - return FusedLayerNormAffineFunction.apply( - x, self.weight, self.bias, self.shape, self.eps) - - - def forward(self, x): - if self.apex_enabled and not torch.jit.is_scripting(): - x = self.fused_layer_norm(x) - else: - u = x.mean(-1, keepdim=True) - s = (x - u) - s = s * s - s = s.mean(-1, keepdim=True) - x = (x - u) / torch.sqrt(s + self.eps) - x = self.weight * x + self.bias - return x - -class BertEmbeddings(nn.Module): - """Construct the embeddings from word, position and token_type embeddings. - """ - def __init__(self, config): - super(BertEmbeddings, self).__init__() - self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size) - self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size) - self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size) - - # self.LayerNorm is not snake-cased to stick with TensorFlow model variable name and be able to load - # any TensorFlow checkpoint file - self.LayerNorm = BertLayerNorm(config.hidden_size, eps=1e-12) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - - def forward(self, input_ids, token_type_ids): - seq_length = input_ids.size(1) - position_ids = torch.arange(seq_length, dtype=torch.long, device=input_ids.device) - position_ids = position_ids.unsqueeze(0).expand_as(input_ids) - - words_embeddings = self.word_embeddings(input_ids) - position_embeddings = self.position_embeddings(position_ids) - token_type_embeddings = self.token_type_embeddings(token_type_ids) - - embeddings = words_embeddings + position_embeddings + token_type_embeddings - embeddings = self.LayerNorm(embeddings) - embeddings = self.dropout(embeddings) - return embeddings - - -class BertSelfAttention(nn.Module): - def __init__(self, config): - super(BertSelfAttention, self).__init__() - if config.hidden_size % config.num_attention_heads != 0: - raise ValueError( - "The hidden size (%d) is not a multiple of the number of attention " - "heads (%d)" % (config.hidden_size, config.num_attention_heads)) - self.num_attention_heads = config.num_attention_heads - self.attention_head_size = int(config.hidden_size / config.num_attention_heads) - self.all_head_size = self.num_attention_heads * self.attention_head_size - - self.query = nn.Linear(config.hidden_size, self.all_head_size) - self.key = nn.Linear(config.hidden_size, self.all_head_size) - self.value = nn.Linear(config.hidden_size, self.all_head_size) - - self.dropout = nn.Dropout(config.attention_probs_dropout_prob) - - def transpose_for_scores(self, x): - new_x_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size) - x = torch.reshape(x, new_x_shape) - return x.permute(0, 2, 1, 3) - - def transpose_key_for_scores(self, x): - new_x_shape = x.size()[:-1] + (self.num_attention_heads, self.attention_head_size) - x = torch.reshape(x, new_x_shape) - return x.permute(0, 2, 3, 1) - - def forward(self, hidden_states, attention_mask): - mixed_query_layer = self.query(hidden_states) - mixed_key_layer = self.key(hidden_states) - mixed_value_layer = self.value(hidden_states) - - query_layer = self.transpose_for_scores(mixed_query_layer) - key_layer = self.transpose_key_for_scores(mixed_key_layer) - value_layer = self.transpose_for_scores(mixed_value_layer) - - # Take the dot product between "query" and "key" to get the raw attention scores. - attention_scores = torch.matmul(query_layer, key_layer) - attention_scores = attention_scores / math.sqrt(self.attention_head_size) - # Apply the attention mask is (precomputed for all layers in BertModel forward() function) - attention_scores = attention_scores + attention_mask - - # Normalize the attention scores to probabilities. - attention_probs = F.softmax(attention_scores, dim=-1) - - # This is actually dropping out entire tokens to attend to, which might - # seem a bit unusual, but is taken from the original Transformer paper. - attention_probs = self.dropout(attention_probs) - - context_layer = torch.matmul(attention_probs, value_layer) - context_layer = context_layer.permute(0, 2, 1, 3).contiguous() - new_context_layer_shape = context_layer.size()[:-2] + (self.all_head_size,) - context_layer = torch.reshape(context_layer, new_context_layer_shape) - return context_layer - - -class BertSelfOutput(nn.Module): - def __init__(self, config): - super(BertSelfOutput, self).__init__() - self.dense = nn.Linear(config.hidden_size, config.hidden_size) - self.LayerNorm = BertLayerNorm(config.hidden_size, eps=1e-12) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - - def forward(self, hidden_states, input_tensor): - hidden_states = self.dense(hidden_states) - hidden_states = self.dropout(hidden_states) - hidden_states = self.LayerNorm(hidden_states + input_tensor) - return hidden_states - - -class BertAttention(nn.Module): - def __init__(self, config): - super(BertAttention, self).__init__() - self.self = BertSelfAttention(config) - self.output = BertSelfOutput(config) - - def forward(self, input_tensor, attention_mask): - self_output = self.self(input_tensor, attention_mask) - attention_output = self.output(self_output, input_tensor) - return attention_output - - -class BertIntermediate(nn.Module): - def __init__(self, config): - super(BertIntermediate, self).__init__() - self.dense_act = LinearActivation(config.hidden_size, config.intermediate_size, act=config.hidden_act) - - def forward(self, hidden_states): - hidden_states = self.dense_act(hidden_states) - return hidden_states - - -class BertOutput(nn.Module): - def __init__(self, config): - super(BertOutput, self).__init__() - self.dense = nn.Linear(config.intermediate_size, config.hidden_size) - self.LayerNorm = BertLayerNorm(config.hidden_size, eps=1e-12) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - - def forward(self, hidden_states, input_tensor): - hidden_states = self.dense(hidden_states) - hidden_states = self.dropout(hidden_states) - hidden_states = self.LayerNorm(hidden_states + input_tensor) - return hidden_states - - -class BertLayer(nn.Module): - def __init__(self, config): - super(BertLayer, self).__init__() - self.attention = BertAttention(config) - self.intermediate = BertIntermediate(config) - self.output = BertOutput(config) - - def forward(self, hidden_states, attention_mask): - attention_output = self.attention(hidden_states, attention_mask) - intermediate_output = self.intermediate(attention_output) - layer_output = self.output(intermediate_output, attention_output) - return layer_output - -class BertEncoder(nn.Module): - def __init__(self, config): - super(BertEncoder, self).__init__() - self.layer = nn.ModuleList([BertLayer(config) for _ in range(config.num_hidden_layers)]) - self.output_all_encoded_layers = config.output_all_encoded_layers - self._checkpoint_activations = False - - @torch.jit.unused - def checkpointed_forward(self, hidden_states, attention_mask): - def custom(start, end): - def custom_forward(*inputs): - layers = self.layer[start:end] - x_ = inputs[0] - for layer in layers: - x_ = layer(x_, inputs[1]) - return x_ - return custom_forward - - l = 0 - num_layers = len(self.layer) - chunk_length = math.ceil(math.sqrt(num_layers)) - while l < num_layers: - hidden_states = checkpoint.checkpoint(custom(l, l+chunk_length), hidden_states, attention_mask*1) - l += chunk_length - - return hidden_states - - def forward(self, hidden_states, attention_mask): - all_encoder_layers = [] - - if self._checkpoint_activations: - hidden_states = self.checkpointed_forward(hidden_states, attention_mask) - else: - for i,layer_module in enumerate(self.layer): - hidden_states = layer_module(hidden_states, attention_mask) - - if self.output_all_encoded_layers: - all_encoder_layers.append(hidden_states) - - if not self.output_all_encoded_layers or self._checkpoint_activations: - all_encoder_layers.append(hidden_states) - return all_encoder_layers - -class BertPooler(nn.Module): - def __init__(self, config): - super(BertPooler, self).__init__() - self.dense_act = LinearActivation(config.hidden_size, config.hidden_size, act="tanh") - - def forward(self, hidden_states): - # We "pool" the model by simply taking the hidden state corresponding - # to the first token. - first_token_tensor = hidden_states[:, 0] - pooled_output = self.dense_act(first_token_tensor) - return pooled_output - - -class BertPredictionHeadTransform(nn.Module): - def __init__(self, config): - super(BertPredictionHeadTransform, self).__init__() - self.dense_act = LinearActivation(config.hidden_size, config.hidden_size, act=config.hidden_act) - self.LayerNorm = BertLayerNorm(config.hidden_size, eps=1e-12) - - def forward(self, hidden_states): - hidden_states = self.dense_act(hidden_states) - hidden_states = self.LayerNorm(hidden_states) - return hidden_states - - -class BertLMPredictionHead(nn.Module): - def __init__(self, config, bert_model_embedding_weights): - super(BertLMPredictionHead, self).__init__() - self.transform = BertPredictionHeadTransform(config) - - # The output weights are the same as the input embeddings, but there is - # an output-only bias for each token. - self.decoder = nn.Linear(bert_model_embedding_weights.size(1), - bert_model_embedding_weights.size(0), - bias=False) - self.decoder.weight = bert_model_embedding_weights - self.bias = nn.Parameter(torch.zeros(bert_model_embedding_weights.size(0))) - - def forward(self, hidden_states): - hidden_states = self.transform(hidden_states) - hidden_states = self.decoder(hidden_states) + self.bias - return hidden_states - - -class BertOnlyMLMHead(nn.Module): - def __init__(self, config, bert_model_embedding_weights): - super(BertOnlyMLMHead, self).__init__() - self.predictions = BertLMPredictionHead(config, bert_model_embedding_weights) - - def forward(self, sequence_output): - prediction_scores = self.predictions(sequence_output) - return prediction_scores - - -class BertOnlyNSPHead(nn.Module): - def __init__(self, config): - super(BertOnlyNSPHead, self).__init__() - self.seq_relationship = nn.Linear(config.hidden_size, 2) - - def forward(self, pooled_output): - seq_relationship_score = self.seq_relationship(pooled_output) - return seq_relationship_score - - -class BertPreTrainingHeads(nn.Module): - def __init__(self, config, bert_model_embedding_weights): - super(BertPreTrainingHeads, self).__init__() - self.predictions = BertLMPredictionHead(config, bert_model_embedding_weights) - self.seq_relationship = nn.Linear(config.hidden_size, 2) - - def forward(self, sequence_output, pooled_output): - prediction_scores = self.predictions(sequence_output) - seq_relationship_score = self.seq_relationship(pooled_output) - return prediction_scores, seq_relationship_score - - -class BertPreTrainedModel(nn.Module): - """ An abstract class to handle weights initialization and - a simple interface for downloading and loading pretrained models. - """ - def __init__(self, config, *inputs, **kwargs): - super(BertPreTrainedModel, self).__init__() - if not isinstance(config, BertConfig): - raise ValueError( - "Parameter config in `{}(config)` should be an instance of class `BertConfig`. " - "To create a model from a Google pretrained model use " - "`model = {}.from_pretrained(PRETRAINED_MODEL_NAME)`".format( - self.__class__.__name__, self.__class__.__name__ - )) - self.config = config - - def init_bert_weights(self, module): - """ Initialize the weights. - """ - if isinstance(module, (nn.Linear, nn.Embedding)): - # Slightly different from the TF version which uses truncated_normal for initialization - # cf https://github.com/pytorch/pytorch/pull/5617 - module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) - elif isinstance(module, BertLayerNorm): - module.bias.data.zero_() - module.weight.data.fill_(1.0) - if isinstance(module, nn.Linear) and module.bias is not None: - module.bias.data.zero_() - - def checkpoint_activations(self, val): - def _apply_flag(module): - if hasattr(module, "_checkpoint_activations"): - module._checkpoint_activations=val - self.apply(_apply_flag) - def enable_apex(self, val): - def _apply_flag(module): - if hasattr(module, "apex_enabled"): - module.apex_enabled=val - self.apply(_apply_flag) - - @classmethod - def from_pretrained(cls, pretrained_model_name_or_path, state_dict=None, cache_dir=None, - from_tf=False, *inputs, **kwargs): - """ - Instantiate a BertPreTrainedModel from a pre-trained model file or a pytorch state dict. - Download and cache the pre-trained model file if needed. - - Params: - pretrained_model_name_or_path: either: - - a str with the name of a pre-trained model to load selected in the list of: - . `bert-base-uncased` - . `bert-large-uncased` - . `bert-base-cased` - . `bert-large-cased` - . `bert-base-multilingual-uncased` - . `bert-base-multilingual-cased` - . `bert-base-chinese` - - a path or url to a pretrained model archive containing: - . `bert_config.json` a configuration file for the model - . `pytorch_model.bin` a PyTorch dump of a BertForPreTraining instance - - a path or url to a pretrained model archive containing: - . `bert_config.json` a configuration file for the model - . `model.chkpt` a TensorFlow checkpoint - from_tf: should we load the weights from a locally saved TensorFlow checkpoint - cache_dir: an optional path to a folder in which the pre-trained models will be cached. - state_dict: an optional state dictionary (collections.OrderedDict object) to use instead of Google pre-trained models - *inputs, **kwargs: additional input for the specific Bert class - (ex: num_labels for BertForSequenceClassification) - """ - if pretrained_model_name_or_path in PRETRAINED_MODEL_ARCHIVE_MAP: - archive_file = PRETRAINED_MODEL_ARCHIVE_MAP[pretrained_model_name_or_path] - else: - archive_file = pretrained_model_name_or_path - # redirect to the cache, if necessary - try: - resolved_archive_file = cached_path(archive_file, cache_dir=cache_dir) - except EnvironmentError: - logger.error( - "Model name '{}' was not found in model name list ({}). " - "We assumed '{}' was a path or url but couldn't find any file " - "associated to this path or url.".format( - pretrained_model_name_or_path, - ', '.join(PRETRAINED_MODEL_ARCHIVE_MAP.keys()), - archive_file)) - return None - if resolved_archive_file == archive_file: - logger.info("loading archive file {}".format(archive_file)) - else: - logger.info("loading archive file {} from cache at {}".format( - archive_file, resolved_archive_file)) - tempdir = None - if os.path.isdir(resolved_archive_file) or from_tf: - serialization_dir = resolved_archive_file - else: - # Extract archive to temp dir - tempdir = tempfile.mkdtemp() - logger.info("extracting archive file {} to temp dir {}".format( - resolved_archive_file, tempdir)) - if os.path.isfile(resolved_archive_file) and tarfile.is_tarfile(resolved_archive_file): - with tarfile.open(resolved_archive_file, 'r:gz') as archive: - archive.extractall(tempdir) - else: - logger.error("Invalid tar file {}".format(resolved_archive_file)) - serialization_dir = tempdir - # Load config - config_file = os.path.join(serialization_dir, CONFIG_NAME) - config = BertConfig.from_json_file(config_file) - logger.info("Model config {}".format(config)) - # Instantiate model. - model = cls(config, *inputs, **kwargs) - if state_dict is None and not from_tf: - weights_path = os.path.join(serialization_dir, WEIGHTS_NAME) - state_dict = torch.load(weights_path, map_location='cpu' if not torch.cuda.is_available() else None) - if tempdir: - # Clean up temp dir - shutil.rmtree(tempdir) - if from_tf: - # Directly load from a TensorFlow checkpoint - weights_path = os.path.join(serialization_dir, TF_WEIGHTS_NAME) - return load_tf_weights_in_bert(model, weights_path) - # Load from a PyTorch state_dict - old_keys = [] - new_keys = [] - for key in state_dict.keys(): - new_key = None - if 'gamma' in key: - new_key = key.replace('gamma', 'weight') - if 'beta' in key: - new_key = key.replace('beta', 'bias') - if new_key: - old_keys.append(key) - new_keys.append(new_key) - for old_key, new_key in zip(old_keys, new_keys): - state_dict[new_key] = state_dict.pop(old_key) - - missing_keys = [] - unexpected_keys = [] - error_msgs = [] - # copy state_dict so _load_from_state_dict can modify it - metadata = getattr(state_dict, '_metadata', None) - state_dict = state_dict.copy() - if metadata is not None: - state_dict._metadata = metadata - - def load(module, prefix=''): - local_metadata = {} if metadata is None else metadata.get(prefix[:-1], {}) - module._load_from_state_dict( - state_dict, prefix, local_metadata, True, missing_keys, unexpected_keys, error_msgs) - for name, child in module._modules.items(): - if child is not None: - load(child, prefix + name + '.') - start_prefix = '' - if not hasattr(model, 'bert') and any(s.startswith('bert.') for s in state_dict.keys()): - start_prefix = 'bert.' - load(model, prefix=start_prefix) - if len(missing_keys) > 0: - logger.info("Weights of {} not initialized from pretrained model: {}".format( - model.__class__.__name__, missing_keys)) - if len(unexpected_keys) > 0: - logger.info("Weights from pretrained model not used in {}: {}".format( - model.__class__.__name__, unexpected_keys)) - if len(error_msgs) > 0: - raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format( - model.__class__.__name__, "\n\t".join(error_msgs))) - return model - - -class BertModel(BertPreTrainedModel): - """BERT model ("Bidirectional Embedding Representations from a Transformer"). - - Params: - config: a BertConfig class instance with the configuration to build a new model - - Inputs: - `input_ids`: a torch.LongTensor of shape [batch_size, sequence_length] - with the word token indices in the vocabulary(see the tokens preprocessing logic in the scripts - `extract_features.py`, `run_classifier.py` and `run_squad.py`) - `token_type_ids`: an optional torch.LongTensor of shape [batch_size, sequence_length] with the token - types indices selected in [0, 1]. Type 0 corresponds to a `sentence A` and type 1 corresponds to - a `sentence B` token (see BERT paper for more details). - `attention_mask`: an optional torch.LongTensor of shape [batch_size, sequence_length] with indices - selected in [0, 1]. It's a mask to be used if the input sequence length is smaller than the max - input sequence length in the current batch. It's the mask that we typically use for attention when - a batch has varying length sentences. - - Outputs: Tuple of (encoded_layers, pooled_output) - `encoded_layers`: controlled by `output_all_encoded_layers` argument: - - `output_all_encoded_layers=True`: outputs a list of the full sequences of encoded-hidden-states at the end - of each attention block (i.e. 12 full sequences for BERT-base, 24 for BERT-large), each - encoded-hidden-state is a torch.FloatTensor of size [batch_size, sequence_length, hidden_size], - - `output_all_encoded_layers=False`: outputs only the full sequence of hidden-states corresponding - to the last attention block of shape [batch_size, sequence_length, hidden_size], - `pooled_output`: a torch.FloatTensor of size [batch_size, hidden_size] which is the output of a - classifier pretrained on top of the hidden state associated to the first character of the - input (`CLS`) to train on the Next-Sentence task (see BERT's paper). - - Example usage: - ```python - # Already been converted into WordPiece token ids - input_ids = torch.LongTensor([[31, 51, 99], [15, 5, 0]]) - input_mask = torch.LongTensor([[1, 1, 1], [1, 1, 0]]) - token_type_ids = torch.LongTensor([[0, 0, 1], [0, 1, 0]]) - - config = modeling.BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768, - num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072) - - model = modeling.BertModel(config=config) - all_encoder_layers, pooled_output = model(input_ids, token_type_ids, input_mask) - ``` - """ - def __init__(self, config): - super(BertModel, self).__init__(config) - self.embeddings = BertEmbeddings(config) - self.encoder = BertEncoder(config) - self.pooler = BertPooler(config) - self.apply(self.init_bert_weights) - self.output_all_encoded_layers = config.output_all_encoded_layers - - def forward(self, input_ids, token_type_ids, attention_mask): - # We create a 3D attention mask from a 2D tensor mask. - # Sizes are [batch_size, 1, 1, to_seq_length] - # So we can broadcast to [batch_size, num_heads, from_seq_length, to_seq_length] - # this attention mask is more simple than the triangular masking of causal attention - # used in OpenAI GPT, we just need to prepare the broadcast dimension here. - extended_attention_mask = attention_mask.unsqueeze(1).unsqueeze(2) - - # Since attention_mask is 1.0 for positions we want to attend and 0.0 for - # masked positions, this operation will create a tensor which is 0.0 for - # positions we want to attend and -10000.0 for masked positions. - # Since we are adding it to the raw scores before the softmax, this is - # effectively the same as removing these entirely. - extended_attention_mask = extended_attention_mask.to(dtype=self.embeddings.word_embeddings.weight.dtype) # fp16 compatibility - extended_attention_mask = (1.0 - extended_attention_mask) * -10000.0 - - embedding_output = self.embeddings(input_ids, token_type_ids) - encoded_layers = self.encoder(embedding_output, extended_attention_mask) - sequence_output = encoded_layers[-1] - pooled_output = self.pooler(sequence_output) - if not self.output_all_encoded_layers: - encoded_layers = encoded_layers[-1:] - return encoded_layers, pooled_output - - -class BertForPreTraining(BertPreTrainedModel): - """BERT model with pre-training heads. - This module comprises the BERT model followed by the two pre-training heads: - - the masked language modeling head, and - - the next sentence classification head. - - Params: - config: a BertConfig class instance with the configuration to build a new model. - - Inputs: - `input_ids`: a torch.LongTensor of shape [batch_size, sequence_length] - with the word token indices in the vocabulary(see the tokens preprocessing logic in the scripts - `extract_features.py`, `run_classifier.py` and `run_squad.py`) - `token_type_ids`: an optional torch.LongTensor of shape [batch_size, sequence_length] with the token - types indices selected in [0, 1]. Type 0 corresponds to a `sentence A` and type 1 corresponds to - a `sentence B` token (see BERT paper for more details). - `attention_mask`: an optional torch.LongTensor of shape [batch_size, sequence_length] with indices - selected in [0, 1]. It's a mask to be used if the input sequence length is smaller than the max - input sequence length in the current batch. It's the mask that we typically use for attention when - a batch has varying length sentences. - `masked_lm_labels`: optional masked language modeling labels: torch.LongTensor of shape [batch_size, sequence_length] - with indices selected in [-1, 0, ..., vocab_size]. All labels set to -1 are ignored (masked), the loss - is only computed for the labels set in [0, ..., vocab_size] - `next_sentence_label`: optional next sentence classification loss: torch.LongTensor of shape [batch_size] - with indices selected in [0, 1]. - 0 => next sentence is the continuation, 1 => next sentence is a random sentence. - - Outputs: - if `masked_lm_labels` and `next_sentence_label` are not `None`: - Outputs the total_loss which is the sum of the masked language modeling loss and the next - sentence classification loss. - if `masked_lm_labels` or `next_sentence_label` is `None`: - Outputs a tuple comprising - - the masked language modeling logits of shape [batch_size, sequence_length, vocab_size], and - - the next sentence classification logits of shape [batch_size, 2]. - - Example usage: - ```python - # Already been converted into WordPiece token ids - input_ids = torch.LongTensor([[31, 51, 99], [15, 5, 0]]) - input_mask = torch.LongTensor([[1, 1, 1], [1, 1, 0]]) - token_type_ids = torch.LongTensor([[0, 0, 1], [0, 1, 0]]) - - config = BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768, - num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072) - - model = BertForPreTraining(config) - masked_lm_logits_scores, seq_relationship_logits = model(input_ids, token_type_ids, input_mask) - ``` - """ - def __init__(self, config): - super(BertForPreTraining, self).__init__(config) - self.bert = BertModel(config) - self.cls = BertPreTrainingHeads(config, self.bert.embeddings.word_embeddings.weight) - self.apply(self.init_bert_weights) - - def forward(self, input_ids, token_type_ids, attention_mask): - encoded_layers, pooled_output = self.bert(input_ids, token_type_ids, attention_mask) - sequence_output = encoded_layers[-1] - prediction_scores, seq_relationship_score = self.cls(sequence_output, pooled_output) - - return prediction_scores, seq_relationship_score - - -class BertForMaskedLM(BertPreTrainedModel): - """BERT model with the masked language modeling head. - This module comprises the BERT model followed by the masked language modeling head. - - Params: - config: a BertConfig class instance with the configuration to build a new model. - - Inputs: - `input_ids`: a torch.LongTensor of shape [batch_size, sequence_length] - with the word token indices in the vocabulary(see the tokens preprocessing logic in the scripts - `extract_features.py`, `run_classifier.py` and `run_squad.py`) - `token_type_ids`: an optional torch.LongTensor of shape [batch_size, sequence_length] with the token - types indices selected in [0, 1]. Type 0 corresponds to a `sentence A` and type 1 corresponds to - a `sentence B` token (see BERT paper for more details). - `attention_mask`: an optional torch.LongTensor of shape [batch_size, sequence_length] with indices - selected in [0, 1]. It's a mask to be used if the input sequence length is smaller than the max - input sequence length in the current batch. It's the mask that we typically use for attention when - a batch has varying length sentences. - `masked_lm_labels`: masked language modeling labels: torch.LongTensor of shape [batch_size, sequence_length] - with indices selected in [-1, 0, ..., vocab_size]. All labels set to -1 are ignored (masked), the loss - is only computed for the labels set in [0, ..., vocab_size] - - Outputs: - if `masked_lm_labels` is not `None`: - Outputs the masked language modeling loss. - if `masked_lm_labels` is `None`: - Outputs the masked language modeling logits of shape [batch_size, sequence_length, vocab_size]. - - Example usage: - ```python - # Already been converted into WordPiece token ids - input_ids = torch.LongTensor([[31, 51, 99], [15, 5, 0]]) - input_mask = torch.LongTensor([[1, 1, 1], [1, 1, 0]]) - token_type_ids = torch.LongTensor([[0, 0, 1], [0, 1, 0]]) - - config = BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768, - num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072) - - model = BertForMaskedLM(config) - masked_lm_logits_scores = model(input_ids, token_type_ids, input_mask) - ``` - """ - def __init__(self, config): - super(BertForMaskedLM, self).__init__(config) - self.bert = BertModel(config) - self.cls = BertOnlyMLMHead(config, self.bert.embeddings.word_embeddings.weight) - self.apply(self.init_bert_weights) - - def forward(self, input_ids, token_type_ids=None, attention_mask=None, masked_lm_labels=None): - encoded_layers, _ = self.bert(input_ids, token_type_ids, attention_mask) - sequence_output = encoded_layers[-1] - prediction_scores = self.cls(sequence_output) - - if masked_lm_labels is not None: - loss_fct = CrossEntropyLoss(ignore_index=-1) - masked_lm_loss = loss_fct(prediction_scores.view(-1, self.config.vocab_size), masked_lm_labels.view(-1)) - return masked_lm_loss - else: - return prediction_scores - - -class BertForNextSentencePrediction(BertPreTrainedModel): - """BERT model with next sentence prediction head. - This module comprises the BERT model followed by the next sentence classification head. - - Params: - config: a BertConfig class instance with the configuration to build a new model. - - Inputs: - `input_ids`: a torch.LongTensor of shape [batch_size, sequence_length] - with the word token indices in the vocabulary(see the tokens preprocessing logic in the scripts - `extract_features.py`, `run_classifier.py` and `run_squad.py`) - `token_type_ids`: an optional torch.LongTensor of shape [batch_size, sequence_length] with the token - types indices selected in [0, 1]. Type 0 corresponds to a `sentence A` and type 1 corresponds to - a `sentence B` token (see BERT paper for more details). - `attention_mask`: an optional torch.LongTensor of shape [batch_size, sequence_length] with indices - selected in [0, 1]. It's a mask to be used if the input sequence length is smaller than the max - input sequence length in the current batch. It's the mask that we typically use for attention when - a batch has varying length sentences. - `next_sentence_label`: next sentence classification loss: torch.LongTensor of shape [batch_size] - with indices selected in [0, 1]. - 0 => next sentence is the continuation, 1 => next sentence is a random sentence. - - Outputs: - if `next_sentence_label` is not `None`: - Outputs the total_loss which is the sum of the masked language modeling loss and the next - sentence classification loss. - if `next_sentence_label` is `None`: - Outputs the next sentence classification logits of shape [batch_size, 2]. - - Example usage: - ```python - # Already been converted into WordPiece token ids - input_ids = torch.LongTensor([[31, 51, 99], [15, 5, 0]]) - input_mask = torch.LongTensor([[1, 1, 1], [1, 1, 0]]) - token_type_ids = torch.LongTensor([[0, 0, 1], [0, 1, 0]]) - - config = BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768, - num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072) - - model = BertForNextSentencePrediction(config) - seq_relationship_logits = model(input_ids, token_type_ids, input_mask) - ``` - """ - def __init__(self, config): - super(BertForNextSentencePrediction, self).__init__(config) - self.bert = BertModel(config) - self.cls = BertOnlyNSPHead(config) - self.apply(self.init_bert_weights) - - def forward(self, input_ids, token_type_ids=None, attention_mask=None, next_sentence_label=None): - _, pooled_output = self.bert(input_ids, token_type_ids, attention_mask) - seq_relationship_score = self.cls( pooled_output) - - if next_sentence_label is not None: - loss_fct = CrossEntropyLoss(ignore_index=-1) - next_sentence_loss = loss_fct(seq_relationship_score.view(-1, 2), next_sentence_label.view(-1)) - return next_sentence_loss - else: - return seq_relationship_score - - -class BertForSequenceClassification(BertPreTrainedModel): - """BERT model for classification. - This module is composed of the BERT model with a linear layer on top of - the pooled output. - - Params: - `config`: a BertConfig class instance with the configuration to build a new model. - `num_labels`: the number of classes for the classifier. Default = 2. - - Inputs: - `input_ids`: a torch.LongTensor of shape [batch_size, sequence_length] - with the word token indices in the vocabulary(see the tokens preprocessing logic in the scripts - `extract_features.py`, `run_classifier.py` and `run_squad.py`) - `token_type_ids`: an optional torch.LongTensor of shape [batch_size, sequence_length] with the token - types indices selected in [0, 1]. Type 0 corresponds to a `sentence A` and type 1 corresponds to - a `sentence B` token (see BERT paper for more details). - `attention_mask`: an optional torch.LongTensor of shape [batch_size, sequence_length] with indices - selected in [0, 1]. It's a mask to be used if the input sequence length is smaller than the max - input sequence length in the current batch. It's the mask that we typically use for attention when - a batch has varying length sentences. - `labels`: labels for the classification output: torch.LongTensor of shape [batch_size] - with indices selected in [0, ..., num_labels]. - - Outputs: - if `labels` is not `None`: - Outputs the CrossEntropy classification loss of the output with the labels. - if `labels` is `None`: - Outputs the classification logits of shape [batch_size, num_labels]. - - Example usage: - ```python - # Already been converted into WordPiece token ids - input_ids = torch.LongTensor([[31, 51, 99], [15, 5, 0]]) - input_mask = torch.LongTensor([[1, 1, 1], [1, 1, 0]]) - token_type_ids = torch.LongTensor([[0, 0, 1], [0, 1, 0]]) - - config = BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768, - num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072) - - num_labels = 2 - - model = BertForSequenceClassification(config, num_labels) - logits = model(input_ids, token_type_ids, input_mask) - ``` - """ - def __init__(self, config, num_labels): - super(BertForSequenceClassification, self).__init__(config) - self.num_labels = num_labels - self.bert = BertModel(config) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - self.classifier = nn.Linear(config.hidden_size, num_labels) - self.apply(self.init_bert_weights) - - def forward(self, input_ids, token_type_ids=None, attention_mask=None): - _, pooled_output = self.bert(input_ids, token_type_ids, attention_mask) - pooled_output = self.dropout(pooled_output) - return self.classifier(pooled_output) - - -class BertForMultipleChoice(BertPreTrainedModel): - """BERT model for multiple choice tasks. - This module is composed of the BERT model with a linear layer on top of - the pooled output. - - Params: - `config`: a BertConfig class instance with the configuration to build a new model. - `num_choices`: the number of classes for the classifier. Default = 2. - - Inputs: - `input_ids`: a torch.LongTensor of shape [batch_size, num_choices, sequence_length] - with the word token indices in the vocabulary(see the tokens preprocessing logic in the scripts - `extract_features.py`, `run_classifier.py` and `run_squad.py`) - `token_type_ids`: an optional torch.LongTensor of shape [batch_size, num_choices, sequence_length] - with the token types indices selected in [0, 1]. Type 0 corresponds to a `sentence A` - and type 1 corresponds to a `sentence B` token (see BERT paper for more details). - `attention_mask`: an optional torch.LongTensor of shape [batch_size, num_choices, sequence_length] with indices - selected in [0, 1]. It's a mask to be used if the input sequence length is smaller than the max - input sequence length in the current batch. It's the mask that we typically use for attention when - a batch has varying length sentences. - `labels`: labels for the classification output: torch.LongTensor of shape [batch_size] - with indices selected in [0, ..., num_choices]. - - Outputs: - if `labels` is not `None`: - Outputs the CrossEntropy classification loss of the output with the labels. - if `labels` is `None`: - Outputs the classification logits of shape [batch_size, num_labels]. - - Example usage: - ```python - # Already been converted into WordPiece token ids - input_ids = torch.LongTensor([[[31, 51, 99], [15, 5, 0]], [[12, 16, 42], [14, 28, 57]]]) - input_mask = torch.LongTensor([[[1, 1, 1], [1, 1, 0]],[[1,1,0], [1, 0, 0]]]) - token_type_ids = torch.LongTensor([[[0, 0, 1], [0, 1, 0]],[[0, 1, 1], [0, 0, 1]]]) - config = BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768, - num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072) - - num_choices = 2 - - model = BertForMultipleChoice(config, num_choices) - logits = model(input_ids, token_type_ids, input_mask) - ``` - """ - def __init__(self, config, num_choices): - super(BertForMultipleChoice, self).__init__(config) - self.num_choices = num_choices - self.bert = BertModel(config) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - self.classifier = nn.Linear(config.hidden_size, 1) - self.apply(self.init_bert_weights) - - def forward(self, input_ids, token_type_ids=None, attention_mask=None, labels=None): - flat_input_ids = input_ids.view(-1, input_ids.size(-1)) - flat_token_type_ids = token_type_ids.view(-1, token_type_ids.size(-1)) - flat_attention_mask = attention_mask.view(-1, attention_mask.size(-1)) - _, pooled_output = self.bert(flat_input_ids, flat_token_type_ids, flat_attention_mask) - pooled_output = self.dropout(pooled_output) - logits = self.classifier(pooled_output) - reshaped_logits = logits.view(-1, self.num_choices) - - if labels is not None: - loss_fct = CrossEntropyLoss() - loss = loss_fct(reshaped_logits, labels) - return loss - else: - return reshaped_logits - - -class BertForTokenClassification(BertPreTrainedModel): - """BERT model for token-level classification. - This module is composed of the BERT model with a linear layer on top of - the full hidden state of the last layer. - - Params: - `config`: a BertConfig class instance with the configuration to build a new model. - `num_labels`: the number of classes for the classifier. Default = 2. - - Inputs: - `input_ids`: a torch.LongTensor of shape [batch_size, sequence_length] - with the word token indices in the vocabulary(see the tokens preprocessing logic in the scripts - `extract_features.py`, `run_classifier.py` and `run_squad.py`) - `token_type_ids`: an optional torch.LongTensor of shape [batch_size, sequence_length] with the token - types indices selected in [0, 1]. Type 0 corresponds to a `sentence A` and type 1 corresponds to - a `sentence B` token (see BERT paper for more details). - `attention_mask`: an optional torch.LongTensor of shape [batch_size, sequence_length] with indices - selected in [0, 1]. It's a mask to be used if the input sequence length is smaller than the max - input sequence length in the current batch. It's the mask that we typically use for attention when - a batch has varying length sentences. - `labels`: labels for the classification output: torch.LongTensor of shape [batch_size, sequence_length] - with indices selected in [0, ..., num_labels]. - - Outputs: - if `labels` is not `None`: - Outputs the CrossEntropy classification loss of the output with the labels. - if `labels` is `None`: - Outputs the classification logits of shape [batch_size, sequence_length, num_labels]. - - Example usage: - ```python - # Already been converted into WordPiece token ids - input_ids = torch.LongTensor([[31, 51, 99], [15, 5, 0]]) - input_mask = torch.LongTensor([[1, 1, 1], [1, 1, 0]]) - token_type_ids = torch.LongTensor([[0, 0, 1], [0, 1, 0]]) - - config = BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768, - num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072) - - num_labels = 2 - - model = BertForTokenClassification(config, num_labels) - logits = model(input_ids, token_type_ids, input_mask) - ``` - """ - def __init__(self, config, num_labels): - super(BertForTokenClassification, self).__init__(config) - self.num_labels = num_labels - self.bert = BertModel(config) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - self.classifier = nn.Linear(config.hidden_size, num_labels) - self.apply(self.init_bert_weights) - - def forward(self, input_ids, token_type_ids=None, attention_mask=None, labels=None): - encoded_layers, _ = self.bert(input_ids, token_type_ids, attention_mask) - sequence_output = encoded_layers[-1] - sequence_output = self.dropout(sequence_output) - logits = self.classifier(sequence_output) - - if labels is not None: - loss_fct = CrossEntropyLoss() - # Only keep active parts of the loss - if attention_mask is not None: - active_loss = attention_mask.view(-1) == 1 - active_logits = logits.view(-1, self.num_labels)[active_loss] - active_labels = labels.view(-1)[active_loss] - loss = loss_fct(active_logits, active_labels) - else: - loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1)) - return loss - else: - return logits - - -class BertForQuestionAnswering(BertPreTrainedModel): - """BERT model for Question Answering (span extraction). - This module is composed of the BERT model with a linear layer on top of - the sequence output that computes start_logits and end_logits - - Params: - `config`: a BertConfig class instance with the configuration to build a new model. - - Inputs: - `input_ids`: a torch.LongTensor of shape [batch_size, sequence_length] - with the word token indices in the vocabulary(see the tokens preprocessing logic in the scripts - `extract_features.py`, `run_classifier.py` and `run_squad.py`) - `token_type_ids`: an optional torch.LongTensor of shape [batch_size, sequence_length] with the token - types indices selected in [0, 1]. Type 0 corresponds to a `sentence A` and type 1 corresponds to - a `sentence B` token (see BERT paper for more details). - `attention_mask`: an optional torch.LongTensor of shape [batch_size, sequence_length] with indices - selected in [0, 1]. It's a mask to be used if the input sequence length is smaller than the max - input sequence length in the current batch. It's the mask that we typically use for attention when - a batch has varying length sentences. - - Outputs: - Outputs a tuple of start_logits, end_logits which are the logits respectively for the start and end - position tokens of shape [batch_size, sequence_length]. - - Example usage: - ```python - # Already been converted into WordPiece token ids - input_ids = torch.LongTensor([[31, 51, 99], [15, 5, 0]]) - input_mask = torch.LongTensor([[1, 1, 1], [1, 1, 0]]) - token_type_ids = torch.LongTensor([[0, 0, 1], [0, 1, 0]]) - - config = BertConfig(vocab_size_or_config_json_file=32000, hidden_size=768, - num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072) - - model = BertForQuestionAnswering(config) - start_logits, end_logits = model(input_ids, token_type_ids, input_mask) - ``` - """ - def __init__(self, config): - super(BertForQuestionAnswering, self).__init__(config) - self.bert = BertModel(config) - # TODO check with Google if it's normal there is no dropout on the token classifier of SQuAD in the TF version - # self.dropout = nn.Dropout(config.hidden_dropout_prob) - self.qa_outputs = nn.Linear(config.hidden_size, 2) - self.apply(self.init_bert_weights) - - def forward(self, input_ids, token_type_ids, attention_mask): - encoded_layers, _ = self.bert(input_ids, token_type_ids, attention_mask) - sequence_output = encoded_layers[-1] - logits = self.qa_outputs(sequence_output) - start_logits, end_logits = logits.split(1, dim=-1) - start_logits = start_logits.squeeze(-1) - end_logits = end_logits.squeeze(-1) - return start_logits, end_logits diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/optimization.py b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/optimization.py deleted file mode 100644 index 5881a5b5156..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/optimization.py +++ /dev/null @@ -1,174 +0,0 @@ -# coding=utf-8 -# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. -# Copyright 2018 The Google AI Language Team Authors and The HugginFace Inc. team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""PyTorch optimization for BERT model.""" - -import math -import torch -from torch.optim import Optimizer -from torch.optim.optimizer import required -from torch.nn.utils import clip_grad_norm_ -#from fused_adam_local import FusedAdam -from apex.optimizers import FusedAdam -from apex.multi_tensor_apply import multi_tensor_applier -import amp_C -from utils import is_main_process - -multi_tensor_l2norm = amp_C.multi_tensor_l2norm -lamb_compute_update = amp_C.multi_tensor_lamb_stage1_cuda -lamb_apply_update = amp_C.multi_tensor_lamb_stage2_cuda -scale = amp_C.multi_tensor_scale - - -def warmup_cosine(x, warmup=0.002): - if x < warmup: - return x/warmup - return 0.5 * (1.0 + torch.cos(math.pi * x)) - -def warmup_constant(x, warmup=0.002): - if x < warmup: - return x/warmup - return 1.0 - -def warmup_linear(x, warmup=0.002): - if x < warmup: - return x/warmup - return max((x - 1. )/ (warmup - 1.), 0.) - -def warmup_poly(x, warmup=0.002, degree=0.5): - if x < warmup: - return x/warmup - return (1.0 - x)**degree - - -SCHEDULES = { - 'warmup_cosine':warmup_cosine, - 'warmup_constant':warmup_constant, - 'warmup_linear':warmup_linear, - 'warmup_poly':warmup_poly, -} - -class BertAdam(Optimizer): - """Implements BERT version of Adam algorithm with weight decay fix. - Params: - lr: learning rate - warmup: portion of t_total for the warmup, -1 means no warmup. Default: -1 - t_total: total number of training steps for the learning - rate schedule, -1 means constant learning rate. Default: -1 - schedule: schedule to use for the warmup (see above). Default: 'warmup_linear' - b1: Adams b1. Default: 0.9 - b2: Adams b2. Default: 0.999 - e: Adams epsilon. Default: 1e-6 - weight_decay: Weight decay. Default: 0.01 - max_grad_norm: Maximum norm for the gradients (-1 means no clipping). Default: 1.0 - """ - def __init__(self, params, lr=required, warmup=-1, t_total=-1, schedule='warmup_linear', - b1=0.9, b2=0.999, e=1e-6, weight_decay=0.01, - max_grad_norm=1.0): - if lr is not required and lr < 0.0: - raise ValueError("Invalid learning rate: {} - should be >= 0.0".format(lr)) - if schedule not in SCHEDULES: - raise ValueError("Invalid schedule parameter: {}".format(schedule)) - if not 0.0 <= warmup < 1.0 and not warmup == -1: - raise ValueError("Invalid warmup: {} - should be in [0.0, 1.0[ or -1".format(warmup)) - if not 0.0 <= b1 < 1.0: - raise ValueError("Invalid b1 parameter: {} - should be in [0.0, 1.0[".format(b1)) - if not 0.0 <= b2 < 1.0: - raise ValueError("Invalid b2 parameter: {} - should be in [0.0, 1.0[".format(b2)) - if not e >= 0.0: - raise ValueError("Invalid epsilon value: {} - should be >= 0.0".format(e)) - defaults = dict(lr=lr, schedule=schedule, warmup=warmup, t_total=t_total, - b1=b1, b2=b2, e=e, weight_decay=weight_decay, - max_grad_norm=max_grad_norm) - super(BertAdam, self).__init__(params, defaults) - - def get_lr(self): - lr = [] - for group in self.param_groups: - for p in group['params']: - state = self.state[p] - if len(state) == 0: - return [0] - if group['t_total'] != -1: - schedule_fct = SCHEDULES[group['schedule']] - lr_scheduled = group['lr'] * schedule_fct(state['step']/group['t_total'], group['warmup']) - else: - lr_scheduled = group['lr'] - lr.append(lr_scheduled) - return lr - - def step(self, closure=None): - """Performs a single optimization step. - Arguments: - closure (callable, optional): A closure that reevaluates the model - and returns the loss. - """ - loss = None - if closure is not None: - loss = closure() - for group in self.param_groups: - for p in group['params']: - if p.grad is None: - continue - grad = p.grad.data - if grad.is_sparse: - raise RuntimeError('Adam does not support sparse gradients, please consider SparseAdam instead') - - state = self.state[p] - - # State initialization - if len(state) == 0: - state['step'] = 0 - # Exponential moving average of gradient values - state['next_m'] = torch.zeros_like(p.data) - # Exponential moving average of squared gradient values - state['next_v'] = torch.zeros_like(p.data) - - next_m, next_v = state['next_m'], state['next_v'] - beta1, beta2 = group['b1'], group['b2'] - - # Add grad clipping - if group['max_grad_norm'] > 0: - clip_grad_norm_(p, group['max_grad_norm']) - - # Decay the first and second moment running average coefficient - # In-place operations to update the averages at the same time - next_m.mul_(beta1).add_(1 - beta1, grad) - next_v.mul_(beta2).addcmul_(1 - beta2, grad, grad) - update = next_m / (next_v.sqrt() + group['e']) - - # Just adding the square of the weights to the loss function is *not* - # the correct way of using L2 regularization/weight decay with Adam, - # since that will interact with the m and v parameters in strange ways. - # - # Instead we want to decay the weights in a manner that doesn't interact - # with the m/v parameters. This is equivalent to adding the square - # of the weights to the loss with plain (non-momentum) SGD. - if group['weight_decay'] > 0.0: - update += group['weight_decay'] * p.data - - if group['t_total'] != -1: - schedule_fct = SCHEDULES[group['schedule']] - lr_scheduled = group['lr'] * schedule_fct(state['step']/group['t_total'], group['warmup']) - else: - lr_scheduled = group['lr'] - - update_with_lr = lr_scheduled * update - p.data.add_(-update_with_lr) - - state['step'] += 1 - - return loss diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/requirements.txt b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/requirements.txt deleted file mode 100644 index 9741bff445c..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/requirements.txt +++ /dev/null @@ -1,18 +0,0 @@ -# progress bars in model download and training scripts -tqdm -# Accessing files from S3 directly. -boto3 -# Used for downloading models over HTTP -requests -six -ipdb -#Data processing -h5py -nltk -progressbar -#Others -numpy -onnxruntime -requests -urllib3 -git+https://github.com/NVIDIA/dllogger diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/run_squad_sparse.py b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/run_squad_sparse.py deleted file mode 100644 index 864c3cb8666..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/run_squad_sparse.py +++ /dev/null @@ -1,1285 +0,0 @@ -# coding=utf-8 -# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. -# Copyright 2018 The Google AI Language Team Authors and The HugginFace Inc. team. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Run BERT on SQuAD.""" - -from __future__ import absolute_import, division, print_function - -import argparse -import collections -import dllogger, time -import json -import logging -import math -import modeling -import numpy as np -import os -import random -import sys -import torch -from apex import amp -from file_utils import PYTORCH_PRETRAINED_BERT_CACHE -from io import open -from optimization import BertAdam, warmup_linear -from schedulers import LinearWarmUpScheduler -from torch.utils.data import( - DataLoader, - RandomSampler, - SequentialSampler, - TensorDataset -) -from torch.utils.data.distributed import DistributedSampler -from tqdm import tqdm -from tokenization import (BasicTokenizer, BertTokenizer, whitespace_tokenize) -from utils import is_main_process, format_step -import builtins -import io - -safe_builtins = { - 'range', - 'complex', - 'set', - 'frozenset', - 'slice', -} - -torch._C._jit_set_profiling_mode(False) -torch._C._jit_set_profiling_executor(False) - -if sys.version_info[0] == 2: - import cPickle as pickle -else: - import pickle - -logging.basicConfig(format='%(asctime)s - %(levelname)s - %(name)s - %(message)s', - datefmt='%m/%d/%Y %H:%M:%S', - level=logging.INFO) -logger = logging.getLogger(__name__) - - -class SquadExample(object): - """ - A single training/test example for the Squad dataset. - For examples without an answer, the start and end position are -1. - """ - - def __init__(self, - qas_id, - question_text, - doc_tokens, - orig_answer_text=None, - start_position=None, - end_position=None, - is_impossible=None): - self.qas_id = qas_id - self.question_text = question_text - self.doc_tokens = doc_tokens - self.orig_answer_text = orig_answer_text - self.start_position = start_position - self.end_position = end_position - self.is_impossible = is_impossible - - def __str__(self): - return self.__repr__() - - def __repr__(self): - s = "" - s += "qas_id: %s" % (self.qas_id) - s += ", question_text: %s" % ( - self.question_text) - s += ", doc_tokens: [%s]" % (" ".join(self.doc_tokens)) - if self.start_position: - s += ", start_position: %d" % (self.start_position) - if self.end_position: - s += ", end_position: %d" % (self.end_position) - if self.is_impossible: - s += ", is_impossible: %r" % (self.is_impossible) - return s - - -class InputFeatures(object): - """A single set of features of data.""" - - def __init__(self, - unique_id, - example_index, - doc_span_index, - tokens, - token_to_orig_map, - token_is_max_context, - input_ids, - input_mask, - segment_ids, - start_position=None, - end_position=None, - is_impossible=None): - self.unique_id = unique_id - self.example_index = example_index - self.doc_span_index = doc_span_index - self.tokens = tokens - self.token_to_orig_map = token_to_orig_map - self.token_is_max_context = token_is_max_context - self.input_ids = input_ids - self.input_mask = input_mask - self.segment_ids = segment_ids - self.start_position = start_position - self.end_position = end_position - self.is_impossible = is_impossible - - -def read_squad_examples(input_file, is_training, version_2_with_negative): - """Read a SQuAD json file into a list of SquadExample.""" - with open(input_file, "r", encoding='utf-8') as reader: - input_data = json.load(reader)["data"] - - def is_whitespace(c): - if c == " " or c == "\t" or c == "\r" or c == "\n" or ord(c) == 0x202F: - return True - return False - - examples = [] - for entry in input_data: - for paragraph in entry["paragraphs"]: - paragraph_text = paragraph["context"] - doc_tokens = [] - char_to_word_offset = [] - prev_is_whitespace = True - for c in paragraph_text: - if is_whitespace(c): - prev_is_whitespace = True - else: - if prev_is_whitespace: - doc_tokens.append(c) - else: - doc_tokens[-1] += c - prev_is_whitespace = False - char_to_word_offset.append(len(doc_tokens) - 1) - - for qa in paragraph["qas"]: - qas_id = qa["id"] - question_text = qa["question"] - start_position = None - end_position = None - orig_answer_text = None - is_impossible = False - if is_training: - if version_2_with_negative: - is_impossible = qa["is_impossible"] - if (len(qa["answers"]) != 1) and (not is_impossible): - raise ValueError( - "For training, each question should have exactly 1 answer.") - if not is_impossible: - answer = qa["answers"][0] - orig_answer_text = answer["text"] - answer_offset = answer["answer_start"] - answer_length = len(orig_answer_text) - start_position = char_to_word_offset[answer_offset] - end_position = char_to_word_offset[answer_offset + answer_length - 1] - # Only add answers where the text can be exactly recovered from the - # document. If this CAN'T happen it's likely due to weird Unicode - # stuff so we will just skip the example. - # - # Note that this means for training mode, every example is NOT - # guaranteed to be preserved. - actual_text = " ".join(doc_tokens[start_position:(end_position + 1)]) - cleaned_answer_text = " ".join( - whitespace_tokenize(orig_answer_text)) - if actual_text.find(cleaned_answer_text) == -1: - logger.warning("Could not find answer: '%s' vs. '%s'", - actual_text, cleaned_answer_text) - continue - else: - start_position = -1 - end_position = -1 - orig_answer_text = "" - - example = SquadExample( - qas_id=qas_id, - question_text=question_text, - doc_tokens=doc_tokens, - orig_answer_text=orig_answer_text, - start_position=start_position, - end_position=end_position, - is_impossible=is_impossible) - examples.append(example) - return examples - - -def convert_examples_to_features(examples, tokenizer, max_seq_length, - doc_stride, max_query_length, is_training): - """Loads a data file into a list of `InputBatch`s.""" - - unique_id = 1000000000 - - features = [] - for (example_index, example) in enumerate(examples): - query_tokens = tokenizer.tokenize(example.question_text) - - if len(query_tokens) > max_query_length: - query_tokens = query_tokens[0:max_query_length] - - tok_to_orig_index = [] - orig_to_tok_index = [] - all_doc_tokens = [] - for (i, token) in enumerate(example.doc_tokens): - orig_to_tok_index.append(len(all_doc_tokens)) - sub_tokens = tokenizer.tokenize(token) - for sub_token in sub_tokens: - tok_to_orig_index.append(i) - all_doc_tokens.append(sub_token) - - tok_start_position = None - tok_end_position = None - if is_training and example.is_impossible: - tok_start_position = -1 - tok_end_position = -1 - if is_training and not example.is_impossible: - tok_start_position = orig_to_tok_index[example.start_position] - if example.end_position < len(example.doc_tokens) - 1: - tok_end_position = orig_to_tok_index[example.end_position + 1] - 1 - else: - tok_end_position = len(all_doc_tokens) - 1 - (tok_start_position, tok_end_position) = _improve_answer_span( - all_doc_tokens, tok_start_position, tok_end_position, tokenizer, - example.orig_answer_text) - - # The -3 accounts for [CLS], [SEP] and [SEP] - max_tokens_for_doc = max_seq_length - len(query_tokens) - 3 - - # We can have documents that are longer than the maximum sequence length. - # To deal with this we do a sliding window approach, where we take chunks - # of the up to our max length with a stride of `doc_stride`. - _DocSpan = collections.namedtuple( # pylint: disable=invalid-name - "DocSpan", ["start", "length"]) - doc_spans = [] - start_offset = 0 - while start_offset < len(all_doc_tokens): - length = len(all_doc_tokens) - start_offset - if length > max_tokens_for_doc: - length = max_tokens_for_doc - doc_spans.append(_DocSpan(start=start_offset, length=length)) - if start_offset + length == len(all_doc_tokens): - break - start_offset += min(length, doc_stride) - - for (doc_span_index, doc_span) in enumerate(doc_spans): - tokens = [] - token_to_orig_map = {} - token_is_max_context = {} - segment_ids = [] - tokens.append("[CLS]") - segment_ids.append(0) - for token in query_tokens: - tokens.append(token) - segment_ids.append(0) - tokens.append("[SEP]") - segment_ids.append(0) - - for i in range(doc_span.length): - split_token_index = doc_span.start + i - token_to_orig_map[len(tokens)] = tok_to_orig_index[split_token_index] - - is_max_context = _check_is_max_context(doc_spans, doc_span_index, - split_token_index) - token_is_max_context[len(tokens)] = is_max_context - tokens.append(all_doc_tokens[split_token_index]) - segment_ids.append(1) - tokens.append("[SEP]") - segment_ids.append(1) - - input_ids = tokenizer.convert_tokens_to_ids(tokens) - - # The mask has 1 for real tokens and 0 for padding tokens. Only real - # tokens are attended to. - input_mask = [1] * len(input_ids) - - # Zero-pad up to the sequence length. - while len(input_ids) < max_seq_length: - input_ids.append(0) - input_mask.append(0) - segment_ids.append(0) - - assert len(input_ids) == max_seq_length - assert len(input_mask) == max_seq_length - assert len(segment_ids) == max_seq_length - - start_position = None - end_position = None - if is_training and not example.is_impossible: - # For training, if our document chunk does not contain an annotation - # we throw it out, since there is nothing to predict. - doc_start = doc_span.start - doc_end = doc_span.start + doc_span.length - 1 - out_of_span = False - if not (tok_start_position >= doc_start and - tok_end_position <= doc_end): - out_of_span = True - if out_of_span: - start_position = 0 - end_position = 0 - else: - doc_offset = len(query_tokens) + 2 - start_position = tok_start_position - doc_start + doc_offset - end_position = tok_end_position - doc_start + doc_offset - if is_training and example.is_impossible: - start_position = 0 - end_position = 0 - - features.append( - InputFeatures( - unique_id=unique_id, - example_index=example_index, - doc_span_index=doc_span_index, - tokens=tokens, - token_to_orig_map=token_to_orig_map, - token_is_max_context=token_is_max_context, - input_ids=input_ids, - input_mask=input_mask, - segment_ids=segment_ids, - start_position=start_position, - end_position=end_position, - is_impossible=example.is_impossible)) - unique_id += 1 - - return features - - -def _improve_answer_span(doc_tokens, input_start, input_end, tokenizer, - orig_answer_text): - """Returns tokenized answer spans that better match the annotated answer.""" - - # The SQuAD annotations are character based. We first project them to - # whitespace-tokenized words. But then after WordPiece tokenization, we can - # often find a "better match". For example: - # - # Question: What year was John Smith born? - # Context: The leader was John Smith (1895-1943). - # Answer: 1895 - # - # The original whitespace-tokenized answer will be "(1895-1943).". However - # after tokenization, our tokens will be "( 1895 - 1943 ) .". So we can match - # the exact answer, 1895. - # - # However, this is not always possible. Consider the following: - # - # Question: What country is the top exporter of electornics? - # Context: The Japanese electronics industry is the lagest in the world. - # Answer: Japan - # - # In this case, the annotator chose "Japan" as a character sub-span of - # the word "Japanese". Since our WordPiece tokenizer does not split - # "Japanese", we just use "Japanese" as the annotation. This is fairly rare - # in SQuAD, but does happen. - tok_answer_text = " ".join(tokenizer.tokenize(orig_answer_text)) - - for new_start in range(input_start, input_end + 1): - for new_end in range(input_end, new_start - 1, -1): - text_span = " ".join(doc_tokens[new_start:(new_end + 1)]) - if text_span == tok_answer_text: - return (new_start, new_end) - - return (input_start, input_end) - - -def _check_is_max_context(doc_spans, cur_span_index, position): - """Check if this is the 'max context' doc span for the token.""" - - # Because of the sliding window approach taken to scoring documents, a single - # token can appear in multiple documents. E.g. - # Doc: the man went to the store and bought a gallon of milk - # Span A: the man went to the - # Span B: to the store and bought - # Span C: and bought a gallon of - # ... - # - # Now the word 'bought' will have two scores from spans B and C. We only - # want to consider the score with "maximum context", which we define as - # the *minimum* of its left and right context (the *sum* of left and - # right context will always be the same, of course). - # - # In the example the maximum context for 'bought' would be span C since - # it has 1 left context and 3 right context, while span B has 4 left context - # and 0 right context. - best_score = None - best_span_index = None - for (span_index, doc_span) in enumerate(doc_spans): - end = doc_span.start + doc_span.length - 1 - if position < doc_span.start: - continue - if position > end: - continue - num_left_context = position - doc_span.start - num_right_context = end - position - score = min(num_left_context, num_right_context) + 0.01 * doc_span.length - if best_score is None or score > best_score: - best_score = score - best_span_index = span_index - - return cur_span_index == best_span_index - - -RawResult = collections.namedtuple("RawResult", - ["unique_id", "start_logits", "end_logits"]) - - -def get_answers(examples, features, results, args): - predictions = collections.defaultdict(list) #it is possible that one example corresponds to multiple features - Prediction = collections.namedtuple('Prediction', ['text', 'start_logit', 'end_logit']) - - if args.version_2_with_negative: - null_vals = collections.defaultdict(lambda: (float("inf"),0,0)) - for ex, feat, result in match_results(examples, features, results): - start_indices = _get_best_indices(result.start_logits, args.n_best_size) - end_indices = _get_best_indices(result.end_logits, args.n_best_size) - prelim_predictions = get_valid_prelim_predictions(start_indices, end_indices, feat, result, args) - prelim_predictions = sorted( - prelim_predictions, - key=lambda x: (x.start_logit + x.end_logit), - reverse=True) - if args.version_2_with_negative: - score = result.start_logits[0] + result.end_logits[0] - if score < null_vals[ex.qas_id][0]: - null_vals[ex.qas_id] = (score, result.start_logits[0], result.end_logits[0]) - - curr_predictions = [] - seen_predictions = [] - for pred in prelim_predictions: - if len(curr_predictions) == args.n_best_size: - break - if pred.start_index > 0: # this is a non-null prediction TODO: this probably is irrelevant - final_text = get_answer_text(ex, feat, pred, args) - if final_text in seen_predictions: - continue - else: - final_text = "" - - seen_predictions.append(final_text) - curr_predictions.append(Prediction(final_text, pred.start_logit, pred.end_logit)) - predictions[ex.qas_id] += curr_predictions - - #Add empty prediction - if args.version_2_with_negative: - for qas_id in predictions.keys(): - predictions[qas_id].append(Prediction('', - null_vals[ex.qas_id][1], - null_vals[ex.qas_id][2])) - - - nbest_answers = collections.defaultdict(list) - answers = {} - for qas_id, preds in predictions.items(): - nbest = sorted( - preds, - key=lambda x: (x.start_logit + x.end_logit), - reverse=True)[:args.n_best_size] - - # In very rare edge cases we could only have single null prediction. - # So we just create a nonce prediction in this case to avoid failure. - if not nbest: - nbest.append(Prediction(text="empty", start_logit=0.0, end_logit=0.0)) - - total_scores = [] - best_non_null_entry = None - for entry in nbest: - total_scores.append(entry.start_logit + entry.end_logit) - if not best_non_null_entry and entry.text: - best_non_null_entry = entry - probs = _compute_softmax(total_scores) - for (i, entry) in enumerate(nbest): - output = collections.OrderedDict() - output["text"] = entry.text - output["probability"] = probs[i] - output["start_logit"] = entry.start_logit - output["end_logit"] = entry.end_logit - nbest_answers[qas_id].append(output) - if args.version_2_with_negative: - score_diff = null_vals[qas_id][0] - best_non_null_entry.start_logit - best_non_null_entry.end_logit - if score_diff > args.null_score_diff_threshold: - answers[qas_id] = "" - else: - answers[qas_id] = best_non_null_entry.text - else: - answers[qas_id] = nbest_answers[qas_id][0]['text'] - - return answers, nbest_answers - -def get_answer_text(example, feature, pred, args): - tok_tokens = feature.tokens[pred.start_index:(pred.end_index + 1)] - orig_doc_start = feature.token_to_orig_map[pred.start_index] - orig_doc_end = feature.token_to_orig_map[pred.end_index] - orig_tokens = example.doc_tokens[orig_doc_start:(orig_doc_end + 1)] - tok_text = " ".join(tok_tokens) - - # De-tokenize WordPieces that have been split off. - tok_text = tok_text.replace(" ##", "") - tok_text = tok_text.replace("##", "") - - # Clean whitespace - tok_text = tok_text.strip() - tok_text = " ".join(tok_text.split()) - orig_text = " ".join(orig_tokens) - - final_text = get_final_text(tok_text, orig_text, args.do_lower_case, args.verbose_logging) - return final_text - -def get_valid_prelim_predictions(start_indices, end_indices, feature, result, args): - - _PrelimPrediction = collections.namedtuple( - "PrelimPrediction", - ["start_index", "end_index", "start_logit", "end_logit"]) - prelim_predictions = [] - for start_index in start_indices: - for end_index in end_indices: - if start_index >= len(feature.tokens): - continue - if end_index >= len(feature.tokens): - continue - if start_index not in feature.token_to_orig_map: - continue - if end_index not in feature.token_to_orig_map: - continue - if not feature.token_is_max_context.get(start_index, False): - continue - if end_index < start_index: - continue - length = end_index - start_index + 1 - if length > args.max_answer_length: - continue - prelim_predictions.append( - _PrelimPrediction( - start_index=start_index, - end_index=end_index, - start_logit=result.start_logits[start_index], - end_logit=result.end_logits[end_index])) - return prelim_predictions - -def match_results(examples, features, results): - unique_f_ids = set([f.unique_id for f in features]) - unique_r_ids = set([r.unique_id for r in results]) - matching_ids = unique_f_ids & unique_r_ids - features = [f for f in features if f.unique_id in matching_ids] - results = [r for r in results if r.unique_id in matching_ids] - features.sort(key=lambda x: x.unique_id) - results.sort(key=lambda x: x.unique_id) - - for f, r in zip(features, results): #original code assumes strict ordering of examples. TODO: rewrite this - yield examples[f.example_index], f, r - -def get_final_text(pred_text, orig_text, do_lower_case, verbose_logging=False): - """Project the tokenized prediction back to the original text.""" - - # When we created the data, we kept track of the alignment between original - # (whitespace tokenized) tokens and our WordPiece tokenized tokens. So - # now `orig_text` contains the span of our original text corresponding to the - # span that we predicted. - # - # However, `orig_text` may contain extra characters that we don't want in - # our prediction. - # - # For example, let's say: - # pred_text = steve smith - # orig_text = Steve Smith's - # - # We don't want to return `orig_text` because it contains the extra "'s". - # - # We don't want to return `pred_text` because it's already been normalized - # (the SQuAD eval script also does punctuation stripping/lower casing but - # our tokenizer does additional normalization like stripping accent - # characters). - # - # What we really want to return is "Steve Smith". - # - # Therefore, we have to apply a semi-complicated alignment heruistic between - # `pred_text` and `orig_text` to get a character-to-charcter alignment. This - # can fail in certain cases in which case we just return `orig_text`. - - def _strip_spaces(text): - ns_chars = [] - ns_to_s_map = collections.OrderedDict() - for (i, c) in enumerate(text): - if c == " ": - continue - ns_to_s_map[len(ns_chars)] = i - ns_chars.append(c) - ns_text = "".join(ns_chars) - return (ns_text, ns_to_s_map) - - # We first tokenize `orig_text`, strip whitespace from the result - # and `pred_text`, and check if they are the same length. If they are - # NOT the same length, the heuristic has failed. If they are the same - # length, we assume the characters are one-to-one aligned. - - tokenizer = BasicTokenizer(do_lower_case=do_lower_case) - - tok_text = " ".join(tokenizer.tokenize(orig_text)) - - start_position = tok_text.find(pred_text) - if start_position == -1: - if verbose_logging: - logger.info( - "Unable to find text: '%s' in '%s'" % (pred_text, orig_text)) - return orig_text - end_position = start_position + len(pred_text) - 1 - - (orig_ns_text, orig_ns_to_s_map) = _strip_spaces(orig_text) - (tok_ns_text, tok_ns_to_s_map) = _strip_spaces(tok_text) - - if len(orig_ns_text) != len(tok_ns_text): - if verbose_logging: - logger.info("Length not equal after stripping spaces: '%s' vs '%s'", - orig_ns_text, tok_ns_text) - return orig_text - - # We then project the characters in `pred_text` back to `orig_text` using - # the character-to-character alignment. - tok_s_to_ns_map = {} - for (i, tok_index) in tok_ns_to_s_map.items(): - tok_s_to_ns_map[tok_index] = i - - orig_start_position = None - if start_position in tok_s_to_ns_map: - ns_start_position = tok_s_to_ns_map[start_position] - if ns_start_position in orig_ns_to_s_map: - orig_start_position = orig_ns_to_s_map[ns_start_position] - - if orig_start_position is None: - if verbose_logging: - logger.info("Couldn't map start position") - return orig_text - - orig_end_position = None - if end_position in tok_s_to_ns_map: - ns_end_position = tok_s_to_ns_map[end_position] - if ns_end_position in orig_ns_to_s_map: - orig_end_position = orig_ns_to_s_map[ns_end_position] - - if orig_end_position is None: - if verbose_logging: - logger.info("Couldn't map end position") - return orig_text - - output_text = orig_text[orig_start_position:(orig_end_position + 1)] - return output_text - - -def _get_best_indices(logits, n_best_size): - """Get the n-best logits from a list.""" - index_and_score = sorted(enumerate(logits), key=lambda x: x[1], reverse=True) - - best_indices = [] - for i in range(len(index_and_score)): - if i >= n_best_size: - break - best_indices.append(index_and_score[i][0]) - return best_indices - - -def _compute_softmax(scores): - """Compute softmax probability over raw logits.""" - if not scores: - return [] - - max_score = None - for score in scores: - if max_score is None or score > max_score: - max_score = score - - exp_scores = [] - total_sum = 0.0 - for score in scores: - x = math.exp(score - max_score) - exp_scores.append(x) - total_sum += x - - probs = [] - for score in exp_scores: - probs.append(score / total_sum) - return probs - - - -from apex.multi_tensor_apply import multi_tensor_applier -class GradientClipper: - """ - Clips gradient norm of an iterable of parameters. - """ - def __init__(self, max_grad_norm): - self.max_norm = max_grad_norm - if multi_tensor_applier.available: - import amp_C - self._overflow_buf = torch.cuda.IntTensor([0]) - self.multi_tensor_l2norm = amp_C.multi_tensor_l2norm - self.multi_tensor_scale = amp_C.multi_tensor_scale - else: - raise RuntimeError('Gradient clipping requires cuda extensions') - - def step(self, parameters): - l = [p.grad for p in parameters if p.grad is not None] - total_norm, _ = multi_tensor_applier(self.multi_tensor_l2norm, self._overflow_buf, [l], False) - total_norm = total_norm.item() - if (total_norm == float('inf')): return - clip_coef = self.max_norm / (total_norm + 1e-6) - if clip_coef < 1: - multi_tensor_applier(self.multi_tensor_scale, self._overflow_buf, [l, l], clip_coef) - -class RestrictedUnpickler(pickle.Unpickler): - - def find_class(self, module, name): - # Only allow safe classes from builtins. - if module == "builtins" and name in safe_builtins: - return getattr(builtins, name) - # Forbid everything else. - raise pickle.UnpicklingError("global '%s.%s' is forbidden" % - (module, name)) - -def restricted_loads(s): - """Helper function analogous to pickle.loads().""" - return RestrictedUnpickler(io.BytesIO(s)).load() - - -def train_func(model, agent, args, dllogger, global_step, train_examples, num_train_optimization_steps, n_gpu, device, optimizer): - model = agent.model.model - - if args.cache_dir is None: - cached_train_features_file = args.train_file + '_{0}_{1}_{2}_{3}'.format( - list(filter(None, args.bert_model.split('/'))).pop(), str(args.max_seq_length), str(args.doc_stride), - str(args.max_query_length)) - else: - cached_train_features_file = args.cache_dir.strip('/') + '/' + args.train_file.split('/')[-1] + '_{0}_{1}_{2}_{3}'.format( - list(filter(None, args.bert_model.split('/'))).pop(), str(args.max_seq_length), str(args.doc_stride), - str(args.max_query_length)) - - train_features = None - try: - with open(cached_train_features_file, "rb") as reader: - train_features = restricted_loads(reader) - except: - train_features = convert_examples_to_features( - examples=train_examples, - tokenizer=tokenizer, - max_seq_length=args.max_seq_length, - doc_stride=args.doc_stride, - max_query_length=args.max_query_length, - is_training=True) - - if not args.skip_cache and is_main_process(): - dllogger.log(step="PARAMETER", data={"Cached_train features_file": cached_train_features_file}) - with open(cached_train_features_file, "wb") as writer: - pickle.dump(train_features, writer) - - dllogger.log(step="PARAMETER", data={"train_start": True}) - dllogger.log(step="PARAMETER", data={"training_samples": len(train_examples)}) - dllogger.log(step="PARAMETER", data={"training_features": len(train_features)}) - dllogger.log(step="PARAMETER", data={"train_batch_size":args.train_batch_size}) - dllogger.log(step="PARAMETER", data={"steps":num_train_optimization_steps}) - all_input_ids = torch.tensor([f.input_ids for f in train_features], dtype=torch.long) - all_input_mask = torch.tensor([f.input_mask for f in train_features], dtype=torch.long) - all_segment_ids = torch.tensor([f.segment_ids for f in train_features], dtype=torch.long) - all_start_positions = torch.tensor([f.start_position for f in train_features], dtype=torch.long) - all_end_positions = torch.tensor([f.end_position for f in train_features], dtype=torch.long) - train_data = TensorDataset(all_input_ids, all_input_mask, all_segment_ids, - all_start_positions, all_end_positions) - if args.local_rank == -1: - train_sampler = RandomSampler(train_data) - else: - train_sampler = DistributedSampler(train_data) - train_dataloader = DataLoader(train_data, sampler=train_sampler, batch_size=args.train_batch_size * n_gpu) - - args.train_features = train_features - model.train() - gradClipper = GradientClipper(max_grad_norm=1.0) - final_loss = None - train_start = time.time() - - #pruning - agent.pre_epoch_begin() - - for epoch in range(int(args.num_train_epochs)): - train_iter = tqdm(train_dataloader, desc="Iteration", disable=args.disable_progress_bar) if is_main_process() else train_dataloader - agent.on_epoch_begin(epoch) - for step, batch in enumerate(train_iter): - # Terminate early for benchmarking - - agent.on_batch_begin(step) - - if args.max_steps > 0 and global_step > args.max_steps: - break - - if n_gpu == 1: - batch = tuple(t.to(device) for t in batch) # multi-gpu does scattering it-self - input_ids, input_mask, segment_ids, start_positions, end_positions = batch - start_logits, end_logits = model(input_ids, segment_ids, input_mask) - # If we are on multi-GPU, split add a dimension - if len(start_positions.size()) > 1: - start_positions = start_positions.squeeze(-1) - if len(end_positions.size()) > 1: - end_positions = end_positions.squeeze(-1) - # sometimes the start/end positions are outside our model inputs, we ignore these terms - ignored_index = start_logits.size(1) - start_positions.clamp_(0, ignored_index) - end_positions.clamp_(0, ignored_index) - - loss_fct = torch.nn.CrossEntropyLoss(ignore_index=ignored_index) - start_loss = loss_fct(start_logits, start_positions) - end_loss = loss_fct(end_logits, end_positions) - loss = (start_loss + end_loss) / 2 - if n_gpu > 1: - loss = loss.mean() # mean() to average on multi-gpu. - if args.gradient_accumulation_steps > 1: - loss = loss / args.gradient_accumulation_steps - if args.fp16: - with amp.scale_loss(loss, optimizer) as scaled_loss: - scaled_loss.backward() - else: - loss.backward() - - # gradient clipping - gradClipper.step(amp.master_params(optimizer)) - - if (step + 1) % args.gradient_accumulation_steps == 0: - if args.fp16 : - # modify learning rate with special warm up for BERT which FusedAdam doesn't do - scheduler.step() - - optimizer.step() - agent.on_post_grad() - optimizer.zero_grad() - - global_step += 1 - - final_loss = loss.item() - if step % args.log_freq == 0: - dllogger.log(step=(epoch, global_step,), data={"step_loss": final_loss, - "learning_rate": optimizer.param_groups[0]['lr']}) - - agent.on_batch_end() - - agent.on_epoch_end() - args.time_to_train = time.time() - train_start - args.final_loss = final_loss - -def eval_func(model, args, dllogger, tokenizer, device): - if not args.do_train and args.fp16: - model.half() - - eval_examples = read_squad_examples( - input_file=args.predict_file, is_training=False, version_2_with_negative=args.version_2_with_negative) - eval_features = convert_examples_to_features( - examples=eval_examples, - tokenizer=tokenizer, - max_seq_length=args.max_seq_length, - doc_stride=args.doc_stride, - max_query_length=args.max_query_length, - is_training=False) - - dllogger.log(step="PARAMETER", data={"infer_start": True}) - dllogger.log(step="PARAMETER", data={"eval_samples": len(eval_examples)}) - dllogger.log(step="PARAMETER", data={"eval_features": len(eval_features)}) - dllogger.log(step="PARAMETER", data={"predict_batch_size": args.predict_batch_size}) - - all_input_ids = torch.tensor([f.input_ids for f in eval_features], dtype=torch.long) - all_input_mask = torch.tensor([f.input_mask for f in eval_features], dtype=torch.long) - all_segment_ids = torch.tensor([f.segment_ids for f in eval_features], dtype=torch.long) - all_example_index = torch.arange(all_input_ids.size(0), dtype=torch.long) - eval_data = TensorDataset(all_input_ids, all_input_mask, all_segment_ids, all_example_index) - # Run prediction for full data - eval_sampler = SequentialSampler(eval_data) - eval_dataloader = DataLoader(eval_data, sampler=eval_sampler, batch_size=args.predict_batch_size) - - args.eval_features = eval_features - infer_start = time.time() - model.eval() - all_results = [] - dllogger.log(step="PARAMETER", data={"eval_start": True}) - for input_ids, input_mask, segment_ids, example_indices in tqdm(eval_dataloader, desc="Evaluating", disable=args.disable_progress_bar): - if len(all_results) % 1000 == 0: - dllogger.log(step="PARAMETER", data={"sample_number": len(all_results)}) - input_ids = input_ids.to(device) - input_mask = input_mask.to(device) - segment_ids = segment_ids.to(device) - with torch.no_grad(): - batch_start_logits, batch_end_logits = model(input_ids, segment_ids, input_mask) - for i, example_index in enumerate(example_indices): - start_logits = batch_start_logits[i].detach().cpu().tolist() - end_logits = batch_end_logits[i].detach().cpu().tolist() - eval_feature = eval_features[example_index.item()] - unique_id = int(eval_feature.unique_id) - all_results.append(RawResult(unique_id=unique_id, - start_logits=start_logits, - end_logits=end_logits)) - - time_to_infer = time.time() - infer_start - output_prediction_file = os.path.join(args.output_dir, "predictions.json") - output_nbest_file = os.path.join(args.output_dir, "nbest_predictions.json") - - answers, nbest_answers = get_answers(eval_examples, eval_features, all_results, args) - with open(output_prediction_file, "w") as f: - f.write(json.dumps(answers, indent=4) + "\n") - with open(output_nbest_file, "w") as f: - f.write(json.dumps(nbest_answers, indent=4) + "\n") - - # output_null_log_odds_file = os.path.join(args.output_dir, "null_odds.json") - # write_predictions(eval_examples, eval_features, all_results, - # args.n_best_size, args.max_answer_length, - # args.do_lower_case, output_prediction_file, - # output_nbest_file, output_null_log_odds_file, args.verbose_logging, - # args.version_2_with_negative, args.null_score_diff_threshold) - - if args.do_eval and is_main_process(): - import sys - import subprocess - import shlex - eval_out = subprocess.check_output([sys.executable, shlex.quote(args.eval_script), - shlex.quote(args.predict_file), shlex.quote(args.output_dir) + "/predictions.json"]) - scores = str(eval_out).strip() - exact_match = float(scores.split(":")[1].split(",")[0]) - f1 = float(scores.split(":")[2].split("}")[0]) - args.exact_match = exact_match - args.f1 = f1 - args.time_to_infer = time_to_infer - -def main(): - parser = argparse.ArgumentParser() - - ## Required parameters - parser.add_argument("--bert_model", default=None, type=str, required=True, - help="Bert pre-trained model selected in the list: bert-base-uncased, " - "bert-large-uncased, bert-base-cased, bert-large-cased, bert-base-multilingual-uncased, " - "bert-base-multilingual-cased, bert-base-chinese.") - parser.add_argument("--output_dir", default=None, type=str, required=True, - help="The output directory where the model checkpoints and predictions will be written.") - parser.add_argument("--init_checkpoint", - default=None, - type=str, - required=True, - help="The checkpoint file from pretraining") - - ## Other parameters - parser.add_argument("--train_file", default=None, type=str, help="SQuAD json for training. E.g., train-v1.1.json") - parser.add_argument("--predict_file", default=None, type=str, - help="SQuAD json for predictions. E.g., dev-v1.1.json or test-v1.1.json") - parser.add_argument("--max_seq_length", default=384, type=int, - help="The maximum total input sequence length after WordPiece tokenization. Sequences " - "longer than this will be truncated, and sequences shorter than this will be padded.") - parser.add_argument("--doc_stride", default=128, type=int, - help="When splitting up a long document into chunks, how much stride to take between chunks.") - parser.add_argument("--max_query_length", default=64, type=int, - help="The maximum number of tokens for the question. Questions longer than this will " - "be truncated to this length.") - parser.add_argument("--do_train", action='store_true', help="Whether to run training.") - parser.add_argument("--do_predict", action='store_true', help="Whether to run eval on the dev set.") - parser.add_argument("--train_batch_size", default=32, type=int, help="Total batch size for training.") - parser.add_argument("--predict_batch_size", default=8, type=int, help="Total batch size for predictions.") - parser.add_argument("--learning_rate", default=5e-5, type=float, help="The initial learning rate for Adam.") - parser.add_argument("--num_train_epochs", default=3.0, type=float, - help="Total number of training epochs to perform.") - parser.add_argument("--max_steps", default=-1.0, type=float, - help="Total number of training steps to perform.") - parser.add_argument("--warmup_proportion", default=0.1, type=float, - help="Proportion of training to perform linear learning rate warmup for. E.g., 0.1 = 10%% " - "of training.") - parser.add_argument("--n_best_size", default=20, type=int, - help="The total number of n-best predictions to generate in the nbest_predictions.json " - "output file.") - parser.add_argument("--max_answer_length", default=30, type=int, - help="The maximum length of an answer that can be generated. This is needed because the start " - "and end predictions are not conditioned on one another.") - parser.add_argument("--verbose_logging", action='store_true', - help="If true, all of the warnings related to data processing will be printed. " - "A number of warnings are expected for a normal SQuAD evaluation.") - parser.add_argument("--no_cuda", - action='store_true', - help="Whether not to use CUDA when available") - parser.add_argument('--seed', - type=int, - default=42, - help="random seed for initialization") - parser.add_argument('--gradient_accumulation_steps', - type=int, - default=1, - help="Number of updates steps to accumulate before performing a backward/update pass.") - parser.add_argument("--do_lower_case", - action='store_true', - help="Whether to lower case the input text. True for uncased models, False for cased models.") - parser.add_argument("--local_rank", - type=int, - default=os.getenv('LOCAL_RANK', -1), - help="local_rank for distributed training on gpus") - parser.add_argument('--fp16', - default=False, - action='store_true', - help="Mixed precision training") - parser.add_argument('--amp', - default=False, - action='store_true', - help="Mixed precision training") - parser.add_argument('--loss_scale', - type=float, default=0, - help="Loss scaling to improve fp16 numeric stability. Only used when fp16 set to True.\n" - "0 (default value): dynamic loss scaling.\n" - "Positive power of 2: static loss scaling value.\n") - parser.add_argument('--version_2_with_negative', - action='store_true', - help='If true, the SQuAD examples contain some that do not have an answer.') - parser.add_argument('--null_score_diff_threshold', - type=float, default=0.0, - help="If null_score - best_non_null is greater than the threshold predict null.") - parser.add_argument('--vocab_file', - type=str, default=None, required=True, - help="Vocabulary mapping/file BERT was pretrainined on") - parser.add_argument("--config_file", - default=None, - type=str, - required=True, - help="The BERT model config") - parser.add_argument('--log_freq', - type=int, default=50, - help='frequency of logging loss.') - parser.add_argument('--json-summary', type=str, default="results/dllogger.json", - help='If provided, the json summary will be written to' - 'the specified file.') - parser.add_argument("--eval_script", - help="Script to evaluate squad predictions", - default="evaluate.py", - type=str) - parser.add_argument("--do_eval", - action='store_true', - help="Whether to use evaluate accuracy of predictions") - parser.add_argument("--use_env", - action='store_true', - help="Whether to read local rank from ENVVAR") - parser.add_argument('--skip_checkpoint', - default=False, - action='store_true', - help="Whether to save checkpoints") - parser.add_argument('--disable-progress-bar', - default=False, - action='store_true', - help='Disable tqdm progress bar') - parser.add_argument("--skip_cache", - default=False, - action='store_true', - help="Whether to cache train features") - parser.add_argument("--cache_dir", - default=None, - type=str, - help="Location to cache train feaures. Will default to the dataset directory") - parser.add_argument("--prune_config", - default='prune_bert.yaml', - help="pruning config") - parser.add_argument('--do_prune', - action='store_true', - help="prune model") - - args = parser.parse_args() - args.fp16 = args.fp16 or args.amp - - if args.local_rank == -1 or args.no_cuda: - device = torch.device("cuda" if torch.cuda.is_available() and not args.no_cuda else "cpu") - n_gpu = torch.cuda.device_count() - else: - torch.cuda.set_device(args.local_rank) - device = torch.device("cuda", args.local_rank) - # Initializes the distributed backend which will take care of synchronizing nodes/GPUs - torch.distributed.init_process_group(backend='nccl', init_method='env://') - n_gpu = 1 - - if is_main_process(): - dllogger.init(backends=[dllogger.JSONStreamBackend(verbosity=dllogger.Verbosity.VERBOSE, - filename=args.json_summary), - dllogger.StdOutBackend(verbosity=dllogger.Verbosity.VERBOSE, step_format=format_step)]) - else: - dllogger.init(backends=[]) - - print("device: {} n_gpu: {}, distributed training: {}, 16-bits training: {}".format( - device, n_gpu, bool(args.local_rank != -1), args.fp16)) - - dllogger.log(step="PARAMETER", data={"Config": [str(args)]}) - - if args.gradient_accumulation_steps < 1: - raise ValueError("Invalid gradient_accumulation_steps parameter: {}, should be >= 1".format( - args.gradient_accumulation_steps)) - - args.train_batch_size = args.train_batch_size // args.gradient_accumulation_steps - - random.seed(args.seed) - np.random.seed(args.seed) - torch.manual_seed(args.seed) - dllogger.log(step="PARAMETER", data={"SEED": args.seed}) - - if n_gpu > 0: - torch.cuda.manual_seed_all(args.seed) - - if not args.do_train and not args.do_predict: - raise ValueError("At least one of `do_train` or `do_predict` must be True.") - - if args.do_train: - if not args.train_file: - raise ValueError( - "If `do_train` is True, then `train_file` must be specified.") - if args.do_predict: - if not args.predict_file: - raise ValueError( - "If `do_predict` is True, then `predict_file` must be specified.") - - if os.path.exists(args.output_dir) and os.listdir(args.output_dir) and args.do_train and os.listdir(args.output_dir)!=['logfile.txt']: - print("WARNING: Output directory {} already exists and is not empty.".format(args.output_dir), os.listdir(args.output_dir)) - if not os.path.exists(args.output_dir) and is_main_process(): - os.makedirs(args.output_dir) - - tokenizer = BertTokenizer(args.vocab_file, do_lower_case=args.do_lower_case, max_len=512) # for bert large - # tokenizer = BertTokenizer.from_pretrained(args.bert_model, do_lower_case=args.do_lower_case) - - train_examples = None - num_train_optimization_steps = None - if args.do_train: - train_examples = read_squad_examples( - input_file=args.train_file, is_training=True, version_2_with_negative=args.version_2_with_negative) - num_train_optimization_steps = int( - len(train_examples) / args.train_batch_size / args.gradient_accumulation_steps) * args.num_train_epochs - if args.local_rank != -1: - num_train_optimization_steps = num_train_optimization_steps // torch.distributed.get_world_size() - - # Prepare model - config = modeling.BertConfig.from_json_file(args.config_file) - # Padding for divisibility by 8 - if config.vocab_size % 8 != 0: - config.vocab_size += 8 - (config.vocab_size % 8) - - modeling.ACT2FN["bias_gelu"] = modeling.bias_gelu_training - model = modeling.BertForQuestionAnswering(config) - # model = modeling.BertForQuestionAnswering.from_pretrained(args.bert_model, - # cache_dir=os.path.join(str(PYTORCH_PRETRAINED_BERT_CACHE), 'distributed_{}'.format(args.local_rank))) - dllogger.log(step="PARAMETER", data={"loading_checkpoint": True}) - model.load_state_dict(torch.load(args.init_checkpoint, map_location='cpu')["model"], strict=False) - #model.load_state_dict(torch.load(args.init_checkpoint, map_location='cpu'), strict=False) - dllogger.log(step="PARAMETER", data={"loaded_checkpoint": True}) - model.to(device) - num_weights = sum([p.numel() for p in model.parameters() if p.requires_grad]) - dllogger.log(step="PARAMETER", data={"model_weights_num":num_weights}) - - # Prepare optimizer - param_optimizer = list(model.named_parameters()) - - # hack to remove pooler, which is not used - # thus it produce None grad that break apex - param_optimizer = [n for n in param_optimizer if 'pooler' not in n[0]] - - no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight'] - optimizer_grouped_parameters = [ - {'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01}, - {'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0} - ] - if args.do_train: - if args.fp16: - try: - from apex.optimizers import FusedAdam - except ImportError: - raise ImportError( - "Please install apex from https://www.github.com/nvidia/apex to use distributed and fp16 training.") - optimizer = FusedAdam(optimizer_grouped_parameters, - lr=args.learning_rate, - bias_correction=False) - - if args.loss_scale == 0: - model, optimizer = amp.initialize(model, optimizer, opt_level="O2", keep_batchnorm_fp32=False, - loss_scale="dynamic") - else: - model, optimizer = amp.initialize(model, optimizer, opt_level="O2", keep_batchnorm_fp32=False, loss_scale=args.loss_scale) - if args.do_train: - scheduler = LinearWarmUpScheduler(optimizer, warmup=args.warmup_proportion, total_steps=num_train_optimization_steps) - - else: - optimizer = BertAdam(optimizer_grouped_parameters, - lr=args.learning_rate, - warmup=args.warmup_proportion, - t_total=num_train_optimization_steps) - - if args.local_rank != -1: - try: - from apex.parallel import DistributedDataParallel as DDP - except ImportError: - raise ImportError( - "Please install apex from https://www.github.com/nvidia/apex to use distributed and fp16 training.") - - model = DDP(model) - elif n_gpu > 1: - model = torch.nn.DataParallel(model) - - global_step = 0 - - if args.do_prune: - # Pruning! - from intel_extension_for_transformers.transformers import NoTrainerOptimizer, PrunerConfig, PruningConfig - pruner_config = PrunerConfig( - prune_type="GroupLasso", - target_sparsity_ratio=0.7, - names=['bert.encoder.layer.0.attention.output.dense.weight'], - parameters={"alpha": 0.006, "pattern": "tile_pattern_1x2"}, - ) - pruning_conf = PruningConfig(pruner_config=pruner_config) - no_trainer_optimizer = NoTrainerOptimizer(model, output_dir=args.output_dir) - agent = no_trainer_optimizer.init_pruner(pruning_config=pruning_conf) - - def train_func_nc(model): - return train_func(model, agent, args, dllogger, global_step, train_examples, num_train_optimization_steps, n_gpu, device, optimizer) - - def eval_func_nc(model): - return eval_func(model, args, dllogger, tokenizer, device) - - if args.do_train: - # train_func(args, dllogger, global_step) - no_trainer_optimizer.train_func = train_func_nc - - - if args.do_train and is_main_process() and not args.skip_checkpoint: - # Save a trained model and the associated configuration - model_to_save = model.module if hasattr(model, 'module') else model # Only save the model it-self - output_model_file = os.path.join(args.output_dir, modeling.WEIGHTS_NAME) - torch.save({"model":model_to_save.state_dict()}, output_model_file) - output_config_file = os.path.join(args.output_dir, modeling.CONFIG_NAME) - with open(output_config_file, 'w') as f: - f.write(model_to_save.config.to_json_string()) - - if args.do_predict and (args.local_rank == -1 or is_main_process()): - no_trainer_optimizer.eval_func = eval_func_nc - - if args.do_prune: - model = no_trainer_optimizer.prune() - - if args.do_train: - gpu_count = n_gpu - if torch.distributed.is_initialized(): - gpu_count = torch.distributed.get_world_size() - - if args.max_steps == -1: - dllogger.log(step=tuple(), data={"e2e_train_time": args.time_to_train, - "training_sequences_per_second": len(args.train_features) * args.num_train_epochs / args.time_to_train, - "final_loss": args.final_loss}) - else: - dllogger.log(step=tuple(), data={"e2e_train_time": time_to_train, - "training_sequences_per_second": args.train_batch_size * args.gradient_accumulation_steps \ - * args.max_steps * gpu_count / time_to_train, - "final_loss": final_loss}) - if args.do_predict and is_main_process(): - dllogger.log(step=tuple(), data={"e2e_inference_time": args.time_to_infer, - "inference_sequences_per_second": len(args.eval_features) / args.time_to_infer}) - if args.do_eval and is_main_process(): - dllogger.log(step=tuple(), data={"exact_match": args.exact_match, "F1": args.f1}) - -if __name__ == "__main__": - main() - dllogger.flush() - diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/schedulers.py b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/schedulers.py deleted file mode 100644 index 4dd99b43a15..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/schedulers.py +++ /dev/null @@ -1,131 +0,0 @@ -# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. -# Copyright 2018 The Google AI Language Team Authors and The HugginFace Inc. team. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import math -import torch -from torch.optim.optimizer import Optimizer -from torch.optim.lr_scheduler import _LRScheduler - - -class LRScheduler(_LRScheduler): - def __init__(self, optimizer, last_epoch=-1): - # Check if using mixed precision training - self.mixed_training = False - base_optimizer = optimizer - - # Check that optimizer param is valid - if not isinstance(optimizer, Optimizer): - raise TypeError('{} is not an Optimizer'.format( - type(optimizer).__name__)) - - super(LRScheduler, self).__init__(base_optimizer, last_epoch) - - def step(self, epoch=None): - # Set the current training step - # ('epoch' is used to be consistent with _LRScheduler) - if self.mixed_training: - # The assumption is that the step will be constant - state_dict = self.optimizer.state[self.optimizer.param_groups[0]['params'][0]] - if 'step' in state_dict: - self.last_epoch = state_dict['step'] + 1 - else: - self.last_epoch = 1 - else: - self.last_epoch = epoch if epoch is not None else self.last_epoch + 1 - - for param_group, lr in zip(self.optimizer.param_groups, self.get_lr()): - param_group['lr'] = lr - - -class CosineWarmUpScheduler(LRScheduler): - """ - Applies a warm up period to the learning rate. - """ - - def __init__(self, optimizer, warmup, total_steps, last_epoch=-1): - self.warmup = warmup - self.total_steps = total_steps - super(CosineWarmUpScheduler, self).__init__(optimizer, last_epoch) - - def get_lr(self): - progress = self.last_epoch / self.total_steps - if progress < self.warmup: - return [base_lr * progress / self.warmup for base_lr in self.base_lrs] - else: - return [base_lr * (0.5 * (1.0 + torch.cos(math.pi + progress))) for base_lr in self.base_lrs] - - -class ConstantWarmUpScheduler(LRScheduler): - """ - Applies a warm up period to the learning rate. - """ - - def __init__(self, optimizer, warmup, total_steps, last_epoch=-1): - self.warmup = warmup - self.total_steps = total_steps - super(ConstantWarmUpScheduler, self).__init__(optimizer, last_epoch) - - def get_lr(self): - progress = self.last_epoch / self.total_steps - if progress < self.warmup: - return [base_lr * progress / self.warmup for base_lr in self.base_lrs] - else: - return self.base_lrs - - -class LinearWarmUpScheduler(LRScheduler): - """ - Applies a warm up period to the learning rate. - """ - - def __init__(self, optimizer, warmup, total_steps, last_epoch=-1): - self.warmup = warmup - self.total_steps = total_steps - super(LinearWarmUpScheduler, self).__init__(optimizer, last_epoch) - - def get_lr(self): - progress = self.last_epoch / self.total_steps - if progress < self.warmup: - return [base_lr * progress / self.warmup for base_lr in self.base_lrs] - else: - return [base_lr * max(( progress - 1.0)/(self.warmup - 1.0), 0.) for base_lr in self.base_lrs] - - -class PolyWarmUpScheduler(LRScheduler): - """ - Applies a warm up period to the learning rate. - """ - - def __init__(self, optimizer, warmup, total_steps, degree=0.5, last_epoch=-1): - self.warmup = warmup - self.total_steps = total_steps - self.degree = degree - super(PolyWarmUpScheduler, self).__init__(optimizer, last_epoch) - - def step(self, epoch=None): - param_group = self.optimizer.param_groups[0] - if 'step' in param_group: - self.last_epoch = param_group['step'] + 1 - else: - self.last_epoch = 1 - - for param_group, lr in zip(self.optimizer.param_groups, self.get_lr()): - param_group['lr'] = lr - - def get_lr(self): - progress = self.last_epoch / self.total_steps - if progress < self.warmup: - return [base_lr * progress / self.warmup for base_lr in self.base_lrs] - else: - return [base_lr * ((1.0 - progress) ** self.degree) for base_lr in self.base_lrs] diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/scripts/run_squad_sparse.sh b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/scripts/run_squad_sparse.sh deleted file mode 100644 index 581dd1db883..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/scripts/run_squad_sparse.sh +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env bash - -# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -echo "Container nvidia build = " $NVIDIA_BUILD_ID - -init_checkpoint=${1:-"/path/to/ckpt_8601.pt"} -epochs=${2:-"2.0"} -batch_size=${3:-"4"} -learning_rate=${4:-"3e-5"} -precision=${5:-"tf32"} -num_gpu="1" -seed="1" -BERT_PREP_WORKING_DIR=${6:-'/path/to/bert_data'} -squad_dir="$BERT_PREP_WORKING_DIR/download/squad/v1.1" -vocab_file="$BERT_PREP_WORKING_DIR/download/google_pretrained_weights/uncased_L-24_H-1024_A-16/vocab.txt" -OUT_DIR=${7:-"./results/SQuAD/"} -prune_config=${8:-"prune_bert.yaml"} -json_summary=${9:-"$OUT_DIR/dllogger.json"} -echo $init_checkpoint $epochs $batch_size $learning_rate \ -$precision $num_gpu $seed $squad_dir $vocab_file \ -$OUT_DIR $prune_config $json_summary - - -#init_checkpoint=${1:-"/workspace/bert/checkpoints/bert_uncased.pt"} -#epochs=${2:-"2.0"} -#batch_size=${3:-"4"} -#learning_rate=${4:-"3e-5"} -#precision=${5:-"fp16"} -#num_gpu=${6:-"8"} -#seed=${7:-"1"} -#squad_dir=${8:-"$BERT_PREP_WORKING_DIR/download/squad/v1.1"} -#vocab_file=${9:-"$BERT_PREP_WORKING_DIR/download/google_pretrained_weights/uncased_L-24_H-1024_A-16/vocab.txt"} -#OUT_DIR=${10:-"/workspace/bert/results/SQuAD"} -mode=${11:-"train eval"} -CONFIG_FILE=${12:-"/workspace/bert/bert_config.json"} -CONFIG_FILE="$PWD/bert_config.json" -max_steps=${13:-"-1"} - -echo "out dir is $OUT_DIR" -mkdir -p $OUT_DIR -if [ ! -d "$OUT_DIR" ]; then - echo "ERROR: non existing $OUT_DIR" - exit 1 -fi - -use_fp16="" -if [ "$precision" = "fp16" ] ; then - echo "fp16 activated!" - use_fp16=" --fp16 " -fi - -if [ "$num_gpu" = "1" ] ; then - export CUDA_VISIBLE_DEVICES=0 - mpi_command="" -else - unset CUDA_VISIBLE_DEVICES - mpi_command=" -m torch.distributed.launch --nproc_per_node=$num_gpu" -fi - -CMD="python $mpi_command run_squad_sparse.py " -CMD+="--do_prune " -CMD+="--prune_config=$prune_config " -CMD+="--json-summary=$json_summary " -CMD+="--init_checkpoint=$init_checkpoint " -if [ "$mode" = "train" ] ; then - CMD+="--do_train " - CMD+="--train_file=$squad_dir/train-v1.1.json " - CMD+="--train_batch_size=$batch_size " -elif [ "$mode" = "eval" ] ; then - CMD+="--do_predict " - CMD+="--predict_file=$squad_dir/dev-v1.1.json " - CMD+="--predict_batch_size=$batch_size " - CMD+="--eval_script=$squad_dir/evaluate-v1.1.py " - CMD+="--do_eval " -elif [ "$mode" = "prediction" ] ; then - CMD+="--do_predict " - CMD+="--predict_file=$squad_dir/dev-v1.1.json " - CMD+="--predict_batch_size=$batch_size " -else - CMD+=" --do_train " - CMD+=" --train_file=$squad_dir/train-v1.1.json " - CMD+=" --train_batch_size=$batch_size " - CMD+="--do_predict " - CMD+="--predict_file=$squad_dir/dev-v1.1.json " - CMD+="--predict_batch_size=$batch_size " - CMD+="--eval_script=$squad_dir/evaluate-v1.1.py " - CMD+="--do_eval " -fi - -CMD+=" --do_lower_case " -CMD+=" --bert_model=bert-large-uncased " -CMD+=" --learning_rate=$learning_rate " -CMD+=" --seed=$seed " -CMD+=" --num_train_epochs=$epochs " -CMD+=" --max_seq_length=384 " -CMD+=" --doc_stride=128 " -CMD+=" --output_dir=$OUT_DIR " -CMD+=" --vocab_file=$vocab_file " -CMD+=" --config_file=$CONFIG_FILE " -CMD+=" --max_steps=$max_steps " -CMD+=" $use_fp16" - -LOGFILE=$OUT_DIR/logfile.txt -echo "$CMD |& tee $LOGFILE" -time $CMD |& tee $LOGFILE diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/tokenization.py b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/tokenization.py deleted file mode 100644 index fb3cffe20ca..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/tokenization.py +++ /dev/null @@ -1,392 +0,0 @@ -# coding=utf-8 -# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. -# Copyright 2018 The Google AI Language Team Authors and The HugginFace Inc. team. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tokenization classes.""" - -from __future__ import absolute_import, division, print_function, unicode_literals - -import collections -import logging -import os -import unicodedata -import six -from io import open - -from file_utils import cached_path - -logger = logging.getLogger(__name__) - -PRETRAINED_VOCAB_ARCHIVE_MAP = { - 'bert-base-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt", - 'bert-large-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-vocab.txt", - 'bert-base-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased-vocab.txt", - 'bert-large-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased-vocab.txt", - 'bert-base-multilingual-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-uncased-vocab.txt", - 'bert-base-multilingual-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-cased-vocab.txt", - 'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt", -} -PRETRAINED_VOCAB_POSITIONAL_EMBEDDINGS_SIZE_MAP = { - 'bert-base-uncased': 512, - 'bert-large-uncased': 512, - 'bert-base-cased': 512, - 'bert-large-cased': 512, - 'bert-base-multilingual-uncased': 512, - 'bert-base-multilingual-cased': 512, - 'bert-base-chinese': 512, -} -VOCAB_NAME = 'vocab.txt' - -def convert_to_unicode(text): - """Converts `text` to Unicode (if it's not already), assuming utf-8 input.""" - if six.PY3: - if isinstance(text, str): - return text - elif isinstance(text, bytes): - return text.decode("utf-8", "ignore") - else: - raise ValueError("Unsupported string type: %s" % (type(text))) - elif six.PY2: - if isinstance(text, str): - return text.decode("utf-8", "ignore") - elif isinstance(text, unicode): - return text - else: - raise ValueError("Unsupported string type: %s" % (type(text))) - else: - raise ValueError("Not running on Python2 or Python 3?") - - -def load_vocab(vocab_file): - """Loads a vocabulary file into a dictionary.""" - vocab = collections.OrderedDict() - index = 0 - with open(vocab_file, "r", encoding="utf-8") as reader: - while True: - token = reader.readline() - if not token: - break - token = token.strip() - vocab[token] = index - index += 1 - return vocab - - -def whitespace_tokenize(text): - """Runs basic whitespace cleaning and splitting on a piece of text.""" - text = text.strip() - if not text: - return [] - tokens = text.split() - return tokens - - -class BertTokenizer(object): - """Runs end-to-end tokenization: punctuation splitting + wordpiece""" - - def __init__(self, vocab_file, do_lower_case=True, max_len=None, - never_split=("[UNK]", "[SEP]", "[PAD]", "[CLS]", "[MASK]")): - if not os.path.isfile(vocab_file): - raise ValueError( - "Can't find a vocabulary file at path '{}'. To load the vocabulary from a Google pretrained " - "model use `tokenizer = BertTokenizer.from_pretrained(PRETRAINED_MODEL_NAME)`".format(vocab_file)) - self.vocab = load_vocab(vocab_file) - self.ids_to_tokens = collections.OrderedDict( - [(ids, tok) for tok, ids in self.vocab.items()]) - self.basic_tokenizer = BasicTokenizer(do_lower_case=do_lower_case, - never_split=never_split) - self.wordpiece_tokenizer = WordpieceTokenizer(vocab=self.vocab) - self.max_len = max_len if max_len is not None else int(1e12) - - def tokenize(self, text): - split_tokens = [] - for token in self.basic_tokenizer.tokenize(text): - for sub_token in self.wordpiece_tokenizer.tokenize(token): - split_tokens.append(sub_token) - return split_tokens - - def convert_tokens_to_ids(self, tokens): - """Converts a sequence of tokens into ids using the vocab.""" - ids = [] - for token in tokens: - ids.append(self.vocab[token]) - if len(ids) > self.max_len: - raise ValueError( - "Token indices sequence length is longer than the specified maximum " - " sequence length for this BERT model ({} > {}). Running this" - " sequence through BERT will result in indexing errors".format(len(ids), self.max_len) - ) - return ids - - def convert_ids_to_tokens(self, ids): - """Converts a sequence of ids in wordpiece tokens using the vocab.""" - tokens = [] - for i in ids: - tokens.append(self.ids_to_tokens[i]) - return tokens - - @classmethod - def from_pretrained(cls, pretrained_model_name_or_path, cache_dir=None, *inputs, **kwargs): - """ - Instantiate a PreTrainedBertModel from a pre-trained model file. - Download and cache the pre-trained model file if needed. - """ - if pretrained_model_name_or_path in PRETRAINED_VOCAB_ARCHIVE_MAP: - vocab_file = PRETRAINED_VOCAB_ARCHIVE_MAP[pretrained_model_name_or_path] - else: - vocab_file = pretrained_model_name_or_path - if os.path.isdir(vocab_file): - vocab_file = os.path.join(vocab_file, VOCAB_NAME) - # redirect to the cache, if necessary - try: - resolved_vocab_file = cached_path(vocab_file, cache_dir=cache_dir) - except EnvironmentError: - logger.error( - "Model name '{}' was not found in model name list ({}). " - "We assumed '{}' was a path or url but couldn't find any file " - "associated to this path or url.".format( - pretrained_model_name_or_path, - ', '.join(PRETRAINED_VOCAB_ARCHIVE_MAP.keys()), - vocab_file)) - return None - if resolved_vocab_file == vocab_file: - logger.info("loading vocabulary file {}".format(vocab_file)) - else: - logger.info("loading vocabulary file {} from cache at {}".format( - vocab_file, resolved_vocab_file)) - if pretrained_model_name_or_path in PRETRAINED_VOCAB_POSITIONAL_EMBEDDINGS_SIZE_MAP: - # if we're using a pretrained model, ensure the tokenizer won't index sequences longer - # than the number of positional embeddings - max_len = PRETRAINED_VOCAB_POSITIONAL_EMBEDDINGS_SIZE_MAP[pretrained_model_name_or_path] - kwargs['max_len'] = min(kwargs.get('max_len', int(1e12)), max_len) - # Instantiate tokenizer. - tokenizer = cls(resolved_vocab_file, *inputs, **kwargs) - return tokenizer - - -class BasicTokenizer(object): - """Runs basic tokenization (punctuation splitting, lower casing, etc.).""" - - def __init__(self, - do_lower_case=True, - never_split=("[UNK]", "[SEP]", "[PAD]", "[CLS]", "[MASK]")): - """Constructs a BasicTokenizer. - - Args: - do_lower_case: Whether to lower case the input. - """ - self.do_lower_case = do_lower_case - self.never_split = never_split - - def tokenize(self, text): - """Tokenizes a piece of text.""" - text = self._clean_text(text) - # This was added on November 1st, 2018 for the multilingual and Chinese - # models. This is also applied to the English models now, but it doesn't - # matter since the English models were not trained on any Chinese data - # and generally don't have any Chinese data in them (there are Chinese - # characters in the vocabulary because Wikipedia does have some Chinese - # words in the English Wikipedia.). - text = self._tokenize_chinese_chars(text) - orig_tokens = whitespace_tokenize(text) - split_tokens = [] - for token in orig_tokens: - if self.do_lower_case and token not in self.never_split: - token = token.lower() - token = self._run_strip_accents(token) - split_tokens.extend(self._run_split_on_punc(token)) - - output_tokens = whitespace_tokenize(" ".join(split_tokens)) - return output_tokens - - def _run_strip_accents(self, text): - """Strips accents from a piece of text.""" - text = unicodedata.normalize("NFD", text) - output = [] - for char in text: - cat = unicodedata.category(char) - if cat == "Mn": - continue - output.append(char) - return "".join(output) - - def _run_split_on_punc(self, text): - """Splits punctuation on a piece of text.""" - if text in self.never_split: - return [text] - chars = list(text) - i = 0 - start_new_word = True - output = [] - while i < len(chars): - char = chars[i] - if _is_punctuation(char): - output.append([char]) - start_new_word = True - else: - if start_new_word: - output.append([]) - start_new_word = False - output[-1].append(char) - i += 1 - - return ["".join(x) for x in output] - - def _tokenize_chinese_chars(self, text): - """Adds whitespace around any CJK character.""" - output = [] - for char in text: - cp = ord(char) - if self._is_chinese_char(cp): - output.append(" ") - output.append(char) - output.append(" ") - else: - output.append(char) - return "".join(output) - - def _is_chinese_char(self, cp): - """Checks whether CP is the codepoint of a CJK character.""" - # This defines a "chinese character" as anything in the CJK Unicode block: - # https://en.wikipedia.org/wiki/CJK_Unified_Ideographs_(Unicode_block) - # - # Note that the CJK Unicode block is NOT all Japanese and Korean characters, - # despite its name. The modern Korean Hangul alphabet is a different block, - # as is Japanese Hiragana and Katakana. Those alphabets are used to write - # space-separated words, so they are not treated specially and handled - # like the all of the other languages. - if ((cp >= 0x4E00 and cp <= 0x9FFF) or # - (cp >= 0x3400 and cp <= 0x4DBF) or # - (cp >= 0x20000 and cp <= 0x2A6DF) or # - (cp >= 0x2A700 and cp <= 0x2B73F) or # - (cp >= 0x2B740 and cp <= 0x2B81F) or # - (cp >= 0x2B820 and cp <= 0x2CEAF) or - (cp >= 0xF900 and cp <= 0xFAFF) or # - (cp >= 0x2F800 and cp <= 0x2FA1F)): # - return True - - return False - - def _clean_text(self, text): - """Performs invalid character removal and whitespace cleanup on text.""" - output = [] - for char in text: - cp = ord(char) - if cp == 0 or cp == 0xfffd or _is_control(char): - continue - if _is_whitespace(char): - output.append(" ") - else: - output.append(char) - return "".join(output) - - -class WordpieceTokenizer(object): - """Runs WordPiece tokenization.""" - - def __init__(self, vocab, unk_token="[UNK]", max_input_chars_per_word=100): - self.vocab = vocab - self.unk_token = unk_token - self.max_input_chars_per_word = max_input_chars_per_word - - def tokenize(self, text): - """Tokenizes a piece of text into its word pieces. - - This uses a greedy longest-match-first algorithm to perform tokenization - using the given vocabulary. - - For example: - input = "unaffable" - output = ["un", "##aff", "##able"] - - Args: - text: A single token or whitespace separated tokens. This should have - already been passed through `BasicTokenizer`. - - Returns: - A list of wordpiece tokens. - """ - - output_tokens = [] - for token in whitespace_tokenize(text): - chars = list(token) - if len(chars) > self.max_input_chars_per_word: - output_tokens.append(self.unk_token) - continue - - is_bad = False - start = 0 - sub_tokens = [] - while start < len(chars): - end = len(chars) - cur_substr = None - while start < end: - substr = "".join(chars[start:end]) - if start > 0: - substr = "##" + substr - if substr in self.vocab: - cur_substr = substr - break - end -= 1 - if cur_substr is None: - is_bad = True - break - sub_tokens.append(cur_substr) - start = end - - if is_bad: - output_tokens.append(self.unk_token) - else: - output_tokens.extend(sub_tokens) - return output_tokens - - -def _is_whitespace(char): - """Checks whether `chars` is a whitespace character.""" - # \t, \n, and \r are technically control characters but we treat them - # as whitespace since they are generally considered as such. - if char == " " or char == "\t" or char == "\n" or char == "\r": - return True - cat = unicodedata.category(char) - if cat == "Zs": - return True - return False - - -def _is_control(char): - """Checks whether `chars` is a control character.""" - # These are technically control characters but we count them as whitespace - # characters. - if char == "\t" or char == "\n" or char == "\r": - return False - cat = unicodedata.category(char) - if cat.startswith("C"): - return True - return False - - -def _is_punctuation(char): - """Checks whether `chars` is a punctuation character.""" - cp = ord(char) - # We treat all non-letter/number ASCII as punctuation. - # Characters such as "^", "$", and "`" are not in the Unicode - # Punctuation class but we treat them as punctuation anyways, for - # consistency. - if ((cp >= 33 and cp <= 47) or (cp >= 58 and cp <= 64) or - (cp >= 91 and cp <= 96) or (cp >= 123 and cp <= 126)): - return True - cat = unicodedata.category(char) - if cat.startswith("P"): - return True - return False diff --git a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/utils.py b/examples/huggingface/pytorch/question-answering/pruning/group_lasso/utils.py deleted file mode 100644 index f4f88e8eff9..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/group_lasso/utils.py +++ /dev/null @@ -1,65 +0,0 @@ -# Copyright (c) 2019 NVIDIA CORPORATION. All rights reserved. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import torch -import torch.distributed as dist - -from pathlib import Path - - -def get_rank(): - if not dist.is_available(): - return 0 - if not dist.is_initialized(): - return 0 - return dist.get_rank() - - -def get_world_size(): - if not dist.is_available(): - return 1 - if not dist.is_initialized(): - return 1 - return dist.get_world_size() - - -def is_main_process(): - return get_rank() == 0 - - -def barrier(): - if dist.is_available() and dist.is_initialized(): - dist.barrier() - - -def format_step(step): - if isinstance(step, str): - return step - s = "" - if len(step) > 0: - s += "Training Epoch: {} ".format(step[0]) - if len(step) > 1: - s += "Training Iteration: {} ".format(step[1]) - if len(step) > 2: - s += "Validation Iteration: {} ".format(step[2]) - return s - - -def mkdir(path): - Path(path).mkdir(parents=True, exist_ok=True) - - -def mkdir_by_main_process(path): - if is_main_process(): - mkdir(path) - barrier() diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/README.md b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/README.md deleted file mode 100644 index 9da0b53c3d2..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/README.md +++ /dev/null @@ -1,52 +0,0 @@ -Step-by-Step -============ - -This document is used to list steps of reproducing PyTorch longformer-base-4096 pruning result. - - -# Prerequisite - -## 1. Environment - -```shell -pip install intel-extension-for-transformers -pip install -r requirements.txt -pip install transformers==4.34.1 -``` ->**Note**: Please use transformers no higher than 4.34.1 - - -## 2. Prepare Dataset - -The dataset will be downloaded and converted to squad format automatically with `./scripts/download_data_and_convert.sh`. - -```shell -bash ./scripts/download_data_and_convert.sh -``` - -There will generate two squad format files: `squad-wikipedia-train-4096.json` and `squad-wikipedia-dev-4096.json` - - -# Run Examples - -### pruning longformer-base-4096 - -Run the `./scripts/longformer_base_sparse_global_4x1_pruning.sh` to prune with `global sparse 80% and 4*1 pattern`. In this script, we set `per_device_train_batch_size=1` which is same with [the original longformer codes](https://github.com/allenai/longformer). - -```shell -bash ./scripts/longformer_base_sparse_global_4x1_pruning.sh -``` - -Fine-tuning of the dense model is also supported by running the `./scripts/longformer_base_dense_fintune.sh` - - -### Results -The snip-momentum pruning method is used by default and the initial dense model is well fine-tuned. - -| Model | Dataset | Sparsity pattern | sparsity ratio | Dense F1 |Sparse F1 | Relative drop| -| :----: | :----: | :----: | :----: |:----: |:----:| :----: | -| longformer-base-4096 | triviaqa | 4x1 | global 80% | 75.2 (from [the paper](https://arxiv.org/abs/2004.05150))/74.9235 (ours) | 74.48 | -0.96% | - -## References -* [Longformer: The Long-Document Transformer](https://arxiv.org/abs/2004.05150) - diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/modeling_longformer.py b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/modeling_longformer.py deleted file mode 100644 index 3a08b4aaf96..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/modeling_longformer.py +++ /dev/null @@ -1,2282 +0,0 @@ -# coding=utf-8 -# Copyright 2020 The Allen Institute for AI team and The HuggingFace Inc. team. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""PyTorch Longformer model.""" - -import math -from dataclasses import dataclass -from typing import Optional, Tuple, Union - -import torch -import torch.utils.checkpoint -from torch import nn -from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss - -from transformers.activations import ACT2FN, gelu -from transformers.modeling_utils import PreTrainedModel -from transformers.pytorch_utils import apply_chunking_to_forward, find_pruneable_heads_and_indices, prune_linear_layer -from transformers.utils import ( - ModelOutput, - add_code_sample_docstrings, - add_start_docstrings, - add_start_docstrings_to_model_forward, - logging, - replace_return_docstrings, -) -from transformers.models.longformer.configuration_longformer import LongformerConfig - - -logger = logging.get_logger(__name__) - -_CHECKPOINT_FOR_DOC = "allenai/longformer-base-4096" -_CONFIG_FOR_DOC = "LongformerConfig" -_TOKENIZER_FOR_DOC = "LongformerTokenizer" - -LONGFORMER_PRETRAINED_MODEL_ARCHIVE_LIST = [ - "allenai/longformer-base-4096", - "allenai/longformer-large-4096", - "allenai/longformer-large-4096-finetuned-triviaqa", - "allenai/longformer-base-4096-extra.pos.embd.only", - "allenai/longformer-large-4096-extra.pos.embd.only", - # See all Longformer models at https://huggingface.co/models?filter=longformer -] - - -@dataclass -class LongformerBaseModelOutput(ModelOutput): - """ - Base class for Longformer's outputs, with potential hidden states, local and global attentions. - Args: - last_hidden_state (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`): - Sequence of hidden-states at the output of the last layer of the model. - hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): - Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of - shape `(batch_size, sequence_length, hidden_size)`. - Hidden-states of the model at the output of each layer plus the initial embedding outputs. - attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x + - attention_window + 1)`, where `x` is the number of tokens with global attention mask. - Local attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token in the sequence to every token with - global attention (first `x` values) and to every token in the attention window (remaining `attention_window - + 1` values). Note that the first `x` values refer to tokens with fixed positions in the text, but the - remaining `attention_window + 1` values refer to tokens with relative positions: the attention weight of a - token to itself is located at index `x + attention_window / 2` and the `attention_window / 2` preceding - (succeeding) values are the attention weights to the `attention_window / 2` preceding (succeeding) tokens. - If the attention window contains a token with global attention, the attention weight at the corresponding - index is set to 0; the value should be accessed from the first `x` attention weights. If a token has global - attention, the attention weights to all other tokens in `attentions` is set to 0, the values should be - accessed from `global_attentions`. - global_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x)`, - where `x` is the number of tokens with global attention mask. - Global attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token with global attention to every token - in the sequence. - """ - - last_hidden_state: torch.FloatTensor - hidden_states: Optional[Tuple[torch.FloatTensor]] = None - attentions: Optional[Tuple[torch.FloatTensor]] = None - global_attentions: Optional[Tuple[torch.FloatTensor]] = None - - -@dataclass -class LongformerBaseModelOutputWithPooling(ModelOutput): - """ - Base class for Longformer's outputs that also contains a pooling of the last hidden states. - Args: - last_hidden_state (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`): - Sequence of hidden-states at the output of the last layer of the model. - pooler_output (`torch.FloatTensor` of shape `(batch_size, hidden_size)`): - Last layer hidden-state of the first token of the sequence (classification token) further processed by a - Linear layer and a Tanh activation function. The Linear layer weights are trained from the next sentence - prediction (classification) objective during pretraining. - hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): - Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of - shape `(batch_size, sequence_length, hidden_size)`. - Hidden-states of the model at the output of each layer plus the initial embedding outputs. - attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x + - attention_window + 1)`, where `x` is the number of tokens with global attention mask. - Local attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token in the sequence to every token with - global attention (first `x` values) and to every token in the attention window (remaining `attention_window - + 1` values). Note that the first `x` values refer to tokens with fixed positions in the text, but the - remaining `attention_window + 1` values refer to tokens with relative positions: the attention weight of a - token to itself is located at index `x + attention_window / 2` and the `attention_window / 2` preceding - (succeeding) values are the attention weights to the `attention_window / 2` preceding (succeeding) tokens. - If the attention window contains a token with global attention, the attention weight at the corresponding - index is set to 0; the value should be accessed from the first `x` attention weights. If a token has global - attention, the attention weights to all other tokens in `attentions` is set to 0, the values should be - accessed from `global_attentions`. - global_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x)`, - where `x` is the number of tokens with global attention mask. - Global attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token with global attention to every token - in the sequence. - """ - - last_hidden_state: torch.FloatTensor - pooler_output: torch.FloatTensor = None - hidden_states: Optional[Tuple[torch.FloatTensor]] = None - attentions: Optional[Tuple[torch.FloatTensor]] = None - global_attentions: Optional[Tuple[torch.FloatTensor]] = None - - -@dataclass -class LongformerMaskedLMOutput(ModelOutput): - """ - Base class for masked language models outputs. - Args: - loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided): - Masked language modeling (MLM) loss. - logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`): - Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax). - hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): - Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of - shape `(batch_size, sequence_length, hidden_size)`. - Hidden-states of the model at the output of each layer plus the initial embedding outputs. - attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x + - attention_window + 1)`, where `x` is the number of tokens with global attention mask. - Local attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token in the sequence to every token with - global attention (first `x` values) and to every token in the attention window (remaining `attention_window - + 1` values). Note that the first `x` values refer to tokens with fixed positions in the text, but the - remaining `attention_window + 1` values refer to tokens with relative positions: the attention weight of a - token to itself is located at index `x + attention_window / 2` and the `attention_window / 2` preceding - (succeeding) values are the attention weights to the `attention_window / 2` preceding (succeeding) tokens. - If the attention window contains a token with global attention, the attention weight at the corresponding - index is set to 0; the value should be accessed from the first `x` attention weights. If a token has global - attention, the attention weights to all other tokens in `attentions` is set to 0, the values should be - accessed from `global_attentions`. - global_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x)`, - where `x` is the number of tokens with global attention mask. - Global attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token with global attention to every token - in the sequence. - """ - - loss: Optional[torch.FloatTensor] = None - logits: torch.FloatTensor = None - hidden_states: Optional[Tuple[torch.FloatTensor]] = None - attentions: Optional[Tuple[torch.FloatTensor]] = None - global_attentions: Optional[Tuple[torch.FloatTensor]] = None - - -@dataclass -class LongformerQuestionAnsweringModelOutput(ModelOutput): - """ - Base class for outputs of question answering Longformer models. - Args: - loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided): - Total span extraction loss is the sum of a Cross-Entropy for the start and end positions. - start_logits (`torch.FloatTensor` of shape `(batch_size, sequence_length)`): - Span-start scores (before SoftMax). - end_logits (`torch.FloatTensor` of shape `(batch_size, sequence_length)`): - Span-end scores (before SoftMax). - hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): - Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of - shape `(batch_size, sequence_length, hidden_size)`. - Hidden-states of the model at the output of each layer plus the initial embedding outputs. - attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x + - attention_window + 1)`, where `x` is the number of tokens with global attention mask. - Local attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token in the sequence to every token with - global attention (first `x` values) and to every token in the attention window (remaining `attention_window - + 1` values). Note that the first `x` values refer to tokens with fixed positions in the text, but the - remaining `attention_window + 1` values refer to tokens with relative positions: the attention weight of a - token to itself is located at index `x + attention_window / 2` and the `attention_window / 2` preceding - (succeeding) values are the attention weights to the `attention_window / 2` preceding (succeeding) tokens. - If the attention window contains a token with global attention, the attention weight at the corresponding - index is set to 0; the value should be accessed from the first `x` attention weights. If a token has global - attention, the attention weights to all other tokens in `attentions` is set to 0, the values should be - accessed from `global_attentions`. - global_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x)`, - where `x` is the number of tokens with global attention mask. - Global attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token with global attention to every token - in the sequence. - """ - - loss: Optional[torch.FloatTensor] = None - start_logits: torch.FloatTensor = None - end_logits: torch.FloatTensor = None - hidden_states: Optional[Tuple[torch.FloatTensor]] = None - attentions: Optional[Tuple[torch.FloatTensor]] = None - global_attentions: Optional[Tuple[torch.FloatTensor]] = None - - -@dataclass -class LongformerSequenceClassifierOutput(ModelOutput): - """ - Base class for outputs of sentence classification models. - Args: - loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided): - Classification (or regression if config.num_labels==1) loss. - logits (`torch.FloatTensor` of shape `(batch_size, config.num_labels)`): - Classification (or regression if config.num_labels==1) scores (before SoftMax). - hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): - Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of - shape `(batch_size, sequence_length, hidden_size)`. - Hidden-states of the model at the output of each layer plus the initial embedding outputs. - attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x + - attention_window + 1)`, where `x` is the number of tokens with global attention mask. - Local attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token in the sequence to every token with - global attention (first `x` values) and to every token in the attention window (remaining `attention_window - + 1` values). Note that the first `x` values refer to tokens with fixed positions in the text, but the - remaining `attention_window + 1` values refer to tokens with relative positions: the attention weight of a - token to itself is located at index `x + attention_window / 2` and the `attention_window / 2` preceding - (succeeding) values are the attention weights to the `attention_window / 2` preceding (succeeding) tokens. - If the attention window contains a token with global attention, the attention weight at the corresponding - index is set to 0; the value should be accessed from the first `x` attention weights. If a token has global - attention, the attention weights to all other tokens in `attentions` is set to 0, the values should be - accessed from `global_attentions`. - global_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x)`, - where `x` is the number of tokens with global attention mask. - Global attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token with global attention to every token - in the sequence. - """ - - loss: Optional[torch.FloatTensor] = None - logits: torch.FloatTensor = None - hidden_states: Optional[Tuple[torch.FloatTensor]] = None - attentions: Optional[Tuple[torch.FloatTensor]] = None - global_attentions: Optional[Tuple[torch.FloatTensor]] = None - - -@dataclass -class LongformerMultipleChoiceModelOutput(ModelOutput): - """ - Base class for outputs of multiple choice Longformer models. - Args: - loss (`torch.FloatTensor` of shape *(1,)*, *optional*, returned when `labels` is provided): - Classification loss. - logits (`torch.FloatTensor` of shape `(batch_size, num_choices)`): - *num_choices* is the second dimension of the input tensors. (see *input_ids* above). - Classification scores (before SoftMax). - hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): - Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of - shape `(batch_size, sequence_length, hidden_size)`. - Hidden-states of the model at the output of each layer plus the initial embedding outputs. - attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x + - attention_window + 1)`, where `x` is the number of tokens with global attention mask. - Local attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token in the sequence to every token with - global attention (first `x` values) and to every token in the attention window (remaining `attention_window - + 1` values). Note that the first `x` values refer to tokens with fixed positions in the text, but the - remaining `attention_window + 1` values refer to tokens with relative positions: the attention weight of a - token to itself is located at index `x + attention_window / 2` and the `attention_window / 2` preceding - (succeeding) values are the attention weights to the `attention_window / 2` preceding (succeeding) tokens. - If the attention window contains a token with global attention, the attention weight at the corresponding - index is set to 0; the value should be accessed from the first `x` attention weights. If a token has global - attention, the attention weights to all other tokens in `attentions` is set to 0, the values should be - accessed from `global_attentions`. - global_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x)`, - where `x` is the number of tokens with global attention mask. - Global attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token with global attention to every token - in the sequence. - """ - - loss: Optional[torch.FloatTensor] = None - logits: torch.FloatTensor = None - hidden_states: Optional[Tuple[torch.FloatTensor]] = None - attentions: Optional[Tuple[torch.FloatTensor]] = None - global_attentions: Optional[Tuple[torch.FloatTensor]] = None - - -@dataclass -class LongformerTokenClassifierOutput(ModelOutput): - """ - Base class for outputs of token classification models. - Args: - loss (`torch.FloatTensor` of shape `(1,)`, *optional*, returned when `labels` is provided) : - Classification loss. - logits (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.num_labels)`): - Classification scores (before SoftMax). - hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`): - Tuple of `torch.FloatTensor` (one for the output of the embeddings + one for the output of each layer) of - shape `(batch_size, sequence_length, hidden_size)`. - Hidden-states of the model at the output of each layer plus the initial embedding outputs. - attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x + - attention_window + 1)`, where `x` is the number of tokens with global attention mask. - Local attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token in the sequence to every token with - global attention (first `x` values) and to every token in the attention window (remaining `attention_window - + 1` values). Note that the first `x` values refer to tokens with fixed positions in the text, but the - remaining `attention_window + 1` values refer to tokens with relative positions: the attention weight of a - token to itself is located at index `x + attention_window / 2` and the `attention_window / 2` preceding - (succeeding) values are the attention weights to the `attention_window / 2` preceding (succeeding) tokens. - If the attention window contains a token with global attention, the attention weight at the corresponding - index is set to 0; the value should be accessed from the first `x` attention weights. If a token has global - attention, the attention weights to all other tokens in `attentions` is set to 0, the values should be - accessed from `global_attentions`. - global_attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`): - Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length, x)`, - where `x` is the number of tokens with global attention mask. - Global attentions weights after the attention softmax, used to compute the weighted average in the - self-attention heads. Those are the attention weights from every token with global attention to every token - in the sequence. - """ - - loss: Optional[torch.FloatTensor] = None - logits: torch.FloatTensor = None - hidden_states: Optional[Tuple[torch.FloatTensor]] = None - attentions: Optional[Tuple[torch.FloatTensor]] = None - global_attentions: Optional[Tuple[torch.FloatTensor]] = None - - -def _get_question_end_index(input_ids, sep_token_id): - """ - Computes the index of the first occurrence of `sep_token_id`. - """ - - sep_token_indices = (input_ids == sep_token_id).nonzero() - batch_size = input_ids.shape[0] - - assert sep_token_indices.shape[1] == 2, "`input_ids` should have two dimensions" - # here is the revised because of data preprocessing, - # but same to longformer codes: https://github.com/allenai/longformer - assert sep_token_indices.shape[0] == 2 * batch_size, ( - f"There should be exactly three separator tokens: {sep_token_id} in every sample for questions answering. You" - " might also consider to set `global_attention_mask` manually in the forward function to avoid this error." - ) - return sep_token_indices.view(batch_size, 2, 2)[:, 0, 1] - - -def _compute_global_attention_mask(input_ids, sep_token_id, before_sep_token=True): - """ - Computes global attention mask by putting attention on all tokens before `sep_token_id` if `before_sep_token is - True` else after `sep_token_id`. - """ - question_end_index = _get_question_end_index(input_ids, sep_token_id) - question_end_index = question_end_index.unsqueeze(dim=1) # size: batch_size x 1 - # bool attention mask with True in locations of global attention - attention_mask = torch.arange(input_ids.shape[1], device=input_ids.device) - if before_sep_token is True: - attention_mask = (attention_mask.expand_as(input_ids) < question_end_index).to(torch.uint8) - else: - # last token is separation token and should not be counted and in the middle are two separation tokens - attention_mask = (attention_mask.expand_as(input_ids) > (question_end_index + 1)).to(torch.uint8) * ( - attention_mask.expand_as(input_ids) < input_ids.shape[-1] - ).to(torch.uint8) - - return attention_mask - - -def create_position_ids_from_input_ids(input_ids, padding_idx): - """ - Replace non-padding symbols with their position numbers. Position numbers begin at padding_idx+1. Padding symbols - are ignored. This is modified from fairseq's `utils.make_positions`. - Args: - x: torch.Tensor x: - Returns: torch.Tensor - """ - # The series of casts and type-conversions here are carefully balanced to both work with ONNX export and XLA. - mask = input_ids.ne(padding_idx).int() - incremental_indices = torch.cumsum(mask, dim=1).type_as(mask) * mask - return incremental_indices.long() + padding_idx - - -class LongformerEmbeddings(nn.Module): - """ - Same as BertEmbeddings with a tiny tweak for positional embeddings indexing. - """ - - def __init__(self, config): - super().__init__() - self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id) - self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size) - self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size) - - # self.LayerNorm is not snake-cased to stick with TensorFlow model variable name and be able to load - # any TensorFlow checkpoint file - self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - - self.position_embedding_type = getattr(config, "position_embedding_type", "absolute") - - self.padding_idx = config.pad_token_id - self.position_embeddings = nn.Embedding( - config.max_position_embeddings, config.hidden_size, padding_idx=self.padding_idx - ) - - def forward(self, input_ids=None, token_type_ids=None, position_ids=None, inputs_embeds=None): - if position_ids is None: - if input_ids is not None: - # Create the position ids from the input token ids. Any padded tokens remain padded. - position_ids = create_position_ids_from_input_ids(input_ids, self.padding_idx).to(input_ids.device) - else: - position_ids = self.create_position_ids_from_inputs_embeds(inputs_embeds) - - if input_ids is not None: - input_shape = input_ids.size() - else: - input_shape = inputs_embeds.size()[:-1] - - if token_type_ids is None: - token_type_ids = torch.zeros(input_shape, dtype=torch.long, device=position_ids.device) - - if inputs_embeds is None: - inputs_embeds = self.word_embeddings(input_ids) - position_embeddings = self.position_embeddings(position_ids) - token_type_embeddings = self.token_type_embeddings(token_type_ids) - - embeddings = inputs_embeds + position_embeddings + token_type_embeddings - embeddings = self.LayerNorm(embeddings) - embeddings = self.dropout(embeddings) - return embeddings - - def create_position_ids_from_inputs_embeds(self, inputs_embeds): - """ - We are provided embeddings directly. We cannot infer which are padded so just generate sequential position ids. - Args: - inputs_embeds: torch.Tensor inputs_embeds: - Returns: torch.Tensor - """ - input_shape = inputs_embeds.size()[:-1] - sequence_length = input_shape[1] - - position_ids = torch.arange( - self.padding_idx + 1, sequence_length + self.padding_idx + 1, dtype=torch.long, device=inputs_embeds.device - ) - return position_ids.unsqueeze(0).expand(input_shape) - - -class LongformerSelfAttention(nn.Module): - def __init__(self, config, layer_id): - super().__init__() - if config.hidden_size % config.num_attention_heads != 0: - raise ValueError( - f"The hidden size ({config.hidden_size}) is not a multiple of the number of attention " - f"heads ({config.num_attention_heads})" - ) - self.num_heads = config.num_attention_heads - self.head_dim = int(config.hidden_size / config.num_attention_heads) - self.embed_dim = config.hidden_size - - self.query = nn.Linear(config.hidden_size, self.embed_dim) - self.key = nn.Linear(config.hidden_size, self.embed_dim) - self.value = nn.Linear(config.hidden_size, self.embed_dim) - - # separate projection layers for tokens with global attention - self.query_global = nn.Linear(config.hidden_size, self.embed_dim) - self.key_global = nn.Linear(config.hidden_size, self.embed_dim) - self.value_global = nn.Linear(config.hidden_size, self.embed_dim) - - self.dropout = config.attention_probs_dropout_prob - - self.layer_id = layer_id - attention_window = config.attention_window[self.layer_id] - assert ( - attention_window % 2 == 0 - ), f"`attention_window` for layer {self.layer_id} has to be an even value. Given {attention_window}" - assert ( - attention_window > 0 - ), f"`attention_window` for layer {self.layer_id} has to be positive. Given {attention_window}" - - self.one_sided_attn_window_size = attention_window // 2 - - def forward( - self, - hidden_states, - attention_mask=None, - layer_head_mask=None, - is_index_masked=None, - is_index_global_attn=None, - is_global_attn=None, - output_attentions=False, - ): - """ - [`LongformerSelfAttention`] expects *len(hidden_states)* to be multiple of *attention_window*. Padding to - *attention_window* happens in [`LongformerModel.forward`] to avoid redoing the padding on each layer. - The *attention_mask* is changed in [`LongformerModel.forward`] from 0, 1, 2 to: - - -10000: no attention - - 0: local attention - - +10000: global attention - """ - hidden_states = hidden_states.transpose(0, 1) - - # project hidden states - query_vectors = self.query(hidden_states) - key_vectors = self.key(hidden_states) - value_vectors = self.value(hidden_states) - - seq_len, batch_size, embed_dim = hidden_states.size() - assert ( - embed_dim == self.embed_dim - ), f"hidden_states should have embed_dim = {self.embed_dim}, but has {embed_dim}" - - # normalize query - query_vectors /= math.sqrt(self.head_dim) - - query_vectors = query_vectors.view(seq_len, batch_size, self.num_heads, self.head_dim).transpose(0, 1) - key_vectors = key_vectors.view(seq_len, batch_size, self.num_heads, self.head_dim).transpose(0, 1) - - attn_scores = self._sliding_chunks_query_key_matmul( - query_vectors, key_vectors, self.one_sided_attn_window_size - ) - - # values to pad for attention probs - remove_from_windowed_attention_mask = (attention_mask != 0)[:, :, None, None] - - # cast to fp32/fp16 then replace 1's with -inf - float_mask = remove_from_windowed_attention_mask.type_as(query_vectors).masked_fill( - remove_from_windowed_attention_mask, torch.finfo(query_vectors.dtype).min - ) - # diagonal mask with zeros everywhere and -inf inplace of padding - diagonal_mask = self._sliding_chunks_query_key_matmul( - float_mask.new_ones(size=float_mask.size()), float_mask, self.one_sided_attn_window_size - ) - - # pad local attention probs - attn_scores += diagonal_mask - - assert list(attn_scores.size()) == [ - batch_size, - seq_len, - self.num_heads, - self.one_sided_attn_window_size * 2 + 1, - ], ( - f"local_attn_probs should be of size ({batch_size}, {seq_len}, {self.num_heads}," - f" {self.one_sided_attn_window_size * 2 + 1}), but is of size {attn_scores.size()}" - ) - - # compute local attention probs from global attention keys and contact over window dim - if is_global_attn: - # compute global attn indices required through out forward fn - ( - max_num_global_attn_indices, - is_index_global_attn_nonzero, - is_local_index_global_attn_nonzero, - is_local_index_no_global_attn_nonzero, - ) = self._get_global_attn_indices(is_index_global_attn) - # calculate global attn probs from global key - - global_key_attn_scores = self._concat_with_global_key_attn_probs( - query_vectors=query_vectors, - key_vectors=key_vectors, - max_num_global_attn_indices=max_num_global_attn_indices, - is_index_global_attn_nonzero=is_index_global_attn_nonzero, - is_local_index_global_attn_nonzero=is_local_index_global_attn_nonzero, - is_local_index_no_global_attn_nonzero=is_local_index_no_global_attn_nonzero, - ) - # concat to local_attn_probs - # (batch_size, seq_len, num_heads, extra attention count + 2*window+1) - attn_scores = torch.cat((global_key_attn_scores, attn_scores), dim=-1) - - # free memory - del global_key_attn_scores - - attn_probs = nn.functional.softmax( - attn_scores, dim=-1, dtype=torch.float32 - ) # use fp32 for numerical stability - - if layer_head_mask is not None: - assert layer_head_mask.size() == ( - self.num_heads, - ), f"Head mask for a single layer should be of size {(self.num_heads,)}, but is {layer_head_mask.size()}" - attn_probs = layer_head_mask.view(1, 1, -1, 1) * attn_probs - - # softmax sometimes inserts NaN if all positions are masked, replace them with 0 - attn_probs = torch.masked_fill(attn_probs, is_index_masked[:, :, None, None], 0.0) - attn_probs = attn_probs.type_as(attn_scores) - - # free memory - del attn_scores - - # apply dropout - attn_probs = nn.functional.dropout(attn_probs, p=self.dropout, training=self.training) - - value_vectors = value_vectors.view(seq_len, batch_size, self.num_heads, self.head_dim).transpose(0, 1) - - # compute local attention output with global attention value and add - if is_global_attn: - # compute sum of global and local attn - attn_output = self._compute_attn_output_with_global_indices( - value_vectors=value_vectors, - attn_probs=attn_probs, - max_num_global_attn_indices=max_num_global_attn_indices, - is_index_global_attn_nonzero=is_index_global_attn_nonzero, - is_local_index_global_attn_nonzero=is_local_index_global_attn_nonzero, - ) - else: - # compute local attn only - attn_output = self._sliding_chunks_matmul_attn_probs_value( - attn_probs, value_vectors, self.one_sided_attn_window_size - ) - - assert attn_output.size() == (batch_size, seq_len, self.num_heads, self.head_dim), "Unexpected size" - attn_output = attn_output.transpose(0, 1).reshape(seq_len, batch_size, embed_dim).contiguous() - - # compute value for global attention and overwrite to attention output - # TODO: remove the redundant computation - if is_global_attn: - global_attn_output, global_attn_probs = self._compute_global_attn_output_from_hidden( - hidden_states=hidden_states, - max_num_global_attn_indices=max_num_global_attn_indices, - layer_head_mask=layer_head_mask, - is_local_index_global_attn_nonzero=is_local_index_global_attn_nonzero, - is_index_global_attn_nonzero=is_index_global_attn_nonzero, - is_local_index_no_global_attn_nonzero=is_local_index_no_global_attn_nonzero, - is_index_masked=is_index_masked, - ) - - # get only non zero global attn output - nonzero_global_attn_output = global_attn_output[ - is_local_index_global_attn_nonzero[0], :, is_local_index_global_attn_nonzero[1] - ] - - # overwrite values with global attention - attn_output[is_index_global_attn_nonzero[::-1]] = nonzero_global_attn_output.view( - len(is_local_index_global_attn_nonzero[0]), -1 - ) - # The attention weights for tokens with global attention are - # just filler values, they were never used to compute the output. - # Fill with 0 now, the correct values are in 'global_attn_probs'. - attn_probs[is_index_global_attn_nonzero] = 0 - - outputs = (attn_output.transpose(0, 1),) - - if output_attentions: - outputs += (attn_probs,) - - return outputs + (global_attn_probs,) if (is_global_attn and output_attentions) else outputs - - @staticmethod - def _pad_and_transpose_last_two_dims(hidden_states_padded, padding): - """pads rows and then flips rows and columns""" - hidden_states_padded = nn.functional.pad( - hidden_states_padded, padding - ) # padding value is not important because it will be overwritten - hidden_states_padded = hidden_states_padded.view( - *hidden_states_padded.size()[:-2], hidden_states_padded.size(-1), hidden_states_padded.size(-2) - ) - return hidden_states_padded - - @staticmethod - def _pad_and_diagonalize(chunked_hidden_states): - """ - shift every row 1 step right, converting columns into diagonals. - Example: - ```python - chunked_hidden_states: [ - 0.4983, - 2.6918, - -0.0071, - 1.0492, - -1.8348, - 0.7672, - 0.2986, - 0.0285, - -0.7584, - 0.4206, - -0.0405, - 0.1599, - 2.0514, - -1.1600, - 0.5372, - 0.2629, - ] - window_overlap = num_rows = 4 - ``` - (pad & diagonalize) => [ 0.4983, 2.6918, -0.0071, 1.0492, 0.0000, 0.0000, 0.0000 - 0.0000, -1.8348, 0.7672, 0.2986, 0.0285, 0.0000, 0.0000 0.0000, 0.0000, -0.7584, 0.4206, - -0.0405, 0.1599, 0.0000 0.0000, 0.0000, 0.0000, 2.0514, -1.1600, 0.5372, 0.2629 ] - """ - total_num_heads, num_chunks, window_overlap, hidden_dim = chunked_hidden_states.size() - chunked_hidden_states = nn.functional.pad( - chunked_hidden_states, (0, window_overlap + 1) - ) # total_num_heads x num_chunks x window_overlap x (hidden_dim+window_overlap+1). Padding value is not important because it'll be overwritten - chunked_hidden_states = chunked_hidden_states.view( - total_num_heads, num_chunks, -1 - ) # total_num_heads x num_chunks x window_overlap*window_overlap+window_overlap - chunked_hidden_states = chunked_hidden_states[ - :, :, :-window_overlap - ] # total_num_heads x num_chunks x window_overlap*window_overlap - chunked_hidden_states = chunked_hidden_states.view( - total_num_heads, num_chunks, window_overlap, window_overlap + hidden_dim - ) - chunked_hidden_states = chunked_hidden_states[:, :, :, :-1] - return chunked_hidden_states - - @staticmethod - def _chunk(hidden_states, window_overlap): - """convert into overlapping chunks. Chunk size = 2w, overlap size = w""" - - # non-overlapping chunks of size = 2w - hidden_states = hidden_states.view( - hidden_states.size(0), - hidden_states.size(1) // (window_overlap * 2), - window_overlap * 2, - hidden_states.size(2), - ) - - # use `as_strided` to make the chunks overlap with an overlap size = window_overlap - chunk_size = list(hidden_states.size()) - chunk_size[1] = chunk_size[1] * 2 - 1 - - chunk_stride = list(hidden_states.stride()) - chunk_stride[1] = chunk_stride[1] // 2 - return hidden_states.as_strided(size=chunk_size, stride=chunk_stride) - - @staticmethod - def _mask_invalid_locations(input_tensor, affected_seq_len) -> torch.Tensor: - beginning_mask_2d = input_tensor.new_ones(affected_seq_len, affected_seq_len + 1).tril().flip(dims=[0]) - beginning_mask = beginning_mask_2d[None, :, None, :] - ending_mask = beginning_mask.flip(dims=(1, 3)) - beginning_input = input_tensor[:, :affected_seq_len, :, : affected_seq_len + 1] - beginning_mask = beginning_mask.expand(beginning_input.size()) - beginning_input.masked_fill_(beginning_mask == 1, -float("inf")) # `== 1` converts to bool or uint8 - ending_input = input_tensor[:, -affected_seq_len:, :, -(affected_seq_len + 1) :] - ending_mask = ending_mask.expand(ending_input.size()) - ending_input.masked_fill_(ending_mask == 1, -float("inf")) # `== 1` converts to bool or uint8 - - def _sliding_chunks_query_key_matmul(self, query: torch.Tensor, key: torch.Tensor, window_overlap: int): - """ - Matrix multiplication of query and key tensors using with a sliding window attention pattern. This - implementation splits the input into overlapping chunks of size 2w (e.g. 512 for pretrained Longformer) with an - overlap of size window_overlap - """ - batch_size, seq_len, num_heads, head_dim = query.size() - assert ( - seq_len % (window_overlap * 2) == 0 - ), f"Sequence length should be multiple of {window_overlap * 2}. Given {seq_len}" - assert query.size() == key.size() - - chunks_count = seq_len // window_overlap - 1 - - # group batch_size and num_heads dimensions into one, then chunk seq_len into chunks of size window_overlap * 2 - query = query.transpose(1, 2).reshape(batch_size * num_heads, seq_len, head_dim) - key = key.transpose(1, 2).reshape(batch_size * num_heads, seq_len, head_dim) - - query = self._chunk(query, window_overlap) - key = self._chunk(key, window_overlap) - - # matrix multiplication - # bcxd: batch_size * num_heads x chunks x 2window_overlap x head_dim - # bcyd: batch_size * num_heads x chunks x 2window_overlap x head_dim - # bcxy: batch_size * num_heads x chunks x 2window_overlap x 2window_overlap - diagonal_chunked_attention_scores = torch.einsum("bcxd,bcyd->bcxy", (query, key)) # multiply - - # convert diagonals into columns - diagonal_chunked_attention_scores = self._pad_and_transpose_last_two_dims( - diagonal_chunked_attention_scores, padding=(0, 0, 0, 1) - ) - - # allocate space for the overall attention matrix where the chunks are combined. The last dimension - # has (window_overlap * 2 + 1) columns. The first (window_overlap) columns are the window_overlap lower triangles (attention from a word to - # window_overlap previous words). The following column is attention score from each word to itself, then - # followed by window_overlap columns for the upper triangle. - - diagonal_attention_scores = diagonal_chunked_attention_scores.new_empty( - (batch_size * num_heads, chunks_count + 1, window_overlap, window_overlap * 2 + 1) - ) - - # copy parts from diagonal_chunked_attention_scores into the combined matrix of attentions - # - copying the main diagonal and the upper triangle - diagonal_attention_scores[:, :-1, :, window_overlap:] = diagonal_chunked_attention_scores[ - :, :, :window_overlap, : window_overlap + 1 - ] - diagonal_attention_scores[:, -1, :, window_overlap:] = diagonal_chunked_attention_scores[ - :, -1, window_overlap:, : window_overlap + 1 - ] - # - copying the lower triangle - diagonal_attention_scores[:, 1:, :, :window_overlap] = diagonal_chunked_attention_scores[ - :, :, -(window_overlap + 1) : -1, window_overlap + 1 : - ] - - diagonal_attention_scores[:, 0, 1:window_overlap, 1:window_overlap] = diagonal_chunked_attention_scores[ - :, 0, : window_overlap - 1, 1 - window_overlap : - ] - - # separate batch_size and num_heads dimensions again - diagonal_attention_scores = diagonal_attention_scores.view( - batch_size, num_heads, seq_len, 2 * window_overlap + 1 - ).transpose(2, 1) - - self._mask_invalid_locations(diagonal_attention_scores, window_overlap) - return diagonal_attention_scores - - def _sliding_chunks_matmul_attn_probs_value( - self, attn_probs: torch.Tensor, value: torch.Tensor, window_overlap: int - ): - """ - Same as _sliding_chunks_query_key_matmul but for attn_probs and value tensors. Returned tensor will be of the - same shape as `attn_probs` - """ - batch_size, seq_len, num_heads, head_dim = value.size() - - assert seq_len % (window_overlap * 2) == 0 - assert attn_probs.size()[:3] == value.size()[:3] - assert attn_probs.size(3) == 2 * window_overlap + 1 - chunks_count = seq_len // window_overlap - 1 - # group batch_size and num_heads dimensions into one, then chunk seq_len into chunks of size 2 window overlap - - chunked_attn_probs = attn_probs.transpose(1, 2).reshape( - batch_size * num_heads, seq_len // window_overlap, window_overlap, 2 * window_overlap + 1 - ) - - # group batch_size and num_heads dimensions into one - value = value.transpose(1, 2).reshape(batch_size * num_heads, seq_len, head_dim) - - # pad seq_len with w at the beginning of the sequence and another window overlap at the end - padded_value = nn.functional.pad(value, (0, 0, window_overlap, window_overlap), value=-1) - - # chunk padded_value into chunks of size 3 window overlap and an overlap of size window overlap - chunked_value_size = (batch_size * num_heads, chunks_count + 1, 3 * window_overlap, head_dim) - chunked_value_stride = padded_value.stride() - chunked_value_stride = ( - chunked_value_stride[0], - window_overlap * chunked_value_stride[1], - chunked_value_stride[1], - chunked_value_stride[2], - ) - chunked_value = padded_value.as_strided(size=chunked_value_size, stride=chunked_value_stride) - - chunked_attn_probs = self._pad_and_diagonalize(chunked_attn_probs) - - context = torch.einsum("bcwd,bcdh->bcwh", (chunked_attn_probs, chunked_value)) - return context.view(batch_size, num_heads, seq_len, head_dim).transpose(1, 2) - - @staticmethod - def _get_global_attn_indices(is_index_global_attn): - """compute global attn indices required throughout forward pass""" - # helper variable - num_global_attn_indices = is_index_global_attn.long().sum(dim=1) - - # max number of global attn indices in batch - max_num_global_attn_indices = num_global_attn_indices.max() - - # indices of global attn - is_index_global_attn_nonzero = is_index_global_attn.nonzero(as_tuple=True) - - # helper variable - is_local_index_global_attn = torch.arange( - max_num_global_attn_indices, device=is_index_global_attn.device - ) < num_global_attn_indices.unsqueeze(dim=-1) - - # location of the non-padding values within global attention indices - is_local_index_global_attn_nonzero = is_local_index_global_attn.nonzero(as_tuple=True) - - # location of the padding values within global attention indices - is_local_index_no_global_attn_nonzero = (is_local_index_global_attn == 0).nonzero(as_tuple=True) - return ( - max_num_global_attn_indices, - is_index_global_attn_nonzero, - is_local_index_global_attn_nonzero, - is_local_index_no_global_attn_nonzero, - ) - - def _concat_with_global_key_attn_probs( - self, - key_vectors, - query_vectors, - max_num_global_attn_indices, - is_index_global_attn_nonzero, - is_local_index_global_attn_nonzero, - is_local_index_no_global_attn_nonzero, - ): - batch_size = key_vectors.shape[0] - - # create only global key vectors - key_vectors_only_global = key_vectors.new_zeros( - batch_size, max_num_global_attn_indices, self.num_heads, self.head_dim - ) - - key_vectors_only_global[is_local_index_global_attn_nonzero] = key_vectors[is_index_global_attn_nonzero] - - # (batch_size, seq_len, num_heads, max_num_global_attn_indices) - attn_probs_from_global_key = torch.einsum("blhd,bshd->blhs", (query_vectors, key_vectors_only_global)) - - attn_probs_from_global_key[ - is_local_index_no_global_attn_nonzero[0], :, :, is_local_index_no_global_attn_nonzero[1] - ] = torch.finfo(attn_probs_from_global_key.dtype).min - - return attn_probs_from_global_key - - def _compute_attn_output_with_global_indices( - self, - value_vectors, - attn_probs, - max_num_global_attn_indices, - is_index_global_attn_nonzero, - is_local_index_global_attn_nonzero, - ): - batch_size = attn_probs.shape[0] - - # cut local attn probs to global only - attn_probs_only_global = attn_probs.narrow(-1, 0, max_num_global_attn_indices) - # get value vectors for global only - value_vectors_only_global = value_vectors.new_zeros( - batch_size, max_num_global_attn_indices, self.num_heads, self.head_dim - ) - value_vectors_only_global[is_local_index_global_attn_nonzero] = value_vectors[is_index_global_attn_nonzero] - - # use `matmul` because `einsum` crashes sometimes with fp16 - # attn = torch.einsum('blhs,bshd->blhd', (selected_attn_probs, selected_v)) - # compute attn output only global - attn_output_only_global = torch.matmul( - attn_probs_only_global.transpose(1, 2).clone(), value_vectors_only_global.transpose(1, 2).clone() - ).transpose(1, 2) - - # reshape attn probs - attn_probs_without_global = attn_probs.narrow( - -1, max_num_global_attn_indices, attn_probs.size(-1) - max_num_global_attn_indices - ).contiguous() - - # compute attn output with global - attn_output_without_global = self._sliding_chunks_matmul_attn_probs_value( - attn_probs_without_global, value_vectors, self.one_sided_attn_window_size - ) - return attn_output_only_global + attn_output_without_global - - def _compute_global_attn_output_from_hidden( - self, - hidden_states, - max_num_global_attn_indices, - layer_head_mask, - is_local_index_global_attn_nonzero, - is_index_global_attn_nonzero, - is_local_index_no_global_attn_nonzero, - is_index_masked, - ): - seq_len, batch_size = hidden_states.shape[:2] - - # prepare global hidden states - global_attn_hidden_states = hidden_states.new_zeros(max_num_global_attn_indices, batch_size, self.embed_dim) - global_attn_hidden_states[is_local_index_global_attn_nonzero[::-1]] = hidden_states[ - is_index_global_attn_nonzero[::-1] - ] - - # global key, query, value - global_query_vectors_only_global = self.query_global(global_attn_hidden_states) - global_key_vectors = self.key_global(hidden_states) - global_value_vectors = self.value_global(hidden_states) - - # normalize - global_query_vectors_only_global /= math.sqrt(self.head_dim) - - # reshape - global_query_vectors_only_global = ( - global_query_vectors_only_global.contiguous() - .view(max_num_global_attn_indices, batch_size * self.num_heads, self.head_dim) - .transpose(0, 1) - ) # (batch_size * self.num_heads, max_num_global_attn_indices, head_dim) - global_key_vectors = ( - global_key_vectors.contiguous().view(-1, batch_size * self.num_heads, self.head_dim).transpose(0, 1) - ) # batch_size * self.num_heads, seq_len, head_dim) - global_value_vectors = ( - global_value_vectors.contiguous().view(-1, batch_size * self.num_heads, self.head_dim).transpose(0, 1) - ) # batch_size * self.num_heads, seq_len, head_dim) - - # compute attn scores - global_attn_scores = torch.bmm(global_query_vectors_only_global, global_key_vectors.transpose(1, 2)) - - assert list(global_attn_scores.size()) == [ - batch_size * self.num_heads, - max_num_global_attn_indices, - seq_len, - ], ( - "global_attn_scores have the wrong size. Size should be" - f" {(batch_size * self.num_heads, max_num_global_attn_indices, seq_len)}, but is" - f" {global_attn_scores.size()}." - ) - - global_attn_scores = global_attn_scores.view(batch_size, self.num_heads, max_num_global_attn_indices, seq_len) - - global_attn_scores[ - is_local_index_no_global_attn_nonzero[0], :, is_local_index_no_global_attn_nonzero[1], : - ] = torch.finfo(global_attn_scores.dtype).min - - global_attn_scores = global_attn_scores.masked_fill( - is_index_masked[:, None, None, :], - torch.finfo(global_attn_scores.dtype).min, - ) - - global_attn_scores = global_attn_scores.view(batch_size * self.num_heads, max_num_global_attn_indices, seq_len) - - # compute global attn probs - global_attn_probs_float = nn.functional.softmax( - global_attn_scores, dim=-1, dtype=torch.float32 - ) # use fp32 for numerical stability - - # apply layer head masking - if layer_head_mask is not None: - assert layer_head_mask.size() == ( - self.num_heads, - ), f"Head mask for a single layer should be of size {(self.num_heads,)}, but is {layer_head_mask.size()}" - global_attn_probs_float = layer_head_mask.view(1, -1, 1, 1) * global_attn_probs_float.view( - batch_size, self.num_heads, max_num_global_attn_indices, seq_len - ) - global_attn_probs_float = global_attn_probs_float.view( - batch_size * self.num_heads, max_num_global_attn_indices, seq_len - ) - - global_attn_probs = nn.functional.dropout( - global_attn_probs_float.type_as(global_attn_scores), p=self.dropout, training=self.training - ) - - # global attn output - global_attn_output = torch.bmm(global_attn_probs, global_value_vectors) - - assert list(global_attn_output.size()) == [ - batch_size * self.num_heads, - max_num_global_attn_indices, - self.head_dim, - ], ( - "global_attn_output tensor has the wrong size. Size should be" - f" {(batch_size * self.num_heads, max_num_global_attn_indices, self.head_dim)}, but is" - f" {global_attn_output.size()}." - ) - - global_attn_probs = global_attn_probs.view(batch_size, self.num_heads, max_num_global_attn_indices, seq_len) - global_attn_output = global_attn_output.view( - batch_size, self.num_heads, max_num_global_attn_indices, self.head_dim - ) - return global_attn_output, global_attn_probs - - -# Copied from transformers.models.bert.modeling_bert.BertSelfOutput -class LongformerSelfOutput(nn.Module): - def __init__(self, config): - super().__init__() - self.dense = nn.Linear(config.hidden_size, config.hidden_size) - self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - - def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor: - hidden_states = self.dense(hidden_states) - hidden_states = self.dropout(hidden_states) - hidden_states = self.LayerNorm(hidden_states + input_tensor) - return hidden_states - - -class LongformerAttention(nn.Module): - def __init__(self, config, layer_id=0): - super().__init__() - self.self = LongformerSelfAttention(config, layer_id) - self.output = LongformerSelfOutput(config) - self.pruned_heads = set() - - def prune_heads(self, heads): - if len(heads) == 0: - return - heads, index = find_pruneable_heads_and_indices( - heads, self.self.num_attention_heads, self.self.attention_head_size, self.pruned_heads - ) - - # Prune linear layers - self.self.query = prune_linear_layer(self.self.query, index) - self.self.key = prune_linear_layer(self.self.key, index) - self.self.value = prune_linear_layer(self.self.value, index) - self.output.dense = prune_linear_layer(self.output.dense, index, dim=1) - - # Update hyper params and store pruned heads - self.self.num_attention_heads = self.self.num_attention_heads - len(heads) - self.self.all_head_size = self.self.attention_head_size * self.self.num_attention_heads - self.pruned_heads = self.pruned_heads.union(heads) - - def forward( - self, - hidden_states, - attention_mask=None, - layer_head_mask=None, - is_index_masked=None, - is_index_global_attn=None, - is_global_attn=None, - output_attentions=False, - ): - self_outputs = self.self( - hidden_states, - attention_mask=attention_mask, - layer_head_mask=layer_head_mask, - is_index_masked=is_index_masked, - is_index_global_attn=is_index_global_attn, - is_global_attn=is_global_attn, - output_attentions=output_attentions, - ) - attn_output = self.output(self_outputs[0], hidden_states) - outputs = (attn_output,) + self_outputs[1:] - return outputs - - -# Copied from transformers.models.bert.modeling_bert.BertIntermediate -class LongformerIntermediate(nn.Module): - def __init__(self, config): - super().__init__() - self.dense = nn.Linear(config.hidden_size, config.intermediate_size) - if isinstance(config.hidden_act, str): - self.intermediate_act_fn = ACT2FN[config.hidden_act] - else: - self.intermediate_act_fn = config.hidden_act - - def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: - hidden_states = self.dense(hidden_states) - hidden_states = self.intermediate_act_fn(hidden_states) - return hidden_states - - -# Copied from transformers.models.bert.modeling_bert.BertOutput -class LongformerOutput(nn.Module): - def __init__(self, config): - super().__init__() - self.dense = nn.Linear(config.intermediate_size, config.hidden_size) - self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - - def forward(self, hidden_states: torch.Tensor, input_tensor: torch.Tensor) -> torch.Tensor: - hidden_states = self.dense(hidden_states) - hidden_states = self.dropout(hidden_states) - hidden_states = self.LayerNorm(hidden_states + input_tensor) - return hidden_states - - -class LongformerLayer(nn.Module): - def __init__(self, config, layer_id=0): - super().__init__() - self.attention = LongformerAttention(config, layer_id) - self.intermediate = LongformerIntermediate(config) - self.output = LongformerOutput(config) - self.chunk_size_feed_forward = config.chunk_size_feed_forward - self.seq_len_dim = 1 - - def forward( - self, - hidden_states, - attention_mask=None, - layer_head_mask=None, - is_index_masked=None, - is_index_global_attn=None, - is_global_attn=None, - output_attentions=False, - ): - self_attn_outputs = self.attention( - hidden_states, - attention_mask=attention_mask, - layer_head_mask=layer_head_mask, - is_index_masked=is_index_masked, - is_index_global_attn=is_index_global_attn, - is_global_attn=is_global_attn, - output_attentions=output_attentions, - ) - attn_output = self_attn_outputs[0] - outputs = self_attn_outputs[1:] - - layer_output = apply_chunking_to_forward( - self.ff_chunk, self.chunk_size_feed_forward, self.seq_len_dim, attn_output - ) - outputs = (layer_output,) + outputs - return outputs - - def ff_chunk(self, attn_output): - intermediate_output = self.intermediate(attn_output) - layer_output = self.output(intermediate_output, attn_output) - return layer_output - - -class LongformerEncoder(nn.Module): - def __init__(self, config): - super().__init__() - self.config = config - self.layer = nn.ModuleList([LongformerLayer(config, layer_id=i) for i in range(config.num_hidden_layers)]) - self.gradient_checkpointing = False - - def forward( - self, - hidden_states, - attention_mask=None, - head_mask=None, - padding_len=0, - output_attentions=False, - output_hidden_states=False, - return_dict=True, - ): - - is_index_masked = attention_mask < 0 - is_index_global_attn = attention_mask > 0 - is_global_attn = is_index_global_attn.flatten().any().item() - - all_hidden_states = () if output_hidden_states else None - all_attentions = () if output_attentions else None # All local attentions. - all_global_attentions = () if (output_attentions and is_global_attn) else None - - # check if head_mask has a correct number of layers specified if desired - if head_mask is not None: - assert head_mask.size()[0] == ( - len(self.layer) - ), f"The head_mask should be specified for {len(self.layer)} layers, but it is for {head_mask.size()[0]}." - for idx, layer_module in enumerate(self.layer): - if output_hidden_states: - all_hidden_states = all_hidden_states + (hidden_states,) - - if self.gradient_checkpointing and self.training: - - def create_custom_forward(module): - def custom_forward(*inputs): - return module(*inputs, is_global_attn, output_attentions) - - return custom_forward - - layer_outputs = torch.utils.checkpoint.checkpoint( - create_custom_forward(layer_module), - hidden_states, - attention_mask, - head_mask[idx] if head_mask is not None else None, - is_index_masked, - is_index_global_attn, - ) - else: - layer_outputs = layer_module( - hidden_states, - attention_mask=attention_mask, - layer_head_mask=head_mask[idx] if head_mask is not None else None, - is_index_masked=is_index_masked, - is_index_global_attn=is_index_global_attn, - is_global_attn=is_global_attn, - output_attentions=output_attentions, - ) - hidden_states = layer_outputs[0] - - if output_attentions: - # bzs x seq_len x num_attn_heads x (num_global_attn + attention_window_len + 1) => bzs x num_attn_heads x seq_len x (num_global_attn + attention_window_len + 1) - all_attentions = all_attentions + (layer_outputs[1].transpose(1, 2),) - - if is_global_attn: - # bzs x num_attn_heads x num_global_attn x seq_len => bzs x num_attn_heads x seq_len x num_global_attn - all_global_attentions = all_global_attentions + (layer_outputs[2].transpose(2, 3),) - - # Add last layer - if output_hidden_states: - all_hidden_states = all_hidden_states + (hidden_states,) - - # undo padding - if padding_len > 0: - # unpad `hidden_states` because the calling function is expecting a length == input_ids.size(1) - hidden_states = hidden_states[:, :-padding_len] - if output_hidden_states: - all_hidden_states = tuple([state[:, :-padding_len] for state in all_hidden_states]) - - if output_attentions: - all_attentions = tuple([state[:, :, :-padding_len, :] for state in all_attentions]) - - if not return_dict: - return tuple( - v for v in [hidden_states, all_hidden_states, all_attentions, all_global_attentions] if v is not None - ) - return LongformerBaseModelOutput( - last_hidden_state=hidden_states, - hidden_states=all_hidden_states, - attentions=all_attentions, - global_attentions=all_global_attentions, - ) - - -# Copied from transformers.models.bert.modeling_bert.BertPooler -class LongformerPooler(nn.Module): - def __init__(self, config): - super().__init__() - self.dense = nn.Linear(config.hidden_size, config.hidden_size) - self.activation = nn.Tanh() - - def forward(self, hidden_states: torch.Tensor) -> torch.Tensor: - # We "pool" the model by simply taking the hidden state corresponding - # to the first token. - first_token_tensor = hidden_states[:, 0] - pooled_output = self.dense(first_token_tensor) - pooled_output = self.activation(pooled_output) - return pooled_output - - -# Copied from transformers.models.roberta.modeling_roberta.RobertaLMHead with Roberta->Longformer -class LongformerLMHead(nn.Module): - """Longformer Head for masked language modeling.""" - - def __init__(self, config): - super().__init__() - self.dense = nn.Linear(config.hidden_size, config.hidden_size) - self.layer_norm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps) - - self.decoder = nn.Linear(config.hidden_size, config.vocab_size) - self.bias = nn.Parameter(torch.zeros(config.vocab_size)) - self.decoder.bias = self.bias - - def forward(self, features, **kwargs): - x = self.dense(features) - x = gelu(x) - x = self.layer_norm(x) - - # project back to size of vocabulary with bias - x = self.decoder(x) - - return x - - def _tie_weights(self): - # To tie those two weights if they get disconnected (on TPU or when the bias is resized) - self.bias = self.decoder.bias - - -class LongformerPreTrainedModel(PreTrainedModel): - """ - An abstract class to handle weights initialization and a simple interface for downloading and loading pretrained - models. - """ - - config_class = LongformerConfig - base_model_prefix = "longformer" - supports_gradient_checkpointing = True - _keys_to_ignore_on_load_unexpected = [r"position_ids"] - - def _init_weights(self, module): - """Initialize the weights""" - if isinstance(module, nn.Linear): - # Slightly different from the TF version which uses truncated_normal for initialization - # cf https://github.com/pytorch/pytorch/pull/5617 - module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) - if module.bias is not None: - module.bias.data.zero_() - elif isinstance(module, nn.Embedding): - module.weight.data.normal_(mean=0.0, std=self.config.initializer_range) - if module.padding_idx is not None: - module.weight.data[module.padding_idx].zero_() - elif isinstance(module, nn.LayerNorm): - module.bias.data.zero_() - module.weight.data.fill_(1.0) - - def _set_gradient_checkpointing(self, module, value=False): - if isinstance(module, LongformerEncoder): - module.gradient_checkpointing = value - - -LONGFORMER_START_DOCSTRING = r""" - This model inherits from [`PreTrainedModel`]. Check the superclass documentation for the generic methods the - library implements for all its model (such as downloading or saving, resizing the input embeddings, pruning heads - etc.) - This model is also a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. - Use it as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage - and behavior. - Parameters: - config ([`LongformerConfig`]): Model configuration class with all the parameters of the - model. Initializing with a config file does not load the weights associated with the model, only the - configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights. -""" - -LONGFORMER_INPUTS_DOCSTRING = r""" - Args: - input_ids (`torch.LongTensor` of shape `({0})`): - Indices of input sequence tokens in the vocabulary. - Indices can be obtained using [`LongformerTokenizer`]. See [`PreTrainedTokenizer.encode`] and - [`PreTrainedTokenizer.__call__`] for details. - [What are input IDs?](../glossary#input-ids) - attention_mask (`torch.FloatTensor` of shape `({0})`, *optional*): - Mask to avoid performing attention on padding token indices. Mask values selected in `[0, 1]`: - - 1 for tokens that are **not masked**, - - 0 for tokens that are **masked**. - [What are attention masks?](../glossary#attention-mask) - global_attention_mask (`torch.FloatTensor` of shape `({0})`, *optional*): - Mask to decide the attention given on each token, local attention or global attention. Tokens with global - attention attends to all other tokens, and all other tokens attend to them. This is important for - task-specific finetuning because it makes the model more flexible at representing the task. For example, - for classification, the token should be given global attention. For QA, all question tokens should also - have global attention. Please refer to the [Longformer paper](https://arxiv.org/abs/2004.05150) for more - details. Mask values selected in `[0, 1]`: - - 0 for local attention (a sliding window attention), - - 1 for global attention (tokens that attend to all other tokens, and all other tokens attend to them). - head_mask (`torch.Tensor` of shape `(num_layers, num_heads)`, *optional*): - Mask to nullify selected heads of the attention modules in the encoder. Mask values selected in `[0, 1]`: - - 1 indicates the head is **not masked**, - - 0 indicates the head is **masked**. - decoder_head_mask (`torch.Tensor` of shape `(num_layers, num_heads)`, *optional*): - Mask to nullify selected heads of the attention modules in the decoder. Mask values selected in `[0, 1]`: - - 1 indicates the head is **not masked**, - - 0 indicates the head is **masked**. - token_type_ids (`torch.LongTensor` of shape `({0})`, *optional*): - Segment token indices to indicate first and second portions of the inputs. Indices are selected in `[0, - 1]`: - - 0 corresponds to a *sentence A* token, - - 1 corresponds to a *sentence B* token. - [What are token type IDs?](../glossary#token-type-ids) - position_ids (`torch.LongTensor` of shape `({0})`, *optional*): - Indices of positions of each input sequence tokens in the position embeddings. Selected in the range `[0, - config.max_position_embeddings - 1]`. - [What are position IDs?](../glossary#position-ids) - inputs_embeds (`torch.FloatTensor` of shape `({0}, hidden_size)`, *optional*): - Optionally, instead of passing `input_ids` you can choose to directly pass an embedded representation. This - is useful if you want more control over how to convert `input_ids` indices into associated vectors than the - model's internal embedding lookup matrix. - output_attentions (`bool`, *optional*): - Whether or not to return the attentions tensors of all attention layers. See `attentions` under returned - tensors for more detail. - output_hidden_states (`bool`, *optional*): - Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for - more detail. - return_dict (`bool`, *optional*): - Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple. -""" - - -@add_start_docstrings( - "The bare Longformer Model outputting raw hidden-states without any specific head on top.", - LONGFORMER_START_DOCSTRING, -) -class LongformerModel(LongformerPreTrainedModel): - """ - This class copied code from [`RobertaModel`] and overwrote standard self-attention with longformer self-attention - to provide the ability to process long sequences following the self-attention approach described in [Longformer: - the Long-Document Transformer](https://arxiv.org/abs/2004.05150) by Iz Beltagy, Matthew E. Peters, and Arman Cohan. - Longformer self-attention combines a local (sliding window) and global attention to extend to long documents - without the O(n^2) increase in memory and compute. - The self-attention module `LongformerSelfAttention` implemented here supports the combination of local and global - attention but it lacks support for autoregressive attention and dilated attention. Autoregressive and dilated - attention are more relevant for autoregressive language modeling than finetuning on downstream tasks. Future - release will add support for autoregressive attention, but the support for dilated attention requires a custom CUDA - kernel to be memory and compute efficient. - """ - - def __init__(self, config, add_pooling_layer=True): - super().__init__(config) - self.config = config - - if isinstance(config.attention_window, int): - assert config.attention_window % 2 == 0, "`config.attention_window` has to be an even value" - assert config.attention_window > 0, "`config.attention_window` has to be positive" - config.attention_window = [config.attention_window] * config.num_hidden_layers # one value per layer - else: - assert len(config.attention_window) == config.num_hidden_layers, ( - "`len(config.attention_window)` should equal `config.num_hidden_layers`. " - f"Expected {config.num_hidden_layers}, given {len(config.attention_window)}" - ) - - self.embeddings = LongformerEmbeddings(config) - self.encoder = LongformerEncoder(config) - self.pooler = LongformerPooler(config) if add_pooling_layer else None - - # Initialize weights and apply final processing - self.post_init() - - def get_input_embeddings(self): - return self.embeddings.word_embeddings - - def set_input_embeddings(self, value): - self.embeddings.word_embeddings = value - - def _prune_heads(self, heads_to_prune): - """ - Prunes heads of the model. heads_to_prune: dict of {layer_num: list of heads to prune in this layer} See base - class PreTrainedModel - """ - for layer, heads in heads_to_prune.items(): - self.encoder.layer[layer].attention.prune_heads(heads) - - def _pad_to_window_size( - self, - input_ids: torch.Tensor, - attention_mask: torch.Tensor, - token_type_ids: torch.Tensor, - position_ids: torch.Tensor, - inputs_embeds: torch.Tensor, - pad_token_id: int, - ): - """A helper function to pad tokens and mask to work with implementation of Longformer self-attention.""" - # padding - attention_window = ( - self.config.attention_window - if isinstance(self.config.attention_window, int) - else max(self.config.attention_window) - ) - - assert attention_window % 2 == 0, f"`attention_window` should be an even value. Given {attention_window}" - input_shape = input_ids.shape if input_ids is not None else inputs_embeds.shape - batch_size, seq_len = input_shape[:2] - - padding_len = (attention_window - seq_len % attention_window) % attention_window - if padding_len > 0: - ''' - logger.info( - f"Input ids are automatically padded from {seq_len} to {seq_len + padding_len} to be a multiple of " - f"`config.attention_window`: {attention_window}" - ) - ''' - if input_ids is not None: - input_ids = nn.functional.pad(input_ids, (0, padding_len), value=pad_token_id) - if position_ids is not None: - # pad with position_id = pad_token_id as in modeling_roberta.RobertaEmbeddings - position_ids = nn.functional.pad(position_ids, (0, padding_len), value=pad_token_id) - if inputs_embeds is not None: - input_ids_padding = inputs_embeds.new_full( - (batch_size, padding_len), - self.config.pad_token_id, - dtype=torch.long, - ) - inputs_embeds_padding = self.embeddings(input_ids_padding) - inputs_embeds = torch.cat([inputs_embeds, inputs_embeds_padding], dim=-2) - - attention_mask = nn.functional.pad( - attention_mask, (0, padding_len), value=False - ) # no attention on the padding tokens - token_type_ids = nn.functional.pad(token_type_ids, (0, padding_len), value=0) # pad with token_type_id = 0 - - return padding_len, input_ids, attention_mask, token_type_ids, position_ids, inputs_embeds - - def _merge_to_attention_mask(self, attention_mask: torch.Tensor, global_attention_mask: torch.Tensor): - # longformer self attention expects attention mask to have 0 (no attn), 1 (local attn), 2 (global attn) - # (global_attention_mask + 1) => 1 for local attention, 2 for global attention - # => final attention_mask => 0 for no attention, 1 for local attention 2 for global attention - if attention_mask is not None: - attention_mask = attention_mask * (global_attention_mask + 1) - else: - # simply use `global_attention_mask` as `attention_mask` - # if no `attention_mask` is given - attention_mask = global_attention_mask + 1 - return attention_mask - - @add_start_docstrings_to_model_forward(LONGFORMER_INPUTS_DOCSTRING.format("batch_size, sequence_length")) - @replace_return_docstrings(output_type=LongformerBaseModelOutputWithPooling, config_class=_CONFIG_FOR_DOC) - def forward( - self, - input_ids: Optional[torch.Tensor] = None, - attention_mask: Optional[torch.Tensor] = None, - global_attention_mask: Optional[torch.Tensor] = None, - head_mask: Optional[torch.Tensor] = None, - token_type_ids: Optional[torch.Tensor] = None, - position_ids: Optional[torch.Tensor] = None, - inputs_embeds: Optional[torch.Tensor] = None, - output_attentions: Optional[bool] = None, - output_hidden_states: Optional[bool] = None, - return_dict: Optional[bool] = None, - ) -> Union[Tuple, LongformerBaseModelOutputWithPooling]: - r""" - Returns: - Examples: - ```python - >>> import torch - >>> from transformers import LongformerModel, LongformerTokenizer - >>> model = LongformerModel.from_pretrained("allenai/longformer-base-4096") - >>> tokenizer = LongformerTokenizer.from_pretrained("allenai/longformer-base-4096") - >>> SAMPLE_TEXT = " ".join(["Hello world! "] * 1000) # long input document - >>> input_ids = torch.tensor(tokenizer.encode(SAMPLE_TEXT)).unsqueeze(0) # batch of size 1 - >>> attention_mask = torch.ones( - ... input_ids.shape, dtype=torch.long, device=input_ids.device - ... ) # initialize to local attention - >>> global_attention_mask = torch.zeros( - ... input_ids.shape, dtype=torch.long, device=input_ids.device - ... ) # initialize to global attention to be deactivated for all tokens - >>> global_attention_mask[ - ... :, - ... [ - ... 1, - ... 4, - ... 21, - ... ], - ... ] = 1 # Set global attention to random tokens for the sake of this example - >>> # Usually, set global attention based on the task. For example, - >>> # classification: the token - >>> # QA: question tokens - >>> # LM: potentially on the beginning of sentences and paragraphs - >>> outputs = model(input_ids, attention_mask=attention_mask, global_attention_mask=global_attention_mask) - >>> sequence_output = outputs.last_hidden_state - >>> pooled_output = outputs.pooler_output - ```""" - - output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions - output_hidden_states = ( - output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states - ) - return_dict = return_dict if return_dict is not None else self.config.use_return_dict - - if input_ids is not None and inputs_embeds is not None: - raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time") - elif input_ids is not None: - input_shape = input_ids.size() - elif inputs_embeds is not None: - input_shape = inputs_embeds.size()[:-1] - else: - raise ValueError("You have to specify either input_ids or inputs_embeds") - - device = input_ids.device if input_ids is not None else inputs_embeds.device - - if attention_mask is None: - attention_mask = torch.ones(input_shape, device=device) - if token_type_ids is None: - token_type_ids = torch.zeros(input_shape, dtype=torch.long, device=device) - - # merge `global_attention_mask` and `attention_mask` - if global_attention_mask is not None: - attention_mask = self._merge_to_attention_mask(attention_mask, global_attention_mask) - - padding_len, input_ids, attention_mask, token_type_ids, position_ids, inputs_embeds = self._pad_to_window_size( - input_ids=input_ids, - attention_mask=attention_mask, - token_type_ids=token_type_ids, - position_ids=position_ids, - inputs_embeds=inputs_embeds, - pad_token_id=self.config.pad_token_id, - ) - - # We can provide a self-attention mask of dimensions [batch_size, from_seq_length, to_seq_length] - # ourselves in which case we just need to make it broadcastable to all heads. - extended_attention_mask: torch.Tensor = self.get_extended_attention_mask(attention_mask, input_shape)[ - :, 0, 0, : - ] - - embedding_output = self.embeddings( - input_ids=input_ids, position_ids=position_ids, token_type_ids=token_type_ids, inputs_embeds=inputs_embeds - ) - - encoder_outputs = self.encoder( - embedding_output, - attention_mask=extended_attention_mask, - head_mask=head_mask, - padding_len=padding_len, - output_attentions=output_attentions, - output_hidden_states=output_hidden_states, - return_dict=return_dict, - ) - sequence_output = encoder_outputs[0] - pooled_output = self.pooler(sequence_output) if self.pooler is not None else None - - if not return_dict: - return (sequence_output, pooled_output) + encoder_outputs[1:] - - return LongformerBaseModelOutputWithPooling( - last_hidden_state=sequence_output, - pooler_output=pooled_output, - hidden_states=encoder_outputs.hidden_states, - attentions=encoder_outputs.attentions, - global_attentions=encoder_outputs.global_attentions, - ) - - -@add_start_docstrings("""Longformer Model with a `language modeling` head on top.""", LONGFORMER_START_DOCSTRING) -class LongformerForMaskedLM(LongformerPreTrainedModel): - - _keys_to_ignore_on_load_unexpected = [r"pooler"] - - def __init__(self, config): - super().__init__(config) - - self.longformer = LongformerModel(config, add_pooling_layer=False) - self.lm_head = LongformerLMHead(config) - - # Initialize weights and apply final processing - self.post_init() - - def get_output_embeddings(self): - return self.lm_head.decoder - - def set_output_embeddings(self, new_embeddings): - self.lm_head.decoder = new_embeddings - - @add_start_docstrings_to_model_forward(LONGFORMER_INPUTS_DOCSTRING.format("batch_size, sequence_length")) - @replace_return_docstrings(output_type=LongformerMaskedLMOutput, config_class=_CONFIG_FOR_DOC) - def forward( - self, - input_ids: Optional[torch.Tensor] = None, - attention_mask: Optional[torch.Tensor] = None, - global_attention_mask: Optional[torch.Tensor] = None, - head_mask: Optional[torch.Tensor] = None, - token_type_ids: Optional[torch.Tensor] = None, - position_ids: Optional[torch.Tensor] = None, - inputs_embeds: Optional[torch.Tensor] = None, - labels: Optional[torch.Tensor] = None, - output_attentions: Optional[bool] = None, - output_hidden_states: Optional[bool] = None, - return_dict: Optional[bool] = None, - ) -> Union[Tuple, LongformerMaskedLMOutput]: - r""" - labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): - Labels for computing the masked language modeling loss. Indices should be in `[-100, 0, ..., - config.vocab_size]` (see `input_ids` docstring) Tokens with indices set to `-100` are ignored (masked), the - loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]` - kwargs (`Dict[str, any]`, optional, defaults to *{}*): - Used to hide legacy arguments that have been deprecated. - Returns: - Mask filling example: - ```python - >>> from transformers import LongformerTokenizer, LongformerForMaskedLM - >>> tokenizer = LongformerTokenizer.from_pretrained("allenai/longformer-base-4096") - >>> model = LongformerForMaskedLM.from_pretrained("allenai/longformer-base-4096") - ``` - Let's try a very long input. - ```python - >>> TXT = ( - ... "My friends are but they eat too many carbs." - ... + " That's why I decide not to eat with them." * 300 - ... ) - >>> input_ids = tokenizer([TXT], return_tensors="pt")["input_ids"] - >>> logits = model(input_ids).logits - >>> masked_index = (input_ids[0] == tokenizer.mask_token_id).nonzero().item() - >>> probs = logits[0, masked_index].softmax(dim=0) - >>> values, predictions = probs.topk(5) - >>> tokenizer.decode(predictions).split() - ['healthy', 'skinny', 'thin', 'good', 'vegetarian'] - ```""" - return_dict = return_dict if return_dict is not None else self.config.use_return_dict - - outputs = self.longformer( - input_ids, - attention_mask=attention_mask, - global_attention_mask=global_attention_mask, - head_mask=head_mask, - token_type_ids=token_type_ids, - position_ids=position_ids, - inputs_embeds=inputs_embeds, - output_attentions=output_attentions, - output_hidden_states=output_hidden_states, - return_dict=return_dict, - ) - sequence_output = outputs[0] - prediction_scores = self.lm_head(sequence_output) - - masked_lm_loss = None - if labels is not None: - loss_fct = CrossEntropyLoss() - masked_lm_loss = loss_fct(prediction_scores.view(-1, self.config.vocab_size), labels.view(-1)) - - if not return_dict: - output = (prediction_scores,) + outputs[2:] - return ((masked_lm_loss,) + output) if masked_lm_loss is not None else output - - return LongformerMaskedLMOutput( - loss=masked_lm_loss, - logits=prediction_scores, - hidden_states=outputs.hidden_states, - attentions=outputs.attentions, - global_attentions=outputs.global_attentions, - ) - - -@add_start_docstrings( - """ - Longformer Model transformer with a sequence classification/regression head on top (a linear layer on top of the - pooled output) e.g. for GLUE tasks. - """, - LONGFORMER_START_DOCSTRING, -) -class LongformerForSequenceClassification(LongformerPreTrainedModel): - - _keys_to_ignore_on_load_unexpected = [r"pooler"] - - def __init__(self, config): - super().__init__(config) - self.num_labels = config.num_labels - self.config = config - - self.longformer = LongformerModel(config, add_pooling_layer=False) - self.classifier = LongformerClassificationHead(config) - - # Initialize weights and apply final processing - self.post_init() - - @add_start_docstrings_to_model_forward(LONGFORMER_INPUTS_DOCSTRING.format("batch_size, sequence_length")) - @add_code_sample_docstrings( - processor_class=_TOKENIZER_FOR_DOC, - checkpoint="jpelhaw/longformer-base-plagiarism-detection", - output_type=LongformerSequenceClassifierOutput, - config_class=_CONFIG_FOR_DOC, - expected_output="'ORIGINAL'", - expected_loss=5.44, - ) - def forward( - self, - input_ids: Optional[torch.Tensor] = None, - attention_mask: Optional[torch.Tensor] = None, - global_attention_mask: Optional[torch.Tensor] = None, - head_mask: Optional[torch.Tensor] = None, - token_type_ids: Optional[torch.Tensor] = None, - position_ids: Optional[torch.Tensor] = None, - inputs_embeds: Optional[torch.Tensor] = None, - labels: Optional[torch.Tensor] = None, - output_attentions: Optional[bool] = None, - output_hidden_states: Optional[bool] = None, - return_dict: Optional[bool] = None, - ) -> Union[Tuple, LongformerSequenceClassifierOutput]: - r""" - labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): - Labels for computing the sequence classification/regression loss. Indices should be in `[0, ..., - config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If - `config.num_labels > 1` a classification loss is computed (Cross-Entropy). - """ - return_dict = return_dict if return_dict is not None else self.config.use_return_dict - - if global_attention_mask is None: - logger.info("Initializing global attention on CLS token...") - global_attention_mask = torch.zeros_like(input_ids) - # global attention on cls token - global_attention_mask[:, 0] = 1 - - outputs = self.longformer( - input_ids, - attention_mask=attention_mask, - global_attention_mask=global_attention_mask, - head_mask=head_mask, - token_type_ids=token_type_ids, - position_ids=position_ids, - inputs_embeds=inputs_embeds, - output_attentions=output_attentions, - output_hidden_states=output_hidden_states, - return_dict=return_dict, - ) - sequence_output = outputs[0] - logits = self.classifier(sequence_output) - - loss = None - if labels is not None: - if self.config.problem_type is None: - if self.num_labels == 1: - self.config.problem_type = "regression" - elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int): - self.config.problem_type = "single_label_classification" - else: - self.config.problem_type = "multi_label_classification" - - if self.config.problem_type == "regression": - loss_fct = MSELoss() - if self.num_labels == 1: - loss = loss_fct(logits.squeeze(), labels.squeeze()) - else: - loss = loss_fct(logits, labels) - elif self.config.problem_type == "single_label_classification": - loss_fct = CrossEntropyLoss() - loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1)) - elif self.config.problem_type == "multi_label_classification": - loss_fct = BCEWithLogitsLoss() - loss = loss_fct(logits, labels) - - if not return_dict: - output = (logits,) + outputs[2:] - return ((loss,) + output) if loss is not None else output - - return LongformerSequenceClassifierOutput( - loss=loss, - logits=logits, - hidden_states=outputs.hidden_states, - attentions=outputs.attentions, - global_attentions=outputs.global_attentions, - ) - - -class LongformerClassificationHead(nn.Module): - """Head for sentence-level classification tasks.""" - - def __init__(self, config): - super().__init__() - self.dense = nn.Linear(config.hidden_size, config.hidden_size) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - self.out_proj = nn.Linear(config.hidden_size, config.num_labels) - - def forward(self, hidden_states, **kwargs): - hidden_states = hidden_states[:, 0, :] # take token (equiv. to [CLS]) - hidden_states = self.dropout(hidden_states) - hidden_states = self.dense(hidden_states) - hidden_states = torch.tanh(hidden_states) - hidden_states = self.dropout(hidden_states) - output = self.out_proj(hidden_states) - return output - - -@add_start_docstrings( - """ - Longformer Model with a span classification head on top for extractive question-answering tasks like SQuAD / - TriviaQA (a linear layers on top of the hidden-states output to compute `span start logits` and `span end logits`). - """, - LONGFORMER_START_DOCSTRING, -) -class LongformerForQuestionAnswering(LongformerPreTrainedModel): - - _keys_to_ignore_on_load_unexpected = [r"pooler"] - - def __init__(self, config): - super().__init__(config) - self.num_labels = config.num_labels - - self.longformer = LongformerModel(config, add_pooling_layer=False) - self.qa_outputs = nn.Linear(config.hidden_size, config.num_labels) - - # Initialize weights and apply final processing - self.post_init() - - @add_start_docstrings_to_model_forward(LONGFORMER_INPUTS_DOCSTRING.format("batch_size, sequence_length")) - @replace_return_docstrings(output_type=LongformerQuestionAnsweringModelOutput, config_class=_CONFIG_FOR_DOC) - def forward( - self, - input_ids: Optional[torch.Tensor] = None, - attention_mask: Optional[torch.Tensor] = None, - global_attention_mask: Optional[torch.Tensor] = None, - head_mask: Optional[torch.Tensor] = None, - token_type_ids: Optional[torch.Tensor] = None, - position_ids: Optional[torch.Tensor] = None, - inputs_embeds: Optional[torch.Tensor] = None, - start_positions: Optional[torch.Tensor] = None, - end_positions: Optional[torch.Tensor] = None, - output_attentions: Optional[bool] = None, - output_hidden_states: Optional[bool] = None, - return_dict: Optional[bool] = None, - ) -> Union[Tuple, LongformerQuestionAnsweringModelOutput]: - r""" - start_positions (`torch.LongTensor` of shape `(batch_size,)`, *optional*): - Labels for position (index) of the start of the labelled span for computing the token classification loss. - Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence - are not taken into account for computing the loss. - end_positions (`torch.LongTensor` of shape `(batch_size,)`, *optional*): - Labels for position (index) of the end of the labelled span for computing the token classification loss. - Positions are clamped to the length of the sequence (`sequence_length`). Position outside of the sequence - are not taken into account for computing the loss. - Returns: - Examples: - ```python - >>> from transformers import LongformerTokenizer, LongformerForQuestionAnswering - >>> import torch - >>> tokenizer = LongformerTokenizer.from_pretrained("allenai/longformer-large-4096-finetuned-triviaqa") - >>> model = LongformerForQuestionAnswering.from_pretrained("allenai/longformer-large-4096-finetuned-triviaqa") - >>> question, text = "Who was Jim Henson?", "Jim Henson was a nice puppet" - >>> encoding = tokenizer(question, text, return_tensors="pt") - >>> input_ids = encoding["input_ids"] - >>> # default is local attention everywhere - >>> # the forward method will automatically set global attention on question tokens - >>> attention_mask = encoding["attention_mask"] - >>> outputs = model(input_ids, attention_mask=attention_mask) - >>> start_logits = outputs.start_logits - >>> end_logits = outputs.end_logits - >>> all_tokens = tokenizer.convert_ids_to_tokens(input_ids[0].tolist()) - >>> answer_tokens = all_tokens[torch.argmax(start_logits) : torch.argmax(end_logits) + 1] - >>> answer = tokenizer.decode( - ... tokenizer.convert_tokens_to_ids(answer_tokens) - ... ) # remove space prepending space token - ```""" - return_dict = return_dict if return_dict is not None else self.config.use_return_dict - - if global_attention_mask is None: - if input_ids is None: - logger.warning( - "It is not possible to automatically generate the `global_attention_mask` because input_ids is" - " None. Please make sure that it is correctly set." - ) - else: - # set global attention on question tokens automatically - global_attention_mask = _compute_global_attention_mask(input_ids, self.config.sep_token_id) - - outputs = self.longformer( - input_ids, - attention_mask=attention_mask, - global_attention_mask=global_attention_mask, - head_mask=head_mask, - token_type_ids=token_type_ids, - position_ids=position_ids, - inputs_embeds=inputs_embeds, - output_attentions=output_attentions, - output_hidden_states=output_hidden_states, - return_dict=return_dict, - ) - - sequence_output = outputs[0] - # because of batch=1 and not max_seq_length, the blow code not use. - padding_len = input_ids[0].eq(1).sum() - if padding_len > 0: - sequence_output = sequence_output[:, :-padding_len] - - logits = self.qa_outputs(sequence_output) - start_logits, end_logits = logits.split(1, dim=-1) - start_logits = start_logits.squeeze(-1).contiguous() - end_logits = end_logits.squeeze(-1).contiguous() - - # align to original longformer loss. - regular_softmax_loss = False - - total_loss = None - if start_positions is not None and end_positions is not None: - # If we are on multi-GPU, split add a dimension - if len(start_positions.size()) > 1: - start_positions = start_positions.squeeze(-1) - if len(end_positions.size()) > 1: - end_positions = end_positions.squeeze(-1) - - if not regular_softmax_loss: - # loss function suggested in section 2.2 here https://arxiv.org/pdf/1710.10723.pdf - # NOTE: this returns sum of losses, not mean, so loss won't be normalized across different batch sizes - # but batch size is always 1, so this is not a problem - start_loss = self.or_softmax_cross_entropy_loss_one_doc(start_logits, start_positions, ignore_index=-1) - end_loss = self.or_softmax_cross_entropy_loss_one_doc(end_logits, end_positions, ignore_index=-1) - else: - loss_fct = torch.nn.CrossEntropyLoss(ignore_index=-1) - start_positions = start_positions[:, 0:1] - end_positions = end_positions[:, 0:1] - start_loss = loss_fct(start_logits, start_positions[:, 0]) - end_loss = loss_fct(end_logits, end_positions[:, 0]) - - total_loss = (start_loss + end_loss) / 2 - - if not return_dict: - output = (start_logits, end_logits) + outputs[2:] - return ((total_loss,) + output) if total_loss is not None else output - - return LongformerQuestionAnsweringModelOutput( - loss=total_loss, - start_logits=start_logits, - end_logits=end_logits, - hidden_states=outputs.hidden_states, - attentions=outputs.attentions, - global_attentions=outputs.global_attentions, - ) - - def or_softmax_cross_entropy_loss_one_doc(self, logits, target, ignore_index=-1, dim=-1): - """loss function suggested in section 2.2 here https://arxiv.org/pdf/1710.10723.pdf""" - assert logits.ndim == 2 - assert target.ndim == 2 - assert logits.size(0) == target.size(0) - - # with regular CrossEntropyLoss, the numerator is only one of the logits specified by the target - # here, the numerator is the sum of a few potential targets, where some of them is the correct answer - - # compute a target mask - target_mask = target == ignore_index - # replaces ignore_index with 0, so `gather` will select logit at index 0 for the msked targets - masked_target = target * (1 - target_mask.long()) - # gather logits - gathered_logits = logits.gather(dim=dim, index=masked_target) - # Apply the mask to gathered_logits. Use a mask of -inf because exp(-inf) = 0 - gathered_logits[target_mask] = float('-inf') - - # each batch is one example - gathered_logits = gathered_logits.view(1, -1) - logits = logits.view(1, -1) - - # numerator = log(sum(exp(gathered logits))) - log_score = torch.logsumexp(gathered_logits, dim=dim, keepdim=False) - # denominator = log(sum(exp(logits))) - log_norm = torch.logsumexp(logits, dim=dim, keepdim=False) - - # compute the loss - loss = -(log_score - log_norm) - - # some of the examples might have a loss of `inf` when `target` is all `ignore_index`. - # remove those from the loss before computing the sum. Use sum instead of mean because - # it is easier to compute - return loss[~torch.isinf(loss)].sum() - - -@add_start_docstrings( - """ - Longformer Model with a token classification head on top (a linear layer on top of the hidden-states output) e.g. - for Named-Entity-Recognition (NER) tasks. - """, - LONGFORMER_START_DOCSTRING, -) -class LongformerForTokenClassification(LongformerPreTrainedModel): - - _keys_to_ignore_on_load_unexpected = [r"pooler"] - - def __init__(self, config): - super().__init__(config) - self.num_labels = config.num_labels - - self.longformer = LongformerModel(config, add_pooling_layer=False) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - self.classifier = nn.Linear(config.hidden_size, config.num_labels) - - # Initialize weights and apply final processing - self.post_init() - - @add_start_docstrings_to_model_forward(LONGFORMER_INPUTS_DOCSTRING.format("batch_size, sequence_length")) - @add_code_sample_docstrings( - processor_class=_TOKENIZER_FOR_DOC, - checkpoint="brad1141/Longformer-finetuned-norm", - output_type=LongformerTokenClassifierOutput, - config_class=_CONFIG_FOR_DOC, - expected_output=( - "['Evidence', 'Evidence', 'Evidence', 'Evidence', 'Evidence', 'Evidence', 'Evidence', 'Evidence'," - " 'Evidence', 'Evidence', 'Evidence', 'Evidence']" - ), - expected_loss=0.63, - ) - def forward( - self, - input_ids: Optional[torch.Tensor] = None, - attention_mask: Optional[torch.Tensor] = None, - global_attention_mask: Optional[torch.Tensor] = None, - head_mask: Optional[torch.Tensor] = None, - token_type_ids: Optional[torch.Tensor] = None, - position_ids: Optional[torch.Tensor] = None, - inputs_embeds: Optional[torch.Tensor] = None, - labels: Optional[torch.Tensor] = None, - output_attentions: Optional[bool] = None, - output_hidden_states: Optional[bool] = None, - return_dict: Optional[bool] = None, - ) -> Union[Tuple, LongformerTokenClassifierOutput]: - r""" - labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*): - Labels for computing the token classification loss. Indices should be in `[0, ..., config.num_labels - 1]`. - """ - return_dict = return_dict if return_dict is not None else self.config.use_return_dict - - outputs = self.longformer( - input_ids, - attention_mask=attention_mask, - global_attention_mask=global_attention_mask, - head_mask=head_mask, - token_type_ids=token_type_ids, - position_ids=position_ids, - inputs_embeds=inputs_embeds, - output_attentions=output_attentions, - output_hidden_states=output_hidden_states, - return_dict=return_dict, - ) - - sequence_output = outputs[0] - - sequence_output = self.dropout(sequence_output) - logits = self.classifier(sequence_output) - - loss = None - if labels is not None: - loss_fct = CrossEntropyLoss() - loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1)) - - if not return_dict: - output = (logits,) + outputs[2:] - return ((loss,) + output) if loss is not None else output - - return LongformerTokenClassifierOutput( - loss=loss, - logits=logits, - hidden_states=outputs.hidden_states, - attentions=outputs.attentions, - global_attentions=outputs.global_attentions, - ) - - -@add_start_docstrings( - """ - Longformer Model with a multiple choice classification head on top (a linear layer on top of the pooled output and - a softmax) e.g. for RocStories/SWAG tasks. - """, - LONGFORMER_START_DOCSTRING, -) -class LongformerForMultipleChoice(LongformerPreTrainedModel): - def __init__(self, config): - super().__init__(config) - - self.longformer = LongformerModel(config) - self.dropout = nn.Dropout(config.hidden_dropout_prob) - self.classifier = nn.Linear(config.hidden_size, 1) - - # Initialize weights and apply final processing - self.post_init() - - @add_start_docstrings_to_model_forward( - LONGFORMER_INPUTS_DOCSTRING.format("batch_size, num_choices, sequence_length") - ) - @add_code_sample_docstrings( - processor_class=_TOKENIZER_FOR_DOC, - checkpoint=_CHECKPOINT_FOR_DOC, - output_type=LongformerMultipleChoiceModelOutput, - config_class=_CONFIG_FOR_DOC, - ) - def forward( - self, - input_ids: Optional[torch.Tensor] = None, - token_type_ids: Optional[torch.Tensor] = None, - attention_mask: Optional[torch.Tensor] = None, - global_attention_mask: Optional[torch.Tensor] = None, - head_mask: Optional[torch.Tensor] = None, - labels: Optional[torch.Tensor] = None, - position_ids: Optional[torch.Tensor] = None, - inputs_embeds: Optional[torch.Tensor] = None, - output_attentions: Optional[bool] = None, - output_hidden_states: Optional[bool] = None, - return_dict: Optional[bool] = None, - ) -> Union[Tuple, LongformerMultipleChoiceModelOutput]: - r""" - labels (`torch.LongTensor` of shape `(batch_size,)`, *optional*): - Labels for computing the multiple choice classification loss. Indices should be in `[0, ..., - num_choices-1]` where `num_choices` is the size of the second dimension of the input tensors. (See - `input_ids` above) - """ - num_choices = input_ids.shape[1] if input_ids is not None else inputs_embeds.shape[1] - return_dict = return_dict if return_dict is not None else self.config.use_return_dict - - # set global attention on question tokens - if global_attention_mask is None and input_ids is not None: - logger.info("Initializing global attention on multiple choice...") - # put global attention on all tokens after `config.sep_token_id` - global_attention_mask = torch.stack( - [ - _compute_global_attention_mask(input_ids[:, i], self.config.sep_token_id, before_sep_token=False) - for i in range(num_choices) - ], - dim=1, - ) - - flat_input_ids = input_ids.view(-1, input_ids.size(-1)) if input_ids is not None else None - flat_position_ids = position_ids.view(-1, position_ids.size(-1)) if position_ids is not None else None - flat_token_type_ids = token_type_ids.view(-1, token_type_ids.size(-1)) if token_type_ids is not None else None - flat_attention_mask = attention_mask.view(-1, attention_mask.size(-1)) if attention_mask is not None else None - flat_global_attention_mask = ( - global_attention_mask.view(-1, global_attention_mask.size(-1)) - if global_attention_mask is not None - else None - ) - flat_inputs_embeds = ( - inputs_embeds.view(-1, inputs_embeds.size(-2), inputs_embeds.size(-1)) - if inputs_embeds is not None - else None - ) - - outputs = self.longformer( - flat_input_ids, - position_ids=flat_position_ids, - token_type_ids=flat_token_type_ids, - attention_mask=flat_attention_mask, - global_attention_mask=flat_global_attention_mask, - head_mask=head_mask, - inputs_embeds=flat_inputs_embeds, - output_attentions=output_attentions, - output_hidden_states=output_hidden_states, - return_dict=return_dict, - ) - pooled_output = outputs[1] - - pooled_output = self.dropout(pooled_output) - logits = self.classifier(pooled_output) - reshaped_logits = logits.view(-1, num_choices) - - loss = None - if labels is not None: - loss_fct = CrossEntropyLoss() - loss = loss_fct(reshaped_logits, labels) - - if not return_dict: - output = (reshaped_logits,) + outputs[2:] - return ((loss,) + output) if loss is not None else output - - return LongformerMultipleChoiceModelOutput( - loss=loss, - logits=reshaped_logits, - hidden_states=outputs.hidden_states, - attentions=outputs.attentions, - global_attentions=outputs.global_attentions, - ) diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/requirements.txt b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/requirements.txt deleted file mode 100644 index 84310f9ea50..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -accelerate -datasets -transformers -torch==2.3.0 -neural-compressor==2.0 diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/run_qa_no_trainer.py b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/run_qa_no_trainer.py deleted file mode 100644 index a0ff5e1e30a..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/run_qa_no_trainer.py +++ /dev/null @@ -1,1305 +0,0 @@ -#!/usr/bin/env python -# coding=utf-8 - -# Apache v2 license -# Copyright (C) 2021 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -# Copyright 2020 The HuggingFace Team All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Fine-tuning the library models for question answering. -""" -# You can also adapt this script on your own question answering task. Pointers for this are left as comments. -""" -This script is based on HuggingFace/transformers example: https://github.com/huggingface/transformers/blob/v4.6.1/examples/pytorch/question-answering/run_qa.py -Changes made to the script: - 1. Added pruning capabilities - 2. Added model distillation capabilities - 3. Added learning rate rewinding option - 4. Added methods to save all hyper-parameters used - 5. Added quantization capabilities -""" - -import logging -import os -import sys -from dataclasses import dataclass, field -from typing import Optional -from collections import defaultdict -from tqdm.auto import tqdm -import math - -import torch -import datasets -from datasets import load_dataset, load_metric - -import transformers -from trainer_qa import QuestionAnsweringTrainer -from transformers import ( - AutoConfig, - AutoModelForQuestionAnswering, - AutoTokenizer, - DataCollatorWithPadding, - EvalPrediction, - HfArgumentParser, - PreTrainedTokenizerFast, - TrainingArguments, - default_data_collator, - set_seed, - get_scheduler, - CONFIG_MAPPING, - MODEL_MAPPING, - SchedulerType -) -from transformers.trainer_utils import get_last_checkpoint, is_main_process -from transformers.utils import check_min_version -from transformers.file_utils import get_full_repo_name - -from utils_qa import postprocess_qa_predictions - -from huggingface_hub import Repository - -from functools import partial -from accelerate import Accelerator -from torch.utils.data import DataLoader -import argparse -from accelerate.logging import get_logger -import numpy as np -import utils_qa -import json -from neural_compressor.training import Pruning, prepare_compression -from neural_compressor.training import WeightPruningConfig - -os.environ["WANDB_DISABLED"] = "true" -os.environ["HTTP_PROXY"] = "" - -# Will error if the minimal version of Transformers is not installed. Remove at your own risks. -check_min_version("4.6.0") - -logger = get_logger(__name__) -# You should update this to your particular problem to have better documentation of `model_type` -MODEL_CONFIG_CLASSES = list(MODEL_MAPPING.keys()) -MODEL_TYPES = tuple(conf.model_type for conf in MODEL_CONFIG_CLASSES) - -# (['loss', 'start_logits', 'end_logits']) -# batch(['attention_mask', 'end_positions', 'input_ids', 'start_positions', 'token_type_ids'] -def get_loss_one_logit(student_logit, teacher_logit): - t = 2.0 - from torch.nn import functional as F - return F.kl_div( - input=F.log_softmax(student_logit / t, dim=-1), - target=F.softmax(teacher_logit / t, dim=-1), - reduction="batchmean" - ) * (t ** 2) - -def save_prefixed_metrics(results, output_dir, file_name: str = "all_results.json", metric_key_prefix: str = "eval"): - """ - Save results while prefixing metric names. - Args: - results: (:obj:`dict`): - A dictionary of results. - output_dir: (:obj:`str`): - An output directory. - file_name: (:obj:`str`, `optional`, defaults to :obj:`all_results.json`): - An output file name. - metric_key_prefix: (:obj:`str`, `optional`, defaults to :obj:`eval`): - A metric name prefix. - """ - # Prefix all keys with metric_key_prefix + '_' - for key in list(results.keys()): - if not key.startswith(f"{metric_key_prefix}_"): - results[f"{metric_key_prefix}_{key}"] = results.pop(key) - - with open(os.path.join(output_dir, file_name), "w") as f: - json.dump(results, f, indent=4) - -def parse_args(): - parser = argparse.ArgumentParser(description="Finetune a transformers model on a Question Answering task") - parser.add_argument( - "--dataset_name", - type=str, - default=None, - help="The name of the dataset to use (via the datasets library).", - ) - parser.add_argument( - "--dataset_config_name", - type=str, - default=None, - help="The configuration name of the dataset to use (via the datasets library).", - ) - parser.add_argument( - "--train_file", - type=str, - default=None, - help="A csv or a json file containing the training data." - ) - parser.add_argument( - "--preprocessing_num_workers", - type=int, default=10, - help="A csv or a json file containing the training data." - ) - - parser.add_argument( - "--do_predict", - action="store_true", - help="To do prediction on the question answering model" - ) - parser.add_argument( - "--validation_file", - type=str, - default=None, - help="A csv or a json file containing the validation data." - ) - parser.add_argument( - "--test_file", - type=str, - default=None, - help="A csv or a json file containing the Prediction data." - ) - parser.add_argument( - "--max_seq_length", - type=int, - default=384, - help=( - "The maximum total input sequence length after tokenization. Sequences longer than this will be truncated," - " sequences shorter will be padded if `--pad_to_max_lengh` is passed." - ), - ) - parser.add_argument( - "--pad_to_max_length", - action="store_true", - help="If passed, pad all samples to `max_seq_length`. Otherwise, dynamic padding is used.", - ) - parser.add_argument( - "--model_name_or_path", - type=str, - help="Path to pretrained model or model identifier from huggingface.co/models." - ) - parser.add_argument( - "--teacher_model_name_or_path", - type=str, - default=None, - help="Path to pretrained model or model identifier from huggingface.co/models.", - required=False - ) - parser.add_argument( - "--config_name", - type=str, - default=None, - help="Pretrained config name or path if not the same as model_name", - ) - parser.add_argument( - "--tokenizer_name", - type=str, - default=None, - help="Pretrained tokenizer name or path if not the same as model_name", - ) - parser.add_argument( - "--use_slow_tokenizer", - action="store_true", - help="If passed, will use a slow tokenizer (not backed by the 🤗 Tokenizers library).", - ) - parser.add_argument( - "--per_device_train_batch_size", - type=int, - default=8, - help="Batch size (per device) for the training dataloader.", - ) - parser.add_argument( - "--distill_loss_weight", - type=float, - default=0.0, - help="distiller loss weight" - ) - parser.add_argument( - "--per_device_eval_batch_size", - type=int, - default=8, - help="Batch size (per device) for the evaluation dataloader.", - ) - parser.add_argument( - "--learning_rate", - type=float, - default=5e-5, - help="Initial learning rate (after the potential warmup period) to use.", - ) - parser.add_argument( - "--weight_decay", - type=float, - default=0.0, - help="Weight decay to use." - ) - parser.add_argument( - "--num_train_epochs", - type=int, - default=3, - help="Total number of training epochs to perform." - ) - parser.add_argument( - "--max_train_steps", - type=int, - default=None, - help="Total number of training steps to perform. If provided, overrides num_train_epochs.", - ) - parser.add_argument( - "--gradient_accumulation_steps", - type=int, - default=1, - help="Number of updates steps to accumulate before performing a backward/update pass.", - ) - parser.add_argument( - "--lr_scheduler_type", - type=SchedulerType, - default="linear", - help="The scheduler type to use.", - choices=["linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup"], - ) - - parser.add_argument( - "--warm_epochs", - type=int, - default=0, - help="Number of epochs the network not be purned" - ) - parser.add_argument( - "--num_warmup_steps", - type=int, - default=0, - help="Number of steps for the warmup in the lr scheduler." - ) - parser.add_argument( - "--output_dir", - type=str, - default=None, - help="Where to store the final model." - ) - parser.add_argument( - "--seed", - type=int, - default=None, - help="A seed for reproducible training." - ) - parser.add_argument( - "--doc_stride", - type=int, - default=128, - help="When splitting up a long document into chunks how much stride to take between chunks.", - ) - parser.add_argument( - "--n_best_size", - type=int, - default=20, - help="The total number of n-best predictions to generate when looking for an answer.", - ) - parser.add_argument( - "--null_score_diff_threshold", - type=float, - default=0.0, - help=( - "The threshold used to select the null answer: if the best answer has a score that is less than " - "the score of the null answer minus this threshold, the null answer is selected for this example. " - "Only useful when `version_2_with_negative=True`." - ), - ) - parser.add_argument( - "--version_2_with_negative", - action="store_true", - help="If true, some of the examples do not have an answer.", - ) - parser.add_argument( - "--max_answer_length", - type=int, - default=30, - help=( - "The maximum length of an answer that can be generated. This is needed because the start " - "and end predictions are not conditioned on one another." - ), - ) - parser.add_argument( - "--max_train_samples", - type=int, - default=None, - help=( - "For debugging purposes or quicker training, truncate the number of training examples to this " - "value if set." - ), - ) - parser.add_argument( - "--max_eval_samples", - type=int, - default=None, - help=( - "For debugging purposes or quicker training, truncate the number of evaluation examples to this " - "value if set." - ), - ) - parser.add_argument( - "--overwrite_cache", type=bool, default=False, help="Overwrite the cached training and evaluation sets" - ) - parser.add_argument( - "--max_predict_samples", - type=int, - default=None, - help="For debugging purposes or quicker training, truncate the number of prediction examples to this", - ) - parser.add_argument( - "--model_type", - type=str, - default=None, - help="Model type to use if training from scratch.", - choices=MODEL_TYPES, - ) - parser.add_argument( - "--cooldown_epochs", - type=int, default=0, - help="Cooling epochs after pruning." - ) - parser.add_argument( - "--do_prune", action="store_true", - help="Whether or not to prune the model" - ) - parser.add_argument( - "--pruning_scope", - type=str, default="global", - help="pruning scope, we support global and local." - ) - parser.add_argument( - "--pruning_pattern", - type=str, default="4x1", - help="pruning pattern type, we support NxM and N:M." - ) - parser.add_argument( - "--target_sparsity", - type=float, default=0.8, - help="Target sparsity of the model." - ) - parser.add_argument( - "--pruning_frequency", - type=int, default=-1, - help="Sparse step frequency for iterative pruning, default to a quarter of pruning steps." - ) - - parser.add_argument( - "--keep_conf", action="store_true", - help="Whether or not to keep the prune config infos" - ) - parser.add_argument( - "--pruning_config", - type=str, - help="pruning_config" - ) - - parser.add_argument( - "--push_to_hub", - action="store_true", - help="Whether or not to push the model to the Hub." - ) - parser.add_argument( - "--hub_model_id", - type=str, - help="The name of the repository to keep in sync with the local `output_dir`." - ) - parser.add_argument( - "--hub_token", - type=str, - help="The token to use to push to the Model Hub." - ) - parser.add_argument( - "--checkpointing_steps", - type=str, - default=None, - help="Whether the various states should be saved at the end of every n steps, or 'epoch' for each epoch.", - ) - parser.add_argument( - "--resume_from_checkpoint", - type=str, - default=None, - help="If the training should continue from a checkpoint folder.", - ) - - parser.add_argument( - "--with_tracking", - action="store_true", - help="Whether to enable experiment trackers for logging.", - ) - parser.add_argument( - "--report_to", - type=str, - default="all", - help=( - 'The integration to report the results and logs to. Supported platforms are `"tensorboard"`,' - ' `"wandb"` and `"comet_ml"`. Use `"all"` (default) to report to all integrations.' - "Only applicable when `--with_tracking` is passed." - ), - ) - - parser.add_argument( - "--cache_dir", - type=str, - default=None, - help="Path to directory to store the pretrained models downloaded from huggingface.co", - ) - - parser.add_argument( - "--model_revision", - type=str, - default="main", - help="The specific model version to use (can be a branch name, tag name or commit id).", - ) - - parser.add_argument( - "--use_auth_token", - type=bool, - default=False, - help="Will use the token generated when running `transformers-cli login` (necessary to use this script with private models).", - ) - - parser.add_argument( - "--do_train", - action="store_true", - help="Whether to run training.", - ) - - parser.add_argument( - "--do_eval", - action="store_true", - help="Whether to run eval on the dev set.", - ) - - args = parser.parse_args() - - # Sanity checks - if ( - args.dataset_name is None - and args.train_file is None - and args.validation_file is None - and args.test_file is None - ): - raise ValueError("Need either a dataset name or a training/validation/test file.") - else: - if args.train_file is not None: - extension = args.train_file.split(".")[-1] - assert extension in ["csv", "json"], "`train_file` should be a csv or a json file." - if args.validation_file is not None: - extension = args.validation_file.split(".")[-1] - assert extension in ["csv", "json"], "`validation_file` should be a csv or a json file." - if args.test_file is not None: - extension = args.test_file.split(".")[-1] - assert extension in ["csv", "json"], "`test_file` should be a csv or a json file." - - if args.push_to_hub: - assert args.output_dir is not None, "Need an `output_dir` to create a repo when `--push_to_hub` is passed." - - return args - -def main(): - - args = parse_args() - - # Sending telemetry. Tracking the example usage helps us better allocate resources to maintain them. The - # information sent is the one passed as arguments along with your Python/PyTorch versions. - # send_example_telemetry("run_qa_no_trainer", args) - - # Initialize the accelerator. We will let the accelerator handle device placement for us in this example. - # If we're using tracking, we also need to initialize it here and it will by default pick up all supported trackers - # in the environment - - accelerator = ( - Accelerator(log_with=args.report_to, logging_dir=args.output_dir) if args.with_tracking else Accelerator() - ) - - ''' - accelerator_log_kwargs = {} - if args.with_tracking: - accelerator_log_kwargs["log_with"] = args.report_to - accelerator_log_kwargs["logging_dir"] = args.output_dir - accelerator = Accelerator(gradient_accumulation_steps=args.gradient_accumulation_steps, **accelerator_log_kwargs) - ''' - # Make one log on every process with the configuration for debugging. - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%m/%d/%Y %H:%M:%S", - level=logging.INFO, - ) - logger.info(accelerator.state, main_process_only=False) - if accelerator.is_local_main_process: - datasets.utils.logging.set_verbosity_warning() - transformers.utils.logging.set_verbosity_info() - else: - datasets.utils.logging.set_verbosity_error() - transformers.utils.logging.set_verbosity_error() - - # If passed along, set the training seed now. - if args.seed is not None: - set_seed(args.seed) - - # Handle the repository creation - if accelerator.is_main_process: - if args.push_to_hub: - if args.hub_model_id is None: - repo_name = get_full_repo_name(Path(args.output_dir).name, token=args.hub_token) - else: - repo_name = args.hub_model_id - repo = Repository(args.output_dir, clone_from=repo_name) - - with open(os.path.join(args.output_dir, ".gitignore"), "w+") as gitignore: - if "step_*" not in gitignore: - gitignore.write("step_*\n") - if "epoch_*" not in gitignore: - gitignore.write("epoch_*\n") - elif args.output_dir is not None: - os.makedirs(args.output_dir, exist_ok=True) - accelerator.wait_for_everyone() - - script_path = os.path.split(os.path.abspath(__file__))[0] - - # Get the datasets: you can either provide your own CSV/JSON/TXT training and evaluation files (see below) - # or just provide the name of one of the public datasets available on the hub at https://huggingface.co/datasets/ - # (the dataset will be downloaded automatically from the datasets Hub). - # - # For CSV/JSON files, this script will use the column called 'text' or the first column if no column called - # 'text' is found. You can easily tweak this behavior (see below). - # - # In distributed training, the load_dataset function guarantee that only one local process can concurrently - # download the dataset. - if args.dataset_name is not None: - # Downloading and loading a dataset from the hub. - raw_datasets = load_dataset(args.dataset_name, args.dataset_config_name, cache_dir=args.cache_dir) - else: - data_files = {} - if args.train_file is not None: - data_files["train"] = args.train_file - extension = args.train_file.split(".")[-1] - - if args.validation_file is not None: - data_files["dev"] = args.validation_file - extension = args.validation_file.split(".")[-1] - if args.test_file is not None: - data_files["test"] = args.test_file - extension = args.test_file.split(".")[-1] - # datasets = load_dataset(extension, data_files=data_files, field="data", cache_dir=model_args.cache_dir) - raw_datasets = load_dataset(os.path.join(script_path, "squad.py"), data_files=data_files, cache_dir=args.cache_dir) - - # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at - # https://huggingface.co/docs/datasets/loading_datasets.html. - - # Load pretrained model and tokenizer - # - # Distributed training: - # The .from_pretrained methods guarantee that only one local process can concurrently - # download model & vocab. - config = AutoConfig.from_pretrained( - args.config_name if args.config_name else args.model_name_or_path, - cache_dir=args.cache_dir, - revision=args.model_revision, - use_auth_token=True if args.use_auth_token else None, - ) - tokenizer = AutoTokenizer.from_pretrained( - args.tokenizer_name if args.tokenizer_name else args.model_name_or_path, - cache_dir=args.cache_dir, - use_fast=True, - revision=args.model_revision, - use_auth_token=True if args.use_auth_token else None, - ) - - # local py module - from modeling_longformer import LongformerForQuestionAnswering - model_class = LongformerForQuestionAnswering - - if args.distill_loss_weight > 0: - teacher_path = args.teacher_model_name_or_path - if teacher_path is None: - teacher_path = args.model_name_or_path - teacher_model = model_class.from_pretrained( - teacher_path, - from_tf=bool(".ckpt" in args.model_name_or_path), - config=config, - ) - - if args.model_name_or_path: - model = model_class.from_pretrained( - args.model_name_or_path, - from_tf=bool(".ckpt" in args.model_name_or_path), - config=config, - cache_dir=args.cache_dir, - revision=args.model_revision, - use_auth_token=True if args.use_auth_token else None, - ) - else: - logger.info("Training new model from scratch") - model = model_class.from_config(config) - - # Preprocessing the datasets. - # Preprocessing is slightly different for training and evaluation. - if args.do_train: - column_names = raw_datasets["train"].column_names - elif args.do_eval: - column_names = raw_datasets["validation"].column_names - else: - column_names = raw_datasets["test"].column_names - question_column_name = "question" if "question" in column_names else column_names[0] - context_column_name = "context" if "context" in column_names else column_names[1] - answer_column_name = "answers" if "answers" in column_names else column_names[2] - - # Padding side determines if we do (question|context) or (context|question). - # pad_on_right = tokenizer.padding_side == "right" - # max_seq_length = min(data_args.max_seq_length, tokenizer.model_max_length) - max_seq_length = args.max_seq_length - - # preprocess context and answers - def preprocess_context(examples): - new_examples = {} - - def is_whitespace(c): - if c == " " or c == "\t" or c == "\r" or c == "\n" or ord(c) == 0x202F: - return True - return False - - def pre_tokenize(p): - doc_tokens = [] - char_to_word_offset = [] - prev_is_whitespace = True - for c in p: - if is_whitespace(c): - prev_is_whitespace = True - else: - if prev_is_whitespace: - doc_tokens.append(c) - else: - doc_tokens[-1] += c - prev_is_whitespace = False - char_to_word_offset.append(len(doc_tokens) - 1) - - return ' '.join(doc_tokens), char_to_word_offset - - new_examples[context_column_name] = [] - new_examples["answer_spans"] = [] - for i, p in enumerate(examples[context_column_name]): - tokenized_p, char_to_word_offset = pre_tokenize(p) - new_examples[context_column_name].append(tokenized_p) - - answer_spans = [] - for orig_answer_text, answer_offset in zip(examples[answer_column_name][i]['text'], examples[answer_column_name][i]['answer_start']): - answer_length = len(orig_answer_text) - try: - start_position = char_to_word_offset[answer_offset] - end_position = char_to_word_offset[answer_offset + answer_length - 1] - token_ids = tokenizer.encode(orig_answer_text) - except RuntimeError: - logger.info(f'Reading example {idx} failed') - start_position = 0 - end_position = 0 - answer_spans.append({'start': start_position, 'end': end_position, - 'text': orig_answer_text, 'token_ids': token_ids}) - new_examples["answer_spans"].append(answer_spans) - - for key in examples: - if key != context_column_name: - new_examples[key] = examples[key] - return new_examples - - # preprocessing - def prepare_features(examples, max_question_len=55, max_doc_len=4096, max_num_answers=64, ignore_seq_with_no_answers=False, mode="eval"): - - tokenized_examples = {} - tokenized_examples["input_ids"] = [] - tokenized_examples["attention_mask"] = [] - if mode == "train": - tokenized_examples["start_positions"] = [] - tokenized_examples["end_positions"] = [] - elif mode == "eval": - tokenized_examples["example_id"] = [] - else: - raise NotImplementedError("not implemented yet.") - - # not use for roberta - #tokenized_examples["token_type_ids"] = [] - - # Some of the questions have lots of whitespace on the left, which is not useful and will make the - # truncation of the context fail (the tokenized question will take a lots of space). So we remove that - # left whitespace - examples[question_column_name] = [q.lstrip() for q in examples[question_column_name]] - - for example_index in range(len(examples[question_column_name])): - question_text = examples[question_column_name][example_index] - query_tokens = tokenizer.tokenize(question_text) - query_tokens = query_tokens[:max_question_len] - doc_tokens = examples[context_column_name][example_index].split(" ") - answer_spans = examples["answer_spans"][example_index] - tok_to_orig_index = [] - orig_to_tok_index = [] - all_doc_tokens = [] - for (i, token) in enumerate(doc_tokens): - orig_to_tok_index.append(len(all_doc_tokens)) - sub_tokens = tokenizer.tokenize(f'. {token}')[1:] if i > 0 else tokenizer.tokenize(token) - for sub_token in sub_tokens: - tok_to_orig_index.append(i) - all_doc_tokens.append(sub_token) - all_doc_tokens = all_doc_tokens[:max_doc_len] - # The -3 accounts for , and - max_tokens_per_doc_slice = max_seq_length - len(query_tokens) - 3 - assert max_tokens_per_doc_slice > 0 - - if args.doc_stride < 0: - # negative doc_stride indicates no sliding window, but using first slice - args.doc_stride = -100 * len(all_doc_tokens) # large -ve value for the next loop to execute once - - input_ids_list = [] - input_mask_list = [] - segment_ids_list = [] - start_positions_list = [] - end_positions_list = [] - answer_token_ids_list = [] - - for slice_start in range(0, len(all_doc_tokens), max_tokens_per_doc_slice - args.doc_stride): - slice_end = min(slice_start + max_tokens_per_doc_slice, len(all_doc_tokens)) - doc_slice_tokens = all_doc_tokens[slice_start:slice_end] - tokens = [tokenizer.cls_token] + query_tokens + [tokenizer.sep_token] \ - + doc_slice_tokens + [tokenizer.sep_token] - - # but don't use for roberta - segment_ids = [0] * (len(query_tokens) + 2) + [1] * (len(doc_slice_tokens) + 1) - assert len(segment_ids) == len(tokens) - - input_ids = tokenizer.convert_tokens_to_ids(tokens) - input_mask = [1] * len(input_ids) - - #if data_args.pad_to_max_length: # no need to pad if document is not strided - if False: - # Zero-pad up to the sequence length. - padding_len = max_seq_length - len(input_ids) - input_ids.extend([tokenizer.pad_token_id] * padding_len) - input_mask.extend([0] * padding_len) - segment_ids.extend([0] * padding_len) - - assert len(input_ids) == max_seq_length - assert len(input_mask) == max_seq_length - assert len(segment_ids) == max_seq_length - - doc_offset = len(query_tokens) + 2 - slice_start - - start_positions = [] - end_positions = [] - answer_token_ids = [] - for answer_span in answer_spans: - start_position = answer_span['start'] - end_position = answer_span['end'] - tok_start_position_in_doc = orig_to_tok_index[start_position] - not_end_of_doc = int(end_position + 1 < len(orig_to_tok_index)) - tok_end_position_in_doc = orig_to_tok_index[end_position + not_end_of_doc] - not_end_of_doc - if tok_start_position_in_doc < slice_start or tok_end_position_in_doc > slice_end: - # this answer is outside the current slice - continue - - start_positions.append(tok_start_position_in_doc + doc_offset) - end_positions.append(tok_end_position_in_doc + doc_offset) - answer_token_ids.append(answer_span['token_ids']) - - assert len(start_positions) == len(end_positions) - if ignore_seq_with_no_answers and len(start_positions) == 0: - continue - - # answers from start_positions and end_positions if > self.max_num_answers - start_positions = start_positions[:max_num_answers] - end_positions = end_positions[:max_num_answers] - answer_token_ids = answer_token_ids[:max_num_answers] - - # -1 padding up to self.max_num_answers - # -1 means empty answer in last token, while normal squad in [CLS] token - padding_len = max_num_answers - len(start_positions) - start_positions.extend([-1] * padding_len) - end_positions.extend([-1] * padding_len) - answer_token_ids.extend([[]] * padding_len) - - # replace duplicate start/end positions with `-1` because duplicates can result into -ve loss values - found_start_positions = set() - found_end_positions = set() - found_answer_token_ids = set() - for i, (start_position, end_position, answer_tokens) in enumerate( - zip(start_positions, end_positions, answer_token_ids) - ): - if start_position in found_start_positions: - start_positions[i] = -1 - if end_position in found_end_positions: - end_positions[i] = -1 - answer_tokens_as_str = ','.join([str(x) for x in answer_tokens]) - if answer_tokens_as_str in found_answer_token_ids: - answer_token_ids[i] = [] - - found_start_positions.add(start_position) - found_end_positions.add(end_position) - found_answer_token_ids.add(answer_tokens_as_str) - - input_ids_list.append(input_ids) - input_mask_list.append(input_mask) - segment_ids_list.append(segment_ids) - start_positions_list.append(start_positions) - end_positions_list.append(end_positions) - answer_token_ids_list.append(answer_token_ids) - - # pad answers in answer_token_ids_list to the longest answer - max_answer_len = max([len(item) for sublist in answer_token_ids_list for item in sublist]) # flat list - if max_answer_len == 0: - max_answer_len = 2 - for answers_of_one_slice in answer_token_ids_list: - for answer_tokens in answers_of_one_slice: - if len(answer_tokens) == 0: - # TODO: or ? - padding_len = max_answer_len - len(answer_tokens) - 2 - answer_tokens.extend([tokenizer.bos_token_id, tokenizer.eos_token_id] + - ([tokenizer.pad_token_id] * padding_len)) - else: - padding_len = max_answer_len - len(answer_tokens) - answer_tokens.extend([tokenizer.pad_token_id] * padding_len) - - - tokenized_examples["input_ids"].extend(input_ids_list) - tokenized_examples["attention_mask"].extend(input_mask_list) - - if mode == "train": - # only one answer used for training - #tokenized_examples["start_positions"].extend([each[0] for each in start_positions_list]) - #tokenized_examples["end_positions"].extend([each[0] for each in end_positions_list]) - tokenized_examples["start_positions"].append(start_positions_list[0]) - tokenized_examples["end_positions"].append(end_positions_list[0]) - elif mode == "eval": - tokenized_examples["example_id"].append(examples["id"][example_index]) - - return tokenized_examples - - prepare_train_features = partial(prepare_features, mode="train") - if args.do_train: - if "train" not in raw_datasets: - raise ValueError("--do_train requires a train dataset") - train_dataset = raw_datasets["train"] - if args.max_train_samples is not None: - # We will select sample from whole data if augment is specified - train_dataset = train_dataset.select(range(args.max_train_samples)) - with accelerator.main_process_first(): - # preprocess - train_dataset = train_dataset.map( - preprocess_context, - batched=True, - num_proc=args.preprocessing_num_workers, - remove_columns=column_names, - load_from_cache_file=not args.overwrite_cache, - ) - - # Create train feature from dataset - train_dataset = train_dataset.map( - prepare_train_features, - batched=True, - num_proc=args.preprocessing_num_workers, - remove_columns=column_names + ["answer_spans"], - load_from_cache_file=not args.overwrite_cache, - ) - if args.max_train_samples is not None: - # Number of samples might increase during Feature Creation, We select only specified max samples - train_dataset = train_dataset.select(range(args.max_train_samples)) - - prepare_validation_features = partial(prepare_features, mode="eval") - - if args.do_eval: - if "validation" not in raw_datasets: - raise ValueError("--do_eval requires a validation dataset") - eval_examples = raw_datasets["validation"] - if args.max_eval_samples is not None: - # We will select sample from whole data - eval_examples = eval_examples.select(range(args.max_eval_samples)) - with accelerator.main_process_first(): - # preprocess - eval_examples = eval_examples.map( - preprocess_context, - batched=True, - num_proc=args.preprocessing_num_workers, - remove_columns=column_names, - load_from_cache_file=not args.overwrite_cache, - ) - # Validation Feature Creation - eval_dataset = eval_examples.map( - prepare_validation_features, - batched=True, - num_proc=args.preprocessing_num_workers, - remove_columns=column_names, - load_from_cache_file=not args.overwrite_cache, - ) - - if args.max_eval_samples is not None: - # During Feature creation dataset samples might increase, we will select required samples again - eval_dataset = eval_dataset.select(range(args.max_eval_samples)) - - - # DataLoaders creation: - if args.pad_to_max_length: - # If padding was already done ot max length, we use the default data collator that will just convert everything - # to tensors. - data_collator = default_data_collator - else: - # Otherwise, `DataCollatorWithPadding` will apply dynamic padding for us (by padding to the maximum length of - # the samples passed). When using mixed precision, we add `pad_to_multiple_of=8` to pad all tensors to multiple - # of 8s, which will enable the use of Tensor Cores on NVIDIA hardware with compute capability >= 7.5 (Volta). - data_collator = DataCollatorWithPadding(tokenizer, pad_to_multiple_of=(8 if accelerator.use_fp16 else None)) - - train_dataloader = DataLoader( - train_dataset, shuffle=True, collate_fn=data_collator, batch_size=args.per_device_train_batch_size - ) - - eval_dataset_for_model = eval_dataset.remove_columns(["example_id", "answer_spans"]) - eval_dataloader = DataLoader( - eval_dataset_for_model, collate_fn=data_collator, batch_size=args.per_device_eval_batch_size - ) - - # Post-processing: - def post_processing_function(examples, features, predictions, stage="eval"): - # Post-processing: we match the start logits and end logits to answers in the original context. - predictions = postprocess_qa_predictions( - examples=examples, - features=features, - predictions=predictions, - tokenizer=tokenizer, - version_2_with_negative=args.version_2_with_negative, - n_best_size=args.n_best_size, - max_answer_length=args.max_answer_length, - null_score_diff_threshold=args.null_score_diff_threshold, - output_dir=args.output_dir, - prefix=stage, - ) - # Format the result to the format the metric expects. - if args.version_2_with_negative: - formatted_predictions = [ - {"id": k, "prediction_text": v, "no_answer_probability": 0.0} for k, v in predictions.items() - ] - else: - formatted_predictions = [{"id": k, "prediction_text": v} for k, v in predictions.items()] - - references = [{"id": ex["id"], "answers": ex[answer_column_name], "aliases": ex["aliases"]} for ex in examples] - - return EvalPrediction(predictions=predictions, label_ids=references) - - # Create and fill numpy array of size len_of_validation_data * max_length_of_output_tensor - def create_and_fill_np_array(start_or_end_logits, dataset, max_len): - """ - Create and fill numpy array of size len_of_validation_data * max_length_of_output_tensor - Args: - start_or_end_logits(:obj:`tensor`): - This is the output predictions of the model. We can only enter either start or end logits. - eval_dataset: Evaluation dataset - max_len(:obj:`int`): - The maximum length of the output tensor. ( See the model.eval() part for more details ) - """ - - step = 0 - # create a numpy array and fill it with -100. - logits_concat = np.full((len(dataset), max_len), -100, dtype=np.float64) - # Now since we have create an array now we will populate it with the outputs gathered using accelerator.gather - for i, output_logit in enumerate(start_or_end_logits): # populate columns - # We have to fill it such that we have to take the whole tensor and replace it on the newly created array - # And after every iteration we have to change the step - - batch_size = output_logit.shape[0] - cols = output_logit.shape[1] - - if step + batch_size < len(dataset): - logits_concat[step: step + batch_size, :cols] = output_logit - else: - logits_concat[step:, :cols] = output_logit[: len(dataset) - step] - - step += batch_size - - return logits_concat - - # Optimizer - # Split weights in two groups, one with weight decay and the other not. - no_decay = ["bias", "LayerNorm.weight"] - no_decay_outputs = ["bias", "LayerNorm.weight", "qa_outputs"] - optimizer_grouped_parameters = [ - { - "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], - "weight_decay": args.weight_decay, - }, - { - "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], - "weight_decay": 0.0, - }, - ] - if args.do_prune: - optimizer = torch.optim.AdamW(optimizer_grouped_parameters, lr=args.learning_rate, betas=[0.9, 0.9]) - else: - optimizer = torch.optim.AdamW(optimizer_grouped_parameters, lr=args.learning_rate) - - # Scheduler and math around the number of training steps. - overrode_max_train_steps = False - num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps) - if args.max_train_steps is None: - args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch - overrode_max_train_steps = True - - lr_scheduler = get_scheduler( - name=args.lr_scheduler_type, - optimizer=optimizer, - num_warmup_steps=args.num_warmup_steps, - num_training_steps=args.max_train_steps, - ) - - if args.distill_loss_weight > 0: - teacher_model, model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( - teacher_model, model, optimizer, train_dataloader, eval_dataloader, lr_scheduler - ) - teacher_model.eval() - else: - # Prepare everything with our `accelerator`. - model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( - model, optimizer, train_dataloader, eval_dataloader, lr_scheduler - ) - # We need to recalculate our total training steps as the size of the training dataloader may have changed. - num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps) - if overrode_max_train_steps: - args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch - # Afterwards we recalculate our number of training epochs - args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch) - - # Figure out how many steps we should save the Accelerator states - if hasattr(args.checkpointing_steps, "isdigit"): - checkpointing_steps = args.checkpointing_steps - if args.checkpointing_steps.isdigit(): - checkpointing_steps = int(args.checkpointing_steps) - else: - checkpointing_steps = None - - # We need to initialize the trackers we use, and also store our configuration. - # We initialize the trackers only on main process because `accelerator.log` - # only logs on main process and we don't want empty logs/runs on other processes. - if args.with_tracking: - if accelerator.is_main_process: - experiment_config = vars(args) - # TensorBoard cannot log Enums, need the raw value - experiment_config["lr_scheduler_type"] = experiment_config["lr_scheduler_type"].value - accelerator.init_trackers("qa_no_trainer", experiment_config) - - # Train! - total_batch_size = args.per_device_train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps - - logger.info("***** Running training *****") - logger.info(f" Num examples = {len(train_dataset)}") - logger.info(f" Num Epochs = {args.num_train_epochs}") - logger.info(f" Instantaneous batch size per device = {args.per_device_train_batch_size}") - logger.info(f" Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}") - logger.info(f" Gradient Accumulation steps = {args.gradient_accumulation_steps}") - logger.info(f" Total optimization steps = {args.max_train_steps}") - - # Only show the progress bar once on each machine. - progress_bar = tqdm(range(args.max_train_steps), disable=not accelerator.is_local_main_process) - completed_steps = 0 - starting_epoch = 0 - - # Potentially load in the weights and states from a previous save - if args.resume_from_checkpoint: - if args.resume_from_checkpoint is not None or args.resume_from_checkpoint != "": - accelerator.print(f"Resumed from checkpoint: {args.resume_from_checkpoint}") - accelerator.load_state(args.resume_from_checkpoint) - path = os.path.basename(args.resume_from_checkpoint) - else: - # Get the most recent checkpoint - dirs = [f.name for f in os.scandir(os.getcwd()) if f.is_dir()] - dirs.sort(key=os.path.getctime) - path = dirs[-1] # Sorts folders by date modified, most recent checkpoint is the last - # Extract `epoch_{i}` or `step_{i}` - training_difference = os.path.splitext(path)[0] - - if "epoch" in training_difference: - starting_epoch = int(training_difference.replace("epoch_", "")) + 1 - resume_step = None - else: - resume_step = int(training_difference.replace("step_", "")) - starting_epoch = resume_step // len(train_dataloader) - resume_step -= starting_epoch * len(train_dataloader) - - # Pruning preparation - num_iterations = len(train_dataset) / total_batch_size - num_warm = int(args.warm_epochs * num_iterations) + args.num_warmup_steps - total_iterations = int(num_iterations * (args.num_train_epochs - args.cooldown_epochs)) - frequency = int((total_iterations - num_warm + 1) / 40) if args.pruning_frequency == -1 \ - else args.pruning_frequency - - pruning_start = num_warm - pruning_end = total_iterations - if not args.do_prune: - pruning_start = num_iterations * args.num_train_epochs + 1 - pruning_end = pruning_start - - pruning_configs=[ - { - "pruning_type": "snip_momentum", - "pruning_scope": "global", - "sparsity_decay_type": "exp", - "excluded_op_names": ["qa_outputs", "pooler", ".*embeddings*"], - "pruning_op_types": ["Linear"], - "max_sparsity_ratio_per_op": 0.98 - } - ] - - configs = WeightPruningConfig( - pruning_configs, - pruning_scope=args.pruning_scope, - target_sparsity=args.target_sparsity, - pattern=args.pruning_pattern, - pruning_frequency=frequency, - start_step=pruning_start, - end_step=pruning_end - ) - - compression_manager = prepare_compression(model=model, confs=configs) - compression_manager.callbacks.on_train_begin() - model = compression_manager.model - - - for epoch in range(starting_epoch, args.num_train_epochs): - model.train() - if epoch >= args.warm_epochs: - if args.with_tracking: - total_loss = 0 - for step, batch in enumerate(train_dataloader): - compression_manager.callbacks.on_step_begin(step) - - outputs = model(**batch) - loss = outputs.loss - # We keep track of the loss at each epoch - if args.with_tracking: - total_loss += loss.detach().float() - if args.distill_loss_weight > 0: - distill_loss_weight = args.distill_loss_weight - with torch.no_grad(): - teacher_outputs = teacher_model(**batch) - loss = (distill_loss_weight) / 2 * get_loss_one_logit(outputs['start_logits'], - teacher_outputs['start_logits']) \ - + (distill_loss_weight) / 2 * get_loss_one_logit(outputs['end_logits'], - teacher_outputs['end_logits']) - loss = loss / args.gradient_accumulation_steps - accelerator.backward(loss) - - if step % args.gradient_accumulation_steps == 0 or step == len(train_dataloader) - 1: - compression_manager.callbacks.on_before_optimizer_step() - optimizer.step() - compression_manager.callbacks.on_after_optimizer_step() - lr_scheduler.step() - optimizer.zero_grad() - progress_bar.update(1) - completed_steps += 1 - - - if isinstance(checkpointing_steps, int): - if completed_steps % checkpointing_steps == 0: - output_dir = f"step_{completed_steps}" - if args.output_dir is not None: - output_dir = os.path.join(args.output_dir, output_dir) - accelerator.save_state(output_dir) - - if completed_steps >= args.max_train_steps: - break - else: - for step, batch in enumerate(train_dataloader): - outputs = model(**batch) - loss = outputs.loss - loss = loss / args.gradient_accumulation_steps - accelerator.backward(loss) - if step % args.gradient_accumulation_steps == 0 or step == len(train_dataloader) - 1: - optimizer.step() - lr_scheduler.step() - optimizer.zero_grad() - progress_bar.update(1) - completed_steps += 1 - - if completed_steps >= args.max_train_steps: - break - - if args.checkpointing_steps == "epoch": - output_dir = f"epoch_{epoch}" - if args.output_dir is not None: - output_dir = os.path.join(args.output_dir, output_dir) - accelerator.save_state(output_dir) - - if args.push_to_hub and epoch < args.num_train_epochs - 1: - accelerator.wait_for_everyone() - unwrapped_model = accelerator.unwrap_model(model) - unwrapped_model.save_pretrained( - args.output_dir, is_main_process=accelerator.is_main_process, save_function=accelerator.save - ) - if accelerator.is_main_process: - tokenizer.save_pretrained(args.output_dir) - repo.push_to_hub( - commit_message=f"Training in progress epoch {epoch}", blocking=False, auto_lfs_prune=True - ) - - # eval each epoch - logger.info(f"***** Running Evaluation*****") - all_start_logits = [] - all_end_logits = [] - - # pruner.on_before_eval() - model.eval() - for step, batch in enumerate(eval_dataloader): - with torch.no_grad(): - outputs = model(**batch) - start_logits = outputs.start_logits - end_logits = outputs.end_logits - - if not args.pad_to_max_length: # necessary to pad predictions and labels for being gathered - start_logits = accelerator.pad_across_processes(start_logits, dim=1, pad_index=-100) - end_logits = accelerator.pad_across_processes(end_logits, dim=1, pad_index=-100) - - all_start_logits.append(accelerator.gather(start_logits).cpu().numpy()) - all_end_logits.append(accelerator.gather(end_logits).cpu().numpy()) - - max_len = max([x.shape[1] for x in all_start_logits]) # Get the max_length of the tensor - # pruner.on_after_eval() - - # concatenate the numpy array - start_logits_concat = create_and_fill_np_array(all_start_logits, eval_dataset, max_len) - end_logits_concat = create_and_fill_np_array(all_end_logits, eval_dataset, max_len) - - # delete the list of numpy arrays - del all_start_logits - del all_end_logits - - outputs_numpy = (start_logits_concat, end_logits_concat) - eval_preds = post_processing_function(eval_examples, eval_dataset, outputs_numpy) - - metrics = utils_qa.evaluate_triviaqa(eval_preds.label_ids, eval_preds.predictions) - logger.info(metrics) - - - if args.output_dir is not None: - accelerator.wait_for_everyone() - unwrapped_model = accelerator.unwrap_model(model.model) - unwrapped_model.save_pretrained( - args.output_dir + f"eph{args.num_train_epochs}_lr{args.learning_rate}_bs{total_batch_size}", - is_main_process=accelerator.is_main_process, save_function=accelerator.save - ) - if accelerator.is_main_process: - tokenizer.save_pretrained(args.output_dir) - if args.push_to_hub: - repo.push_to_hub(commit_message="End of training", auto_lfs_prune=True) - - logger.info(json.dumps(metrics, indent=4)) - save_prefixed_metrics(metrics, args.output_dir) - - -def _mp_fn(index): - # For xla_spawn (TPUs) - main() - - -if __name__ == "__main__": - main() diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/download_data_and_convert.sh b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/download_data_and_convert.sh deleted file mode 100644 index f0d7d0f3fa4..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/download_data_and_convert.sh +++ /dev/null @@ -1,19 +0,0 @@ -# from http://nlp.cs.washington.edu/triviaqa/ and https://github.com/mandarjoshi90/triviaqa -wget http://nlp.cs.washington.edu/triviaqa/data/triviaqa-rc.tar.gz - -tar -xvzf triviaqa-rc.tar.gz - -# the blow codes from the original paper code: https://github.com/allenai/longformer -python -m utils.convert_to_squad_format \ - --triviaqa_file ./qa/wikipedia-train.json \ - --wikipedia_dir ./evidence/wikipedia/ \ - --web_dir ./evidence/web/ \ - --max_num_tokens 4096 \ - --squad_file squad-wikipedia-train-4096.json - -python utils.convert_to_squad_format \ - --triviaqa_file ./qa/wikipedia-dev.json \ - --wikipedia_dir ./evidence/wikipedia/ \ - --web_dir ./evidence/web/ \ - --max_num_tokens 4096 \ - --squad_file squad-wikipedia-dev-4096.json diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/longformer_base_dense_fintune.sh b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/longformer_base_dense_fintune.sh deleted file mode 100644 index ce21e329c16..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/longformer_base_dense_fintune.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -set -x - -train_file=./squad-wikipedia-train-4096.json -validation_file=./squad-wikipedia-dev-4096.json -pretrained_model=allenai/longformer-base-4096 - -accelerate launch --main_process_port 29245 run_qa_no_trainer.py \ - --model_name_or_path $pretrained_model \ - --do_train \ - --do_eval \ - --train_file $train_file \ - --validation_file $validation_file \ - --cache_dir ./tmp_cached \ - --max_seq_length 4096 \ - --doc_stride -1 \ - --per_device_train_batch_size 1 \ - --gradient_accumulation_steps 16 \ - --per_device_eval_batch_size 1 \ - --num_warmup_steps 1000 \ - --learning_rate 3.5e-5 \ - --num_train_epochs 4 \ - --output_dir longformer-base-4096-dense-baseline diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/longformer_base_sparse_global_4x1_pruning.sh b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/longformer_base_sparse_global_4x1_pruning.sh deleted file mode 100644 index 3c08207aa62..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/scripts/longformer_base_sparse_global_4x1_pruning.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -set -x - -train_file=./squad-wikipedia-train-4096.json -validation_file=./squad-wikipedia-dev-4096.json -teacher_model=Intel/longformer-base-4096-finetuned-triviaqa - -accelerate launch --main_process_port 29745 run_qa_no_trainer.py \ - --model_name_or_path $teacher_model \ - --do_train \ - --do_eval \ - --train_file $train_file \ - --validation_file $validation_file \ - --cache_dir ./tmp_cached \ - --max_seq_length 4096 \ - --doc_stride -1 \ - --per_device_train_batch_size 1 \ - --gradient_accumulation_steps 8 \ - --per_device_eval_batch_size 1 \ - --num_warmup_steps 1000 \ - --do_prune \ - --target_sparsity 0.8 \ - --pruning_scope "global" \ - --pruning_pattern "4x1" \ - --pruning_frequency 1000 \ - --cooldown_epochs 10 \ - --learning_rate 1e-4 \ - --num_train_epochs 18 \ - --weight_decay 0.01 \ - --output_dir longformer-base-4096-pruned-global-sparse80 \ - --teacher_model_name_or_path $teacher_model \ - --distill_loss_weight 3 diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/squad.py b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/squad.py deleted file mode 100644 index b9a2847449d..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/squad.py +++ /dev/null @@ -1,144 +0,0 @@ -# coding=utf-8 -# Copyright 2020 The TensorFlow Datasets Authors and the HuggingFace Datasets Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Lint as: python3 -"""SQUAD: The Stanford Question Answering Dataset.""" - - -import json - -import datasets -from datasets.tasks import QuestionAnsweringExtractive - - -logger = datasets.logging.get_logger(__name__) - - -_CITATION = """\ -@article{2016arXiv160605250R, - author = {{Rajpurkar}, Pranav and {Zhang}, Jian and {Lopyrev}, - Konstantin and {Liang}, Percy}, - title = "{SQuAD: 100,000+ Questions for Machine Comprehension of Text}", - journal = {arXiv e-prints}, - year = 2016, - eid = {arXiv:1606.05250}, - pages = {arXiv:1606.05250}, -archivePrefix = {arXiv}, - eprint = {1606.05250}, -} -""" - -_DESCRIPTION = """\ -Stanford Question Answering Dataset (SQuAD) is a reading comprehension \ -dataset, consisting of questions posed by crowdworkers on a set of Wikipedia \ -articles, where the answer to every question is a segment of text, or span, \ -from the corresponding reading passage, or the question might be unanswerable. -""" - -_URL = "https://rajpurkar.github.io/SQuAD-explorer/dataset/" -_URLS = { - "train": _URL + "train-v1.1.json", - "dev": _URL + "dev-v1.1.json", -} - - -class SquadConfig(datasets.BuilderConfig): - """BuilderConfig for SQUAD.""" - - def __init__(self, **kwargs): - """BuilderConfig for SQUAD. - Args: - **kwargs: keyword arguments forwarded to super. - """ - super(SquadConfig, self).__init__(**kwargs) - - -class Squad(datasets.GeneratorBasedBuilder): - """SQUAD: The Stanford Question Answering Dataset. Version 1.1.""" - - BUILDER_CONFIGS = [ - SquadConfig( - name="plain_text", - version=datasets.Version("1.0.0", ""), - description="Plain text", - ), - ] - print(BUILDER_CONFIGS) - - def _info(self): - return datasets.DatasetInfo( - description=_DESCRIPTION, - features=datasets.Features( - { - "id": datasets.Value("string"), - "title": datasets.Value("string"), - "context": datasets.Value("string"), - "question": datasets.Value("string"), - "answers": datasets.features.Sequence( - { - "text": datasets.Value("string"), - "answer_start": datasets.Value("int32"), - } - ), - "aliases": datasets.features.Sequence(datasets.Value("string")), - } - ), - # No default supervised_keys (as we have to pass both question - # and context as input). - supervised_keys=None, - homepage="https://rajpurkar.github.io/SQuAD-explorer/", - citation=_CITATION, - task_templates=[ - QuestionAnsweringExtractive( - question_column="question", context_column="context", answers_column="answers" - ) - ], - ) - - def _split_generators(self, dl_manager): - #downloaded_files = dl_manager.download_and_extract(_URLS) - downloaded_files = self.config.data_files - return [ - datasets.SplitGenerator(name=datasets.Split.TRAIN, gen_kwargs={"filepath": downloaded_files["train"][0]}), - datasets.SplitGenerator(name=datasets.Split.VALIDATION, gen_kwargs={"filepath": downloaded_files["dev"][0]}), - ] - - def _generate_examples(self, filepath): - """This function returns the examples in the raw (text) form.""" - logger.info("generating examples from = %s", filepath) - key = 0 - with open(filepath, encoding="utf-8") as f: - squad = json.load(f) - for article in squad["data"]: - title = article.get("title", "") - for paragraph in article["paragraphs"]: - context = paragraph["context"] # do not strip leading blank spaces GH-2585 - for qa in paragraph["qas"]: - answer_starts = [answer["answer_start"] for answer in qa["answers"]] - answers = [answer["text"] for answer in qa["answers"]] - # Features currently used are "context", "question", and "answers". - # Others are extracted here for the ease of future expansions. - yield key, { - "title": title, - "context": context, - "question": qa["question"], - "id": qa["id"].split('--')[0], - "answers": { - "answer_start": answer_starts, - "text": answers, - }, - "aliases": qa["aliases"] if qa.get("aliases") is not None else [], - } - key += 1 diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/trainer_qa.py b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/trainer_qa.py deleted file mode 100644 index af237521e8a..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/trainer_qa.py +++ /dev/null @@ -1,150 +0,0 @@ -# coding=utf-8 - -# Apache v2 license -# Copyright (C) 2021 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -# Copyright 2020 The HuggingFace Team All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -A subclass of `Trainer` specific to Question-Answering tasks -""" -""" -This script is based on HuggingFace/transformers example: https://github.com/huggingface/transformers/blob/v4.6.1/examples/pytorch/question-answering/trainer_qa.py -""" - -from transformers import Trainer, is_torch_tpu_available -from transformers.trainer_utils import PredictionOutput -import utils_qa -import collections -from collections import defaultdict -import numpy as np -import torch -import json - - -if is_torch_tpu_available(): - import torch_xla.core.xla_model as xm - import torch_xla.debug.metrics as met - - -class QuestionAnsweringTrainer(Trainer): - def __init__(self, *args, eval_examples=None, post_process_function=None, **kwargs): - super().__init__(*args, **kwargs) - self.eval_examples = eval_examples - self.post_process_function = post_process_function - - def evaluate(self, eval_dataset=None, eval_examples=None, ignore_keys=None): - eval_dataset = self.eval_dataset if eval_dataset is None else eval_dataset - eval_dataloader = self.get_eval_dataloader(eval_dataset) - eval_examples = self.eval_examples if eval_examples is None else eval_examples - - # Temporarily disable metric computation, we will do it in the loop here. - compute_metrics = self.compute_metrics - self.compute_metrics = None - eval_loop = self.prediction_loop if self.args.use_legacy_prediction_loop else self.evaluation_loop - try: - output = eval_loop( - eval_dataloader, - description="Evaluation", - # No point gathering the predictions if there are no metrics, otherwise we defer to - # self.args.prediction_loss_only - prediction_loss_only=None, - ignore_keys=ignore_keys, - ) - finally: - self.compute_metrics = compute_metrics - - if self.post_process_function is not None and self.compute_metrics is None: - eval_preds = self.post_process_function(eval_examples, eval_dataset, output.predictions) - metrics = utils_qa.evaluate_triviaqa(eval_preds.label_ids, eval_preds.predictions) - #metrics = self.compute_metrics(eval_preds) - - #self.log(metrics) - else: - metrics = {} - - #if self.args.tpu_metrics_debug or self.args.debug: - # tpu-comment: Logging debug metrics for PyTorch/XLA (compile, execute times, ops, etc.) - # xm.master_print(met.metrics_report()) - - #self.control = self.callback_handler.on_evaluate(self.args, self.state, self.control, metrics) - return metrics - - def predict(self, predict_dataset, predict_examples, ignore_keys=None, n_best_size=20, max_answer_length=30): - predict_dataloader = self.get_test_dataloader(predict_dataset) - - # Temporarily disable metric computation, we will do it in the loop here. - compute_metrics = self.compute_metrics - self.compute_metrics = None - eval_loop = self.prediction_loop if self.args.use_legacy_prediction_loop else self.evaluation_loop - output = eval_loop( - predict_dataloader, - description="Prediction", - # No point gathering the predictions if there are no metrics, otherwise we defer to - # self.args.prediction_loss_only - prediction_loss_only=None, - ignore_keys=ignore_keys, - ) - - all_start_logits, all_end_logits = output.predictions - - all_predictions = collections.OrderedDict() - - qa_with_duplicates = defaultdict(list) - - for example_index, example in enumerate(predict_examples): - input_ids = torch.tensor([predict_dataset[example_index]["input_ids"]]) - qid = predict_dataset[example_index]["example_id"] - - eos_token_indices = (input_ids == self.tokenizer.eos_token_id).nonzero() - question_end_index = eos_token_indices.view(input_ids.size(0), 2, 2)[:, 0, 1] - start_logits = all_start_logits[example_index] - end_logits = all_end_logits[example_index] - start_indexes = np.argsort(start_logits)[-1 : -n_best_size - 1 : -1].tolist() - end_indexes = np.argsort(end_logits)[-1 : -n_best_size - 1 : -1].tolist() - potential_answers = [] - for start_index in start_indexes: - for end_index in end_indexes: - if start_index <= question_end_index[0]: - continue - if end_index <= question_end_index[0]: - continue - if start_index > end_index: - continue - answer_len = end_index - start_index + 1 - if answer_len > max_answer_length: - continue - potential_answers.append({'start': start_index, 'end': end_index, - 'start_logit': start_logits[start_index].item(), - 'end_logit': end_logits[end_index].item()}) - sorted_answers = sorted(potential_answers, key=lambda x: (x['start_logit'] + x['end_logit']), reverse=True) - if len(sorted_answers) == 0: - answer = {'text': 'NoAnswerFound', 'score': -1000000} - else: - answer = sorted_answers[0] - answer_token_ids = input_ids[0, answer['start']: answer['end'] + 1] - answer_tokens = self.tokenizer.convert_ids_to_tokens(answer_token_ids.tolist()) - text = self.tokenizer.convert_tokens_to_string(answer_tokens) - score = answer['start_logit'] + answer['end_logit'] - answer = {'text': text, 'score': score} - qa_with_duplicates[qid].append({'answer_score': answer['score'], 'answer_text': answer['text'], }) - - qid_to_answer_text = {} - for qid, answer_metrics in qa_with_duplicates.items(): - top_answer = sorted(answer_metrics, key=lambda x: x['answer_score'], reverse=True)[0] - qid_to_answer_text[qid] = top_answer['answer_text'] - - with open('predictions.json', 'w') as f: - f.write(json.dumps(qid_to_answer_text, indent=4) + "\n") diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/__init__.py b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/convert_to_squad_format.py b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/convert_to_squad_format.py deleted file mode 100644 index 6279320e045..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/convert_to_squad_format.py +++ /dev/null @@ -1,143 +0,0 @@ -# Copyright 2020 The HuggingFace Team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import file_utils -from . import dataset_utils -import os -from tqdm import tqdm -import random -import nltk -import argparse - - -def get_text(qad, domain): - local_file = os.path.join(args.web_dir, qad['Filename']) if domain == 'SearchResults' else os.path.join(args.wikipedia_dir, qad['Filename']) - return file_utils.get_file_contents(local_file, encoding='utf-8') - - -def select_relevant_portion(text): - paras = text.split('\n') - selected = [] - done = False - for para in paras: - # nltk is slow, but we have to use its word tokenizer for the distant supervision matching to work - # TODO: try both see which one works better - # words = para.split() - # extra_words = args.max_num_tokens - len(selected) - # selected.extend(words[:extra_words]) - # if len(selected) >= args.max_num_tokens: - # break - sents = sent_tokenize.tokenize(para) - for sent in sents: - words = nltk.word_tokenize(sent) - for word in words: - selected.append(word) - if len(selected) >= args.max_num_tokens: - done = True - break - if done: - break - if done: - break - selected.append('\n') - st = ' '.join(selected).strip() - return st - - -def add_triple_data(datum, page, domain): - qad = {'Source': domain} - for key in ['QuestionId', 'Question', 'Answer']: - if key == 'Answer' and key not in datum: - qad[key] = {'NormalizedAliases': []} - qid = datum['QuestionId'] - print(f'qid: {qid} does not have an answer.') - else: - qad[key] = datum[key] - for key in page: - qad[key] = page[key] - return qad - - -def get_qad_triples(data): - qad_triples = [] - for datum in data['Data']: - for key in ['EntityPages', 'SearchResults']: - for page in datum.get(key, []): - qad = add_triple_data(datum, page, key) - qad_triples.append(qad) - return qad_triples - - -def convert_to_squad_format(qa_json_file, squad_file): - qa_json = dataset_utils.read_triviaqa_data(qa_json_file) - qad_triples = get_qad_triples(qa_json) - random.seed(args.seed) - random.shuffle(qad_triples) - - data = [] - for qad in tqdm(qad_triples): - qid = qad['QuestionId'] - - text = get_text(qad, qad['Source']) - selected_text = select_relevant_portion(text) - - question = qad['Question'] - para = {'context': selected_text, 'qas': [{'question': question, 'answers': []}]} - data.append({'paragraphs': [para]}) - qa = para['qas'][0] - qa['id'] = dataset_utils.get_question_doc_string(qid, qad['Filename']) - qa['qid'] = qid - - answers_in_doc = dataset_utils.answer_index_in_document(qad['Answer'], selected_text) - qa['answers'] = answers_in_doc - # We want all answers in the document, not just the first answer - # if index == -1: - # if qa_json['Split'] == 'train': - # continue - # else: - # qa['answers'].append({'text': ans_string, 'answer_start': index}) - - # This doesn't fit the squad format, but we need it for evaluation - qa['aliases'] = qad['Answer']['NormalizedAliases'] - - if qa_json['Split'] == 'train' and len(data) >= args.sample_size and qa_json['Domain'] == 'Web': - break - - if len(data) >= args.sample_size: - break - - squad = {'data': data, 'version': qa_json['Version']} - file_utils.write_json_to_file(squad, squad_file) - print('Added', len(data)) - - -def get_args(): - parser = argparse.ArgumentParser() - parser.add_argument('--triviaqa_file', help='Triviaqa file') - parser.add_argument('--squad_file', help='Squad file') - parser.add_argument('--wikipedia_dir', help='Wikipedia doc dir') - parser.add_argument('--web_dir', help='Web doc dir') - - parser.add_argument('--seed', default=10, type=int, help='Random seed') - parser.add_argument('--max_num_tokens', default=800, type=int, help='Maximum number of tokens from a document') - parser.add_argument('--sample_size', default=8000000000000, type=int, help='Random seed') - parser.add_argument('--tokenizer', default='tokenizers/punkt/english.pickle', help='Sentence tokenizer') - args = parser.parse_args() - return args - - -if __name__ == '__main__': - args = get_args() - sent_tokenize = nltk.data.load(args.tokenizer) - convert_to_squad_format(args.triviaqa_file, args.squad_file) diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/dataset_utils.py b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/dataset_utils.py deleted file mode 100644 index dd42c6cac2a..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/dataset_utils.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright 2020 The HuggingFace Team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from . import file_utils -import re - - -# Key for wikipedia eval is question-id. Key for web eval is the (question_id, filename) tuple -def get_key_to_ground_truth(data): - if data['Domain'] == 'Wikipedia': - return {datum['QuestionId']: datum['Answer'] for datum in data['Data']} - else: - return get_qd_to_answer(data) - - -def get_question_doc_string(qid, doc_name): - return '{}--{}'.format(qid, doc_name) - -def get_qd_to_answer(data): - key_to_answer = {} - for datum in data['Data']: - for page in datum.get('EntityPages', []) + datum.get('SearchResults', []): - qd_tuple = get_question_doc_string(datum['QuestionId'], page['Filename']) - key_to_answer[qd_tuple] = datum['Answer'] - return key_to_answer - - -def read_clean_part(datum): - for key in ['EntityPages', 'SearchResults']: - new_page_list = [] - for page in datum.get(key, []): - if page['DocPartOfVerifiedEval']: - new_page_list.append(page) - datum[key] = new_page_list - assert len(datum['EntityPages']) + len(datum['SearchResults']) > 0 - return datum - - -def read_triviaqa_data(qajson): - data = file_utils.read_json(qajson) - # read only documents and questions that are a part of clean data set - if data['VerifiedEval']: - clean_data = [] - for datum in data['Data']: - if datum['QuestionPartOfVerifiedEval']: - if data['Domain'] == 'Web': - datum = read_clean_part(datum) - clean_data.append(datum) - data['Data'] = clean_data - return data - - -def answer_index_in_document(answer, document): - answer_list = answer['NormalizedAliases'] - answers_in_doc = [] - for answer_string_in_doc in answer_list: - indices = [m.start() for m in re.finditer(answer_string_in_doc, document, flags=re.IGNORECASE)] - for index in indices: - answers_in_doc.append({ - 'text': answer_string_in_doc, - 'answer_start': index - }) - return answers_in_doc diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/file_utils.py b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/file_utils.py deleted file mode 100644 index ad165c545e4..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils/file_utils.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2020 The HuggingFace Team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import json - - -def write_json_to_file(json_object, json_file, mode='w', encoding='utf-8'): - with open(json_file, mode, encoding=encoding) as outfile: - json.dump(json_object, outfile, indent=4, sort_keys=True, ensure_ascii=False) - - -def get_file_contents(filename, encoding='utf-8'): - with open(filename, encoding=encoding) as f: - content = f.read() - return content - - -def read_json(filename, encoding='utf-8'): - contents = get_file_contents(filename, encoding=encoding) - return json.loads(contents) - - -def get_file_contents_as_list(file_path, encoding='utf-8', ignore_blanks=True): - contents = get_file_contents(file_path, encoding=encoding) - lines = contents.split('\n') - lines = [line for line in lines if line != ''] if ignore_blanks else lines - return lines diff --git a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils_qa.py b/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils_qa.py deleted file mode 100644 index 53924013612..00000000000 --- a/examples/huggingface/pytorch/question-answering/pruning/longformer_triviaqa/utils_qa.py +++ /dev/null @@ -1,451 +0,0 @@ -# coding=utf-8 - -# Apache v2 license -# Copyright (C) 2021 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -# Copyright 2020 The HuggingFace Team All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" -Post-processing utilities for question answering. -""" -""" -This script is based on HuggingFace/transformers examples: https://github.com/huggingface/transformers/blob/v4.6.1/examples/pytorch/question-answering/utils_qa.py -""" -import collections -import json -import logging -import os -from typing import Optional, Tuple - -import numpy as np -from tqdm.auto import tqdm -import sys -from collections import Counter -import string -import re -from collections import defaultdict -import torch - - -logger = logging.getLogger(__name__) - - -def postprocess_qa_predictions( - examples, - features, - predictions: Tuple[np.ndarray, np.ndarray], - tokenizer=None, - version_2_with_negative: bool = False, - n_best_size: int = 20, - max_answer_length: int = 30, - null_score_diff_threshold: float = 0.0, - output_dir: Optional[str] = None, - prefix: Optional[str] = None, - is_world_process_zero: bool = True, -): - """ - Post-processes the predictions of a question-answering model to convert them to answers that are substrings of the - original contexts. This is the base postprocessing functions for models that only return start and end logits. - Args: - examples: The non-preprocessed dataset (see the main script for more information). - features: The processed dataset (see the main script for more information). - predictions (:obj:`Tuple[np.ndarray, np.ndarray]`): - The predictions of the model: two arrays containing the start logits and the end logits respectively. Its - first dimension must match the number of elements of :obj:`features`. - version_2_with_negative (:obj:`bool`, `optional`, defaults to :obj:`False`): - Whether or not the underlying dataset contains examples with no answers. - n_best_size (:obj:`int`, `optional`, defaults to 20): - The total number of n-best predictions to generate when looking for an answer. - max_answer_length (:obj:`int`, `optional`, defaults to 30): - The maximum length of an answer that can be generated. This is needed because the start and end predictions - are not conditioned on one another. - null_score_diff_threshold (:obj:`float`, `optional`, defaults to 0): - The threshold used to select the null answer: if the best answer has a score that is less than the score of - the null answer minus this threshold, the null answer is selected for this example (note that the score of - the null answer for an example giving several features is the minimum of the scores for the null answer on - each feature: all features must be aligned on the fact they `want` to predict a null answer). - Only useful when :obj:`version_2_with_negative` is :obj:`True`. - output_dir (:obj:`str`, `optional`): - If provided, the dictionaries of predictions, n_best predictions (with their scores and logits) and, if - :obj:`version_2_with_negative=True`, the dictionary of the scores differences between best and null - answers, are saved in `output_dir`. - prefix (:obj:`str`, `optional`): - If provided, the dictionaries mentioned above are saved with `prefix` added to their names. - is_world_process_zero (:obj:`bool`, `optional`, defaults to :obj:`True`): - Whether this process is the main process or not (used to determine if logging/saves should be done). - """ - assert len(predictions) == 2, "`predictions` should be a tuple with two elements (start_logits, end_logits)." - all_start_logits, all_end_logits = predictions - - assert len(predictions[0]) == len(features), f"Got {len(predictions[0])} predictions and {len(features)} features." - - # Build a map example to its corresponding features. - example_id_to_index = {} - index = 0 - for qid in examples["id"]: - if qid in example_id_to_index: - continue - example_id_to_index[qid] = index - index += 1 - - features_per_example = collections.defaultdict(list) - for i, feature in enumerate(features): - features_per_example[example_id_to_index[feature["example_id"]]].append(i) - - # Logging. - logger.setLevel(logging.INFO if is_world_process_zero else logging.WARN) - logger.info(f"Post-processing {len(examples)} example predictions split into {len(features)} features.") - - qa_with_duplicates = defaultdict(list) - - for qid in tqdm(example_id_to_index): - - feature_indices = features_per_example[example_id_to_index[qid]] - - # Looping through all the features associated to the current example. - for feature_index in feature_indices: - potential_answers = [] - # We grab the predictions of the model for this feature. - start_logits = all_start_logits[feature_index] - end_logits = all_end_logits[feature_index] - - input_ids = torch.tensor([features[feature_index]["input_ids"]]) - - # Go through all possibilities for the `n_best_size` greater start and end logits. - start_indexes = np.argsort(start_logits)[-1 : -n_best_size - 1 : -1].tolist() - end_indexes = np.argsort(end_logits)[-1 : -n_best_size - 1 : -1].tolist() - - eos_token_indices = (input_ids == tokenizer.eos_token_id).nonzero() - question_end_index = eos_token_indices.view(input_ids.size(0), 2, 2)[:, 0, 1] - doc_end_index = eos_token_indices.view(input_ids.size(0), 2, 2)[:, 1, 1] - for start_index in start_indexes: - for end_index in end_indexes: - if start_index >= doc_end_index[0]: - continue - if end_index >= doc_end_index[0]: - continue - if start_index <= question_end_index[0]: - continue - if end_index <= question_end_index[0]: - continue - if start_index > end_index: - continue - answer_len = end_index - start_index + 1 - if answer_len > max_answer_length: - continue - potential_answers.append({'start': start_index, 'end': end_index, - 'start_logit': start_logits[start_index].item(), - 'end_logit': end_logits[end_index].item()}) - sorted_answers = sorted(potential_answers, key=lambda x: (x['start_logit'] + x['end_logit']), reverse=True) - - if len(sorted_answers) == 0: - answer = {'text': 'NoAnswerFound', 'score': -1000000} - else: - answer = sorted_answers[0] - answer_token_ids = input_ids[0, answer['start']: answer['end'] + 1] - answer_tokens = tokenizer.convert_ids_to_tokens(answer_token_ids.tolist()) - text = tokenizer.convert_tokens_to_string(answer_tokens) - score = answer['start_logit'] + answer['end_logit'] - answer = {'text': text, 'score': score} - - qa_with_duplicates[qid].append({'answer_score': answer['score'], 'answer_text': answer['text'], }) - - qid_to_answer_text = {} - for qid, answer_metrics in qa_with_duplicates.items(): - top_answer = sorted(answer_metrics, key=lambda x: x['answer_score'], reverse=True)[0] - qid_to_answer_text[qid] = top_answer['answer_text'] - - - # If we have an output_dir, let's save all those dicts. - if output_dir is not None: - assert os.path.isdir(output_dir), f"{output_dir} is not a directory." - - prediction_file = os.path.join( - output_dir, "predictions.json" if prefix is None else f"{prefix}_predictions.json" - ) - logger.info(f"Saving predictions to {prediction_file}.") - with open(prediction_file, "w") as writer: - writer.write(json.dumps(qid_to_answer_text, indent=4) + "\n") - return qid_to_answer_text - - -def postprocess_qa_predictions_with_beam_search( - examples, - features, - predictions: Tuple[np.ndarray, np.ndarray], - version_2_with_negative: bool = False, - n_best_size: int = 20, - max_answer_length: int = 30, - start_n_top: int = 5, - end_n_top: int = 5, - output_dir: Optional[str] = None, - prefix: Optional[str] = None, - is_world_process_zero: bool = True, -): - """ - Post-processes the predictions of a question-answering model with beam search to convert them to answers that are substrings of the - original contexts. This is the postprocessing functions for models that return start and end logits, indices, as well as - cls token predictions. - Args: - examples: The non-preprocessed dataset (see the main script for more information). - features: The processed dataset (see the main script for more information). - predictions (:obj:`Tuple[np.ndarray, np.ndarray]`): - The predictions of the model: two arrays containing the start logits and the end logits respectively. Its - first dimension must match the number of elements of :obj:`features`. - version_2_with_negative (:obj:`bool`, `optional`, defaults to :obj:`False`): - Whether or not the underlying dataset contains examples with no answers. - n_best_size (:obj:`int`, `optional`, defaults to 20): - The total number of n-best predictions to generate when looking for an answer. - max_answer_length (:obj:`int`, `optional`, defaults to 30): - The maximum length of an answer that can be generated. This is needed because the start and end predictions - are not conditioned on one another. - start_n_top (:obj:`int`, `optional`, defaults to 5): - The number of top start logits too keep when searching for the :obj:`n_best_size` predictions. - end_n_top (:obj:`int`, `optional`, defaults to 5): - The number of top end logits too keep when searching for the :obj:`n_best_size` predictions. - output_dir (:obj:`str`, `optional`): - If provided, the dictionaries of predictions, n_best predictions (with their scores and logits) and, if - :obj:`version_2_with_negative=True`, the dictionary of the scores differences between best and null - answers, are saved in `output_dir`. - prefix (:obj:`str`, `optional`): - If provided, the dictionaries mentioned above are saved with `prefix` added to their names. - is_world_process_zero (:obj:`bool`, `optional`, defaults to :obj:`True`): - Whether this process is the main process or not (used to determine if logging/saves should be done). - """ - assert len(predictions) == 5, "`predictions` should be a tuple with five elements." - start_top_log_probs, start_top_index, end_top_log_probs, end_top_index, cls_logits = predictions - - assert len(predictions[0]) == len( - features - ), f"Got {len(predictions[0])} predicitions and {len(features)} features." - - # Build a map example to its corresponding features. - example_id_to_index = {k: i for i, k in enumerate(examples["id"])} - features_per_example = collections.defaultdict(list) - for i, feature in enumerate(features): - features_per_example[example_id_to_index[feature["example_id"]]].append(i) - - # The dictionaries we have to fill. - all_predictions = collections.OrderedDict() - all_nbest_json = collections.OrderedDict() - scores_diff_json = collections.OrderedDict() if version_2_with_negative else None - - # Logging. - logger.setLevel(logging.INFO if is_world_process_zero else logging.WARN) - logger.info(f"Post-processing {len(examples)} example predictions split into {len(features)} features.") - - # Let's loop over all the examples! - for example_index, example in enumerate(tqdm(examples)): - # Those are the indices of the features associated to the current example. - feature_indices = features_per_example[example_index] - - min_null_score = None - prelim_predictions = [] - - # Looping through all the features associated to the current example. - for feature_index in feature_indices: - # We grab the predictions of the model for this feature. - start_log_prob = start_top_log_probs[feature_index] - start_indexes = start_top_index[feature_index] - end_log_prob = end_top_log_probs[feature_index] - end_indexes = end_top_index[feature_index] - feature_null_score = cls_logits[feature_index] - # This is what will allow us to map some the positions in our logits to span of texts in the original - # context. - offset_mapping = features[feature_index]["offset_mapping"] - # Optional `token_is_max_context`, if provided we will remove answers that do not have the maximum context - # available in the current feature. - token_is_max_context = features[feature_index].get("token_is_max_context", None) - - # Update minimum null prediction - if min_null_score is None or feature_null_score < min_null_score: - min_null_score = feature_null_score - - # Go through all possibilities for the `n_start_top`/`n_end_top` greater start and end logits. - for i in range(start_n_top): - for j in range(end_n_top): - start_index = int(start_indexes[i]) - j_index = i * end_n_top + j - end_index = int(end_indexes[j_index]) - # Don't consider out-of-scope answers (last part of the test should be unnecessary because of the - # p_mask but let's not take any risk) - if ( - start_index >= len(offset_mapping) - or end_index >= len(offset_mapping) - or offset_mapping[start_index] is None - or offset_mapping[end_index] is None - ): - continue - # Don't consider answers with a length negative or > max_answer_length. - if end_index < start_index or end_index - start_index + 1 > max_answer_length: - continue - # Don't consider answer that don't have the maximum context available (if such information is - # provided). - if token_is_max_context is not None and not token_is_max_context.get(str(start_index), False): - continue - prelim_predictions.append( - { - "offsets": (offset_mapping[start_index][0], offset_mapping[end_index][1]), - "score": start_log_prob[i] + end_log_prob[j_index], - "start_log_prob": start_log_prob[i], - "end_log_prob": end_log_prob[j_index], - } - ) - - # Only keep the best `n_best_size` predictions. - predictions = sorted(prelim_predictions, key=lambda x: x["score"], reverse=True)[:n_best_size] - - # Use the offsets to gather the answer text in the original context. - context = example["context"] - for pred in predictions: - offsets = pred.pop("offsets") - pred["text"] = context[offsets[0] : offsets[1]] - - # In the very rare edge case we have not a single non-null prediction, we create a fake prediction to avoid - # failure. - if len(predictions) == 0: - predictions.insert(0, {"text": "", "start_logit": -1e-6, "end_logit": -1e-6, "score": -2e-6}) - - # Compute the softmax of all scores (we do it with numpy to stay independent from torch/tf in this file, using - # the LogSumExp trick). - scores = np.array([pred.pop("score") for pred in predictions]) - exp_scores = np.exp(scores - np.max(scores)) - probs = exp_scores / exp_scores.sum() - - # Include the probabilities in our predictions. - for prob, pred in zip(probs, predictions): - pred["probability"] = prob - - # Pick the best prediction and set the probability for the null answer. - all_predictions[example["id"]] = predictions[0]["text"] - if version_2_with_negative: - scores_diff_json[example["id"]] = float(min_null_score) - - # Make `predictions` JSON-serializable by casting np.float back to float. - all_nbest_json[example["id"]] = [ - {k: (float(v) if isinstance(v, (np.float16, np.float32, np.float64)) else v) for k, v in pred.items()} - for pred in predictions - ] - - # If we have an output_dir, let's save all those dicts. - if output_dir is not None: - assert os.path.isdir(output_dir), f"{output_dir} is not a directory." - - prediction_file = os.path.join( - output_dir, "predictions.json" if prefix is None else f"{prefix}_predictions.json" - ) - nbest_file = os.path.join( - output_dir, "nbest_predictions.json" if prefix is None else f"{prefix}_nbest_predictions.json" - ) - if version_2_with_negative: - null_odds_file = os.path.join( - output_dir, "null_odds.json" if prefix is None else f"{prefix}_null_odds.json" - ) - - print(f"Saving predictions to {prediction_file}.") - with open(prediction_file, "w") as writer: - writer.write(json.dumps(all_predictions, indent=4) + "\n") - print(f"Saving nbest_preds to {nbest_file}.") - with open(nbest_file, "w") as writer: - writer.write(json.dumps(all_nbest_json, indent=4) + "\n") - if version_2_with_negative: - print(f"Saving null_odds to {null_odds_file}.") - with open(null_odds_file, "w") as writer: - writer.write(json.dumps(scores_diff_json, indent=4) + "\n") - - return all_predictions, scores_diff_json - - -def normalize_answer(s): - """Lower text and remove punctuation, articles and extra whitespace.""" - - def remove_articles(text): - return re.sub(r'\b(a|an|the)\b', ' ', text) - - def white_space_fix(text): - return ' '.join(text.split()) - - def handle_punc(text): - exclude = set(string.punctuation + "".join([u"‘", u"’", u"´", u"`"])) - return ''.join(ch if ch not in exclude else ' ' for ch in text) - - def lower(text): - return text.lower() - - def replace_underscore(text): - return text.replace('_', ' ') - - return white_space_fix(remove_articles(handle_punc(lower(replace_underscore(s))))).strip() - -def f1_score(prediction, ground_truth): - prediction_tokens = normalize_answer(prediction).split() - ground_truth_tokens = normalize_answer(ground_truth).split() - common = Counter(prediction_tokens) & Counter(ground_truth_tokens) - num_same = sum(common.values()) - if num_same == 0: - return 0 - precision = 1.0 * num_same / len(prediction_tokens) - recall = 1.0 * num_same / len(ground_truth_tokens) - f1 = (2 * precision * recall) / (precision + recall) - return f1 - -def metric_max_over_ground_truths(metric_fn, prediction, ground_truths): - scores_for_ground_truths = [] - for ground_truth in ground_truths: - score = metric_fn(prediction, ground_truth) - scores_for_ground_truths.append(score) - return max(scores_for_ground_truths) - - -def is_exact_match(answer_object, prediction): - ground_truths = get_ground_truths(answer_object) - for ground_truth in ground_truths: - if exact_match_score(prediction, ground_truth): - return True - return False - - -def has_exact_match(ground_truths, candidates): - for ground_truth in ground_truths: - if ground_truth in candidates: - return True - return False - -def exact_match_score(prediction, ground_truth): - return int(normalize_answer(prediction) == normalize_answer(ground_truth)) - -def evaluate_triviaqa(references, predictions): - f1 = exact_match = common = total = 0 - for qa in references: - total += 1 - if qa["id"] not in predictions: - message = "Unanswered question " + qa["id"] + " will receive score 0." - print(message, file=sys.stderr) - continue - common += 1 - prediction = predictions[qa["id"]] - ground_truths = qa["answers"]["text"] + qa["aliases"] - em_for_this_question = metric_max_over_ground_truths( - exact_match_score, prediction, ground_truths) - - exact_match += em_for_this_question - - f1_for_this_question = metric_max_over_ground_truths( - f1_score, prediction, ground_truths) - f1 += f1_for_this_question - exact_match = 100.0 * exact_match / total - f1 = 100.0 * f1 / total - - return {"exact_match": exact_match, "f1": f1} diff --git a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/README.md b/examples/huggingface/pytorch/question-answering/pruning/magnitude/README.md similarity index 100% rename from examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/README.md rename to examples/huggingface/pytorch/question-answering/pruning/magnitude/README.md diff --git a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/requirements.txt b/examples/huggingface/pytorch/question-answering/pruning/magnitude/requirements.txt similarity index 100% rename from examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/requirements.txt rename to examples/huggingface/pytorch/question-answering/pruning/magnitude/requirements.txt diff --git a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_benchmark.sh b/examples/huggingface/pytorch/question-answering/pruning/magnitude/run_benchmark.sh similarity index 100% rename from examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_benchmark.sh rename to examples/huggingface/pytorch/question-answering/pruning/magnitude/run_benchmark.sh diff --git a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_qa.py b/examples/huggingface/pytorch/question-answering/pruning/magnitude/run_qa.py similarity index 99% rename from examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_qa.py rename to examples/huggingface/pytorch/question-answering/pruning/magnitude/run_qa.py index 8a335ce64b3..7bc9b835440 100644 --- a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/pruning/magnitude/run_qa.py @@ -657,7 +657,7 @@ def compute_metrics(p: EvalPrediction): max_eval_samples = data_args.max_eval_samples \ if data_args.max_eval_samples is not None else len(eval_dataset) eval_samples = min(max_eval_samples, len(eval_dataset)) - samples = eval_samples - (eval_samples % batch_size) \ + samples = eval_samples - (eval_samples % optim_args.batch_size) \ if training_args.dataloader_drop_last else eval_samples logger.info("metrics keys: {}".format(results.keys())) bert_task_acc_keys = ['eval_f1', 'eval_accuracy', 'eval_matthews_correlation', diff --git a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_tuning.sh b/examples/huggingface/pytorch/question-answering/pruning/magnitude/run_tuning.sh similarity index 100% rename from examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/run_tuning.sh rename to examples/huggingface/pytorch/question-answering/pruning/magnitude/run_tuning.sh diff --git a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/trainer_qa.py b/examples/huggingface/pytorch/question-answering/pruning/magnitude/trainer_qa.py similarity index 100% rename from examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/trainer_qa.py rename to examples/huggingface/pytorch/question-answering/pruning/magnitude/trainer_qa.py diff --git a/examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/utils_qa.py b/examples/huggingface/pytorch/question-answering/pruning/magnitude/utils_qa.py similarity index 100% rename from examples/huggingface/pytorch/question-answering/pruning/basic_magnitude/utils_qa.py rename to examples/huggingface/pytorch/question-answering/pruning/magnitude/utils_qa.py diff --git a/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh b/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh index 8930936be2d..d4d1d24fe36 100644 --- a/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/question-answering/quantization/run_tuning.sh @@ -70,7 +70,7 @@ function run_tuning { --evaluation_strategy steps \ --save_strategy steps \ --save_total_limit 1 \ - --safe_serialization False" + --save_safetensors False" elif [ "${topology}" = "bert_large_SQuAD_static" ]; then DATASET_NAME="squad" model_name_or_path="bert-large-uncased-whole-word-masking-finetuned-squad" diff --git a/examples/huggingface/pytorch/text-classification/quantization/run_glue_no_trainer.py b/examples/huggingface/pytorch/text-classification/quantization/run_glue_no_trainer.py deleted file mode 100644 index 384464a9350..00000000000 --- a/examples/huggingface/pytorch/text-classification/quantization/run_glue_no_trainer.py +++ /dev/null @@ -1,575 +0,0 @@ -# coding=utf-8 -# Copyright 2021 The HuggingFace Inc. team. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -""" Finetuning a 🤗 Transformers model for sequence classification on GLUE.""" -import argparse -import logging -import math -import os -import random -import time -from pathlib import Path - -import pandas as pd # to read in different data - -import datasets -from datasets import load_dataset, load_metric -from torch.utils.data import DataLoader - -import transformers -from accelerate import Accelerator -from huggingface_hub import Repository -from intel_extension_for_transformers.transformers import metrics, NoTrainerOptimizer, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - TuningCriterion, - AccuracyCriterion -) -from transformers import ( - AdamW, - AutoConfig, - AutoModelForSequenceClassification, - AutoTokenizer, - DataCollatorWithPadding, - PretrainedConfig, - SchedulerType, - default_data_collator, - get_scheduler, - set_seed, -) -from transformers.file_utils import get_full_repo_name -from transformers.utils.versions import require_version - -logger = logging.getLogger(__name__) - -require_version("datasets>=1.8.0", - "To fix: pip install -r examples/pytorch/text-classification/requirements.txt") - -task_to_keys = { - "cola": ("sentence", None), - "mnli": ("premise", "hypothesis"), - "mrpc": ("sentence1", "sentence2"), - "qnli": ("question", "sentence"), - "qqp": ("question1", "question2"), - "rte": ("sentence1", "sentence2"), - "sst2": ("sentence", None), - "stsb": ("sentence1", "sentence2"), - "wnli": ("sentence1", "sentence2"), -} - - -def parse_args(): - parser = argparse.ArgumentParser( - description="Finetune a transformers model on a text classification task") - parser.add_argument( - "--task_name", - type=str, - default=None, - help="The name of the glue task to train on.", - choices=list(task_to_keys.keys()), - ) - parser.add_argument("--train_file", - type=str, - default=None, - help="A csv or a json file containing the training data.") - parser.add_argument("--validation_file", - type=str, - default=None, - help="A csv or a json file containing the validation data.") - parser.add_argument( - "--max_length", - type=int, - default=128, - help= - ("The maximum total input sequence length after tokenization. Sequences longer than this will be truncated," - " sequences shorter will be padded if `--pad_to_max_lengh` is passed."), - ) - parser.add_argument( - "--pad_to_max_length", - action="store_true", - help="If passed, pad all samples to `max_length`. Otherwise, dynamic padding is used.", - ) - parser.add_argument( - "--model_name_or_path", - type=str, - help="Path to pretrained model or model identifier from huggingface.co/models.", - required=True, - ) - parser.add_argument( - "--use_slow_tokenizer", - action="store_true", - help="If passed, will use a slow tokenizer (not backed by the 🤗 Tokenizers library).", - ) - parser.add_argument( - "--per_device_train_batch_size", - type=int, - default=8, - help="Batch size (per device) for the training dataloader.", - ) - parser.add_argument( - "--per_device_eval_batch_size", - type=int, - default=8, - help="Batch size (per device) for the evaluation dataloader.", - ) - parser.add_argument( - "--learning_rate", - type=float, - default=5e-5, - help="Initial learning rate (after the potential warmup period) to use.", - ) - parser.add_argument("--weight_decay", type=float, default=0.0, help="Weight decay to use.") - parser.add_argument("--num_train_epochs", - type=int, - default=3, - help="Total number of training epochs to perform.") - parser.add_argument( - "--max_train_steps", - type=int, - default=None, - help="Total number of training steps to perform. If provided, overrides num_train_epochs.", - ) - parser.add_argument( - "--gradient_accumulation_steps", - type=int, - default=1, - help="Number of updates steps to accumulate before performing a backward/update pass.", - ) - parser.add_argument( - "--lr_scheduler_type", - type=SchedulerType, - default="linear", - help="The scheduler type to use.", - choices=[ - "linear", "cosine", "cosine_with_restarts", "polynomial", "constant", - "constant_with_warmup" - ], - ) - parser.add_argument("--num_warmup_steps", - type=int, - default=0, - help="Number of steps for the warmup in the lr scheduler.") - parser.add_argument("--output_dir", - type=str, - default=None, - help="Where to store the final model.") - parser.add_argument("--seed", type=int, default=None, help="A seed for reproducible training.") - parser.add_argument("--push_to_hub", - action="store_true", - help="Whether or not to push the model to the Hub.") - parser.add_argument( - "--hub_model_id", - type=str, - help="The name of the repository to keep in sync with the local `output_dir`.") - parser.add_argument("--hub_token", type=str, help="The token to use to push to the Model Hub.") - parser.add_argument("--tune", action="store_true", help="tune a best model with Intel Extension for Transformers.") - parser.add_argument("--quantization_approach", - type=str, - default="static", - help="Quantization approach. Supported approach are static, " - "dynamic and qat.") - parser.add_argument("--metric_name", - type=str, - default=None, - help="Metric name used for the tuning strategy.") - parser.add_argument("--is_relative", - type=bool, - default=True, - help="Metric tolerance model, expected to be relative or absolute.") - parser.add_argument("--perf_tol", - type=float, - default=0.01, - help="Performance tolerance when optimizing the model.") - parser.add_argument("--benchmark", action="store_true", help="run benchmark.") - parser.add_argument("--int8", action="store_true", help="run benchmark with int8 model.") - parser.add_argument("--accuracy_only", - action="store_true", - help="Whether to only test accuracy for model tuned by Neural Compressor.") - parser.add_argument('-i', "--iter", default=0, type=int, help='For accuracy measurement only.') - parser.add_argument('-w', - "--warmup_iter", - default=1, - type=int, - help='For benchmark measurement only.') - args = parser.parse_args() - - # Sanity checks - if args.task_name is None and args.train_file is None and args.validation_file is None: - raise ValueError("Need either a task name or a training/validation file.") - else: - if args.train_file is not None: - extension = args.train_file.split(".")[-1] - assert extension in ["csv", "json"], "`train_file` should be a csv or a json file." - if args.validation_file is not None: - extension = args.validation_file.split(".")[-1] - assert extension in ["csv", - "json"], "`validation_file` should be a csv or a json file." - - if args.push_to_hub: - assert args.output_dir is not None, "Need an `output_dir` to create a repo when `--push_to_hub` is passed." - - return args - - -def eval_func(args, model, accelerator, eval_dataloader, metric): - # Evaluation - batch_time = AverageMeter('Time', ':6.3f') - is_regression = args.task_name == "stsb" - model.eval() - for step, batch in enumerate(eval_dataloader): - if step >= args.warmup_iter: - start = time.time() - # soft labels - outputs = model(**batch) - # measure elapsed time - if step >= args.warmup_iter: - batch_time.update(time.time() - start) - predictions = outputs.logits.argmax( - dim=-1) if not is_regression else outputs.logits.squeeze() - metric.add_batch( - predictions=accelerator.gather(predictions), - references=accelerator.gather(batch["labels"]), - ) - eval_metric = metric.compute() - batch_size = args.per_device_eval_batch_size - print('Batch size = {}'.format(batch_size)) - print('Latency: %.3f ms' % (batch_time.avg / batch_size * 1000)) - print('Throughput: %.3f images/sec' % (batch_size / batch_time.avg)) - logger.info(f"{eval_metric}") - return eval_metric - - -def main(): - # read in the arguments - args = parse_args() - - # Initialize the accelerator. We will let the accelerator handle device placement for us in this example. - accelerator = Accelerator() - # Make one log on every process with the configuration for debugging. - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%m/%d/%Y %H:%M:%S", - level=logging.INFO, - ) - logger.info(accelerator.state) - - # Setup logging, we only want one process per machine to log things on the screen. - # accelerator.is_local_main_process is only True for one process per machine. - logger.setLevel(logging.INFO if accelerator.is_local_main_process else logging.ERROR) - if accelerator.is_local_main_process: - datasets.utils.logging.set_verbosity_warning() - transformers.utils.logging.set_verbosity_info() - else: - datasets.utils.logging.set_verbosity_error() - transformers.utils.logging.set_verbosity_error() - - # If passed along, set the training seed now. - if args.seed is not None: - set_seed(args.seed) - - # Handle the repository creation - if accelerator.is_main_process: - if args.push_to_hub: - if args.hub_model_id is None: - repo_name = get_full_repo_name(Path(args.output_dir).name, token=args.hub_token) - else: - repo_name = args.hub_model_id - repo = Repository(args.output_dir, clone_from=repo_name) - elif args.output_dir is not None: - os.makedirs(args.output_dir, exist_ok=True) - accelerator.wait_for_everyone() - - # Get the datasets: you can either provide your own CSV/JSON training and evaluation files (see below) - # or specify a GLUE benchmark task (the dataset will be downloaded automatically from the datasets Hub). - - # For CSV/JSON files, this script will use as labels the column called 'label' and as pair of sentences the - # sentences in columns called 'sentence1' and 'sentence2' if such column exists or the first two columns not named - # label if at least two columns are provided. - - # If the CSVs/JSONs contain only one non-label column, the script does single sentence classification on this - # single column. You can easily tweak this behavior (see below) - - # In distributed training, the load_dataset function guarantee that only one local process can concurrently - # download the dataset. - if args.task_name is not None: - # Downloading and loading a dataset from the hub. - raw_datasets = load_dataset("glue", args.task_name) - ''' - 06/25/2022 - Distilled-sparse training for bert_mini, on sst2 - pre-load an augmented dataset - ''' - else: - # Loading the dataset from local csv or json file. - data_files = {} - if args.train_file is not None: - data_files["train"] = args.train_file - if args.validation_file is not None: - data_files["validation"] = args.validation_file - extension = (args.train_file - if args.train_file is not None else args.valid_file).split(".")[-1] - raw_datasets = load_dataset(extension, data_files=data_files) - # See more about loading any type of standard or custom dataset at - # https://huggingface.co/docs/datasets/loading_datasets.html. - - if args.task_name is not None: - is_regression = args.task_name == "stsb" - if not is_regression: - label_list = raw_datasets["train"].features["label"].names - num_labels = len(label_list) - else: - num_labels = 1 - else: - # Trying to have good defaults here, don't hesitate to tweak to your needs. - is_regression = raw_datasets["train"].features["label"].dtype in ["float32", "float64"] - if is_regression: - num_labels = 1 - else: - # A useful fast method: - # https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.unique - label_list = raw_datasets["train"].unique("label") - label_list.sort() # Let's sort it for determinism - num_labels = len(label_list) - - # Load pretrained model and tokenizer - # - # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently - # download model & vocab. - config = AutoConfig.from_pretrained(args.model_name_or_path, - num_labels=num_labels, - finetuning_task=args.task_name) - tokenizer = AutoTokenizer.from_pretrained(args.model_name_or_path, - use_fast=not args.use_slow_tokenizer) - if args.int8: - # Load the model obtained after Intel Neural Compressor (INC) quantization - model = OptimizedModel.from_pretrained( - args.model_name_or_path, - from_tf=bool(".ckpt" in args.model_name_or_path), - config=config - ) - else: - model = AutoModelForSequenceClassification.from_pretrained( - args.model_name_or_path, - from_tf=bool(".ckpt" in args.model_name_or_path), - config=config - ) - - # Preprocessing the datasets - if args.task_name is not None: - sentence1_key, sentence2_key = task_to_keys[args.task_name] - else: - # Again, we try to have some nice defaults but don't hesitate to tweak to your use case. - non_label_column_names = [ - name for name in raw_datasets["train"].column_names if name != "label" - ] - if "sentence1" in non_label_column_names and "sentence2" in non_label_column_names: - sentence1_key, sentence2_key = "sentence1", "sentence2" - else: - if len(non_label_column_names) >= 2: - sentence1_key, sentence2_key = non_label_column_names[:2] - else: - sentence1_key, sentence2_key = non_label_column_names[0], None - - # Some models have set the order of the labels to use, so let's make sure we do use it. - label_to_id = None - if (model.config.label2id != PretrainedConfig(num_labels=num_labels).label2id - and args.task_name is not None and not is_regression): - # Some have all caps in their config, some don't. - label_name_to_id = {k.lower(): v for k, v in model.config.label2id.items()} - if list(sorted(label_name_to_id.keys())) == list(sorted(label_list)): - logger.info( - f"The configuration of the model provided the following label correspondence: {label_name_to_id}. " - "Using it!") - else: - logger.warning( - "Your model seems to have been trained with labels, but they don't match the dataset: ", - f"model labels: {list(sorted(label_name_to_id.keys()))}, dataset labels: {list(sorted(label_list))}." - "\nIgnoring the model labels as a result.", - ) - elif args.task_name is None: - label_to_id = {v: i for i, v in enumerate(label_list)} - - if label_to_id is not None: - model.config.label2id = label_to_id - model.config.id2label = {id: label for label, id in config.label2id.items()} - elif args.task_name is not None and not is_regression: - model.config.label2id = {l: i for i, l in enumerate(label_list)} - model.config.id2label = {id: label for label, id in config.label2id.items()} - - padding = "max_length" if args.pad_to_max_length else False - - def preprocess_function(examples): - # Tokenize the texts - texts = ((examples[sentence1_key], ) if sentence2_key is None else - (examples[sentence1_key], examples[sentence2_key])) - result = tokenizer(*texts, padding=padding, max_length=args.max_length, truncation=True) - - if "label" in examples: - if label_to_id is not None: - # Map labels to IDs (not necessary for GLUE tasks) - result["labels"] = [label_to_id[l] for l in examples["label"]] - else: - # In all cases, rename the column to labels because the model will expect that. - result["labels"] = examples["label"] - - return result - - with accelerator.main_process_first(): - - # original process - processed_datasets = raw_datasets.map( - preprocess_function, - batched=True, - remove_columns=raw_datasets["train"].column_names, - desc="Running tokenizer on dataset", - ) - train_dataset = processed_datasets["train"] - eval_dataset = processed_datasets["validation_matched" if args.task_name == - "mnli" else "validation"] - #if use_augmented: - # test_dataset = processed_datasets["test"] - # Log a few random samples from the training set: - for index in random.sample(range(len(train_dataset)), 3): - logger.info(f"Sample {index} of the training set: {train_dataset[index]}.") - - # DataLoaders creation: - if args.pad_to_max_length: - # If padding was already done ot max length, we use the default data collator that will just convert everything - # to tensors. - data_collator = default_data_collator - else: - # Otherwise, `DataCollatorWithPadding` will apply dynamic padding for us (by padding to the maximum length of - # the samples passed). When using mixed precision, we add `pad_to_multiple_of=8` to pad all tensors to multiple - # of 8s, which will enable the use of Tensor Cores on NVIDIA hardware with compute capability >= 7.5 (Volta). - data_collator = DataCollatorWithPadding( - tokenizer, pad_to_multiple_of=(8 if accelerator.use_fp16 else None)) - - train_dataloader = DataLoader(train_dataset, - shuffle=True, - collate_fn=data_collator, - batch_size=args.per_device_train_batch_size) - eval_dataloader = DataLoader(eval_dataset, - collate_fn=data_collator, - batch_size=args.per_device_eval_batch_size) - - # Optimizer - # Split weights in two groups, one with weight decay and the other not. - no_decay = ["bias", "LayerNorm.weight"] - optimizer_grouped_parameters = [ - { - "params": - [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], - "weight_decay": args.weight_decay, - }, - { - "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], - "weight_decay": 0.0, - }, - ] - optimizer = AdamW(optimizer_grouped_parameters, lr=args.learning_rate) - - # Prepare everything with our `accelerator`. - model, optimizer = accelerator.prepare(model, optimizer) - - # Note -> the training dataloader needs to be prepared before we grab his length below (cause its length will be - # shorter in multiprocess) - - # Scheduler and math around the number of training steps. - num_update_steps_per_epoch = math.ceil( - len(train_dataloader) / args.gradient_accumulation_steps) - if args.max_train_steps is None: - args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch - else: - args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch) - - lr_scheduler = get_scheduler( - name=args.lr_scheduler_type, - optimizer=optimizer, - num_warmup_steps=args.num_warmup_steps, - num_training_steps=args.max_train_steps, - ) - - # Get the metric function - if args.task_name is not None: - metric = load_metric("glue", args.task_name) - else: - metric = load_metric("accuracy") - - metric_name = (args.metric_name if args.metric_name is not None else - ("pearson" if args.task_name == "stsb" else - "matthews_correlation" if args.task_name == "cola" else "accuracy")) - - def eval_func_nc(model): - ret = eval_func(args, model, accelerator, eval_dataloader, metric) - return ret[metric_name] - - # Train! - if args.tune: - if accelerator.is_main_process: - tokenizer.save_pretrained(args.output_dir) - config.save_pretrained(args.output_dir, - is_main_process=accelerator.is_main_process, - save_function=accelerator.save) - tune_metric = metrics.Metric(name=metric_name, - is_relative=args.is_relative, - criterion=args.perf_tol) - objective = objectives.performance - tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=args.perf_tol, # optional. - ) - quantization_config = PostTrainingQuantConfig( - approach=args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - quantizer = NoTrainerOptimizer(model, args.output_dir) - quantizer.metrics = tune_metric - model = quantizer.quantize(quantization_config, - eval_func=eval_func_nc, - calib_dataloader=train_dataloader) - - if args.benchmark or args.accuracy_only: - results = eval_func(args, model, accelerator, eval_dataloader, metric) - print("Finally Eval {} Accuracy: {:.5f}".format(metric_name, results[metric_name])) - - -class AverageMeter(object): - """Computes and stores the average and current value""" - def __init__(self, name, fmt=':f'): - self.name = name - self.fmt = fmt - self.reset() - - def reset(self): - self.val = 0 - self.avg = 0 - self.sum = 0 - self.count = 0 - - def update(self, val, n=1): - self.val = val - self.sum += val * n - self.count += n - self.avg = self.sum / self.count - - def __str__(self): - fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' - return fmtstr.format(**self.__dict__) - - -if __name__ == "__main__": - main() diff --git a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py index 609f904cce2..15c0929350c 100644 --- a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py +++ b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py @@ -30,12 +30,13 @@ from accelerate.utils import set_seed from diffusers import StableDiffusionPipeline -from intel_extension_for_transformers.transformers import metrics , NoTrainerOptimizer +from intel_extension_for_transformers.transformers import metrics from neural_compressor.config import ( PostTrainingQuantConfig, TuningCriterion, AccuracyCriterion ) +from neural_compressor.quantization import fit from intel_extension_for_transformers.transformers.config import WEIGHTS_NAME from pytorch_fid import fid_score @@ -318,9 +319,8 @@ def eval_func(model): accuracy_criterion=accuracy_criterion ) os.makedirs(args.output_dir, exist_ok=True) - quantizer = NoTrainerOptimizer(model, args.output_dir) - quantizer.metrics = tune_metric - model = quantizer.quantize(quantization_config, + model = fit(model, + quantization_config, eval_func=eval_func, calib_func=calibration_func, calib_dataloader=DataLoader(CalibDataset(), batch_size=1), diff --git a/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh b/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh index 5a8ced4ea90..ce43f4c35b9 100644 --- a/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh +++ b/examples/huggingface/pytorch/token-classification/quantization/run_tuning.sh @@ -69,7 +69,7 @@ function run_tuning { --evaluation_strategy steps \ --save_strategy steps \ --save_total_limit 1 \ - --safe_serialization False" + --save_safetensors False" fi python -u ./run_ner.py \ diff --git a/intel_extension_for_transformers/transformers/trainer.py b/intel_extension_for_transformers/transformers/trainer.py index 0d14d3843e4..4d4b378353e 100644 --- a/intel_extension_for_transformers/transformers/trainer.py +++ b/intel_extension_for_transformers/transformers/trainer.py @@ -289,7 +289,7 @@ def quantize( """The main entry point of automatic quantization tuning. Args: - quant_config: The path to the YAML configuration file or QuantizationConfig class containing + quant_config: QuantizationConfig class containing accuracy goal, quantization objective and related dataloaders etc. provider: The provider used to quantize. eval_func (:obj:`Callable`, optional): The function used to evaluate the model. diff --git a/workflows/hf_finetuning_and_inference_nlp/src/finetune_itrex.py b/workflows/hf_finetuning_and_inference_nlp/src/finetune_itrex.py index 9e3ba13c89d..3cdab98655f 100644 --- a/workflows/hf_finetuning_and_inference_nlp/src/finetune_itrex.py +++ b/workflows/hf_finetuning_and_inference_nlp/src/finetune_itrex.py @@ -24,9 +24,6 @@ Trainer, ) from intel_extension_for_transformers.transformers import ( - QuantizationConfig, - PruningConfig, - PrunerConfig, metrics, objectives, ) From fc4ad862a9721dbee1f773c2b53cd99edf2d55cf Mon Sep 17 00:00:00 2001 From: changwangss Date: Thu, 20 Jun 2024 20:01:11 -0700 Subject: [PATCH 20/22] restore deployment Signed-off-by: changwangss --- ..._StableDiffusionInstructPix2PixPipeline.py | 738 +++++++++++++++++ .../deployment/stable_diffusion/README.md | 290 +++++++ .../stable_diffusion/diffusion_utils.py | 696 ++++++++++++++++ .../diffusion_utils_img2img.py | 755 ++++++++++++++++++ .../deployment/stable_diffusion/export_ir.py | 311 ++++++++ .../stable_diffusion/export_model.sh | 77 ++ .../images/astronaut_rides_horse.png | Bin 0 -> 464344 bytes .../astronaut_rides_horse_from_engine_1.png | Bin 0 -> 256718 bytes .../stable_diffusion/images/mountain.png | Bin 0 -> 399205 bytes .../images/mountain_cartoonized.png | Bin 0 -> 381908 bytes .../stable_diffusion/prepare_model.py | 337 ++++++++ .../stable_diffusion/quantization_modules.py | 146 ++++ .../stable_diffusion/requirements.txt | 12 + .../stable_diffusion/run_executor.py | 236 ++++++ .../squad/bert_large/run_bert_large.sh | 2 +- .../deployment/squad/bert_large/run_qa.py | 56 +- .../squad/ipex/bert_large/run_bert_large.sh | 2 +- .../squad/ipex/bert_large/run_qa.py | 25 +- .../distilbert_base_uncased/run_distilbert.sh | 2 +- .../ipex/distilbert_base_uncased/run_qa.py | 26 +- .../run_distilbert_sparse.sh | 2 +- .../distilbert_base_uncased_sparse/run_qa.py | 25 +- .../length_adaptive_transformer/README.md | 2 +- .../length_adaptive_transformer/run_LAT.sh | 2 +- .../length_adaptive_transformer/run_qa.py | 23 +- .../distilbert_base_uncased/run_emotion.py | 48 +- .../distilbert_base_uncased/run_emotion.sh | 2 +- .../mrpc/bert_base/run_bert_base.sh | 2 +- .../deployment/mrpc/bert_base/run_glue.py | 48 +- .../bert_base_cased/run_bert_base_cased.sh | 2 +- .../mrpc/bert_base_cased/run_glue.py | 48 +- .../mrpc/bert_mini/run_bert_mini.sh | 2 +- .../deployment/mrpc/bert_mini/run_glue.py | 49 +- .../run_distilbert_base.sh | 2 +- .../mrpc/distilbert_base_uncased/run_glue.py | 49 +- .../deployment/mrpc/roberta_base/run_glue.py | 49 +- .../mrpc/roberta_base/run_roberta_base.sh | 2 +- .../sparse/bert_mini/run_bert_mini.sh | 2 +- .../deployment/sparse/bert_mini/run_glue.py | 47 +- .../distilbert_base_uncased/run_distilbert.sh | 2 +- .../sparse/distilbert_base_uncased/run_qa.py | 47 +- .../sst2/bert_mini/run_bert_mini.sh | 2 +- .../deployment/sst2/bert_mini/run_glue.py | 49 +- .../run_distilbert_base.sh | 2 +- .../sst2/distilbert_base_uncased/run_glue.py | 49 +- .../sst2/minilm_l6_h384_uncased/run_glue.py | 48 +- .../sst2/minilm_l6_h384_uncased/run_minilm.sh | 2 +- .../deployment/mteb/bge/run_bge.sh | 2 +- .../deployment/mteb/bge/run_mteb.py | 50 +- 49 files changed, 3887 insertions(+), 483 deletions(-) create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/ITREX_StableDiffusionInstructPix2PixPipeline.py create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/README.md create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils.py create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils_img2img.py create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_ir.py create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_model.sh create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse.png create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse_from_engine_1.png create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/mountain.png create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/mountain_cartoonized.png create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/prepare_model.py create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/quantization_modules.py create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/requirements.txt create mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/run_executor.py diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/ITREX_StableDiffusionInstructPix2PixPipeline.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/ITREX_StableDiffusionInstructPix2PixPipeline.py new file mode 100644 index 00000000000..a00ccb896cb --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/ITREX_StableDiffusionInstructPix2PixPipeline.py @@ -0,0 +1,738 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Pipeline Modificaiton based from the diffusers 0.12.1 StableDiffusionInstructPix2PixPipeline""" + +import inspect +from typing import Callable, List, Optional, Union + +import numpy as np +import torch +import copy +import PIL +from transformers import CLIPFeatureExtractor, CLIPTextModel, CLIPTokenizer + +from diffusers.models import AutoencoderKL, UNet2DConditionModel +from diffusers.schedulers import KarrasDiffusionSchedulers +from diffusers.utils import ( + PIL_INTERPOLATION, + deprecate, + is_accelerate_available, + logging, + randn_tensor, + replace_example_docstring, +) +from diffusers.pipeline_utils import DiffusionPipeline +from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput +from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker + + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + + +# Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_img2img.preprocess +def preprocess(image): + if isinstance(image, torch.Tensor): + return image + elif isinstance(image, PIL.Image.Image): + image = [image] + + if isinstance(image[0], PIL.Image.Image): + w, h = image[0].size + w, h = map(lambda x: x - x % 8, (w, h)) # resize to integer multiple of 8 + + image = [np.array(i.resize((w, h), resample=PIL_INTERPOLATION["lanczos"]))[None, :] for i in image] + image = np.concatenate(image, axis=0) + image = np.array(image).astype(np.float32) / 255.0 + image = image.transpose(0, 3, 1, 2) + image = 2.0 * image - 1.0 + image = torch.from_numpy(image) + elif isinstance(image[0], torch.Tensor): + image = torch.cat(image, dim=0) + return image + + +class StableDiffusionInstructPix2PixPipeline(DiffusionPipeline): + r""" + Pipeline for pixel-level image editing by following text instructions. Based on Stable Diffusion. + + This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods the + library implements for all the pipelines (such as downloading or saving, running on a particular device, etc.) + + Args: + vae ([`AutoencoderKL`]): + Variational Auto-Encoder (VAE) Model to encode and decode images to and from latent representations. + text_encoder ([`CLIPTextModel`]): + Frozen text-encoder. Stable Diffusion uses the text portion of + [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPTextModel), specifically + the [clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14) variant. + tokenizer (`CLIPTokenizer`): + Tokenizer of class + [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer). + unet ([`UNet2DConditionModel`]): Conditional U-Net architecture to denoise the encoded image latents. + scheduler ([`SchedulerMixin`]): + A scheduler to be used in combination with `unet` to denoise the encoded image latents. Can be one of + [`DDIMScheduler`], [`LMSDiscreteScheduler`], or [`PNDMScheduler`]. + safety_checker ([`StableDiffusionSafetyChecker`]): + Classification module that estimates whether generated images could be considered offensive or harmful. + Please, refer to the [model card](https://huggingface.co/runwayml/stable-diffusion-v1-5) for details. + feature_extractor ([`CLIPFeatureExtractor`]): + Model that extracts features from generated images to be used as inputs for the `safety_checker`. + """ + _optional_components = ["safety_checker", "feature_extractor"] + + def __init__( + self, + vae: AutoencoderKL, + text_encoder: CLIPTextModel, + tokenizer: CLIPTokenizer, + unet: UNet2DConditionModel, + scheduler: KarrasDiffusionSchedulers, + safety_checker: StableDiffusionSafetyChecker, + feature_extractor: CLIPFeatureExtractor, + requires_safety_checker: bool = True, + ): + super().__init__() + + if safety_checker is None and requires_safety_checker: + logger.warning( + f"You have disabled the safety checker for {self.__class__} by passing `safety_checker=None`. Ensure" + " that you abide to the conditions of the Stable Diffusion license and do not expose unfiltered" + " results in services or applications open to the public. Both the diffusers team and Hugging Face" + " strongly recommend to keep the safety filter enabled in all public facing circumstances, disabling" + " it only for use-cases that involve analyzing network behavior or auditing its results. For more" + " information, please have a look at https://github.com/huggingface/diffusers/pull/254 ." + ) + + if safety_checker is not None and feature_extractor is None: + raise ValueError( + "Make sure to define a feature extractor when loading {self.__class__} if you want to use the safety" + " checker. If you do not want to use the safety checker, you can pass `'safety_checker=None'` instead." + ) + + self.register_modules( + vae=vae, + text_encoder=text_encoder, + tokenizer=tokenizer, + unet=unet, + scheduler=scheduler, + safety_checker=safety_checker, + feature_extractor=feature_extractor, + ) + self.vae_scale_factor = 2 ** (len(self.vae.config.block_out_channels) - 1) + self.register_to_config(requires_safety_checker=requires_safety_checker) + + @torch.no_grad() + def __call__( + self, + prompt: Union[str, List[str]] = None, + image: Union[torch.FloatTensor, PIL.Image.Image] = None, + num_inference_steps: int = 100, + guidance_scale: float = 7.5, + image_guidance_scale: float = 1.5, + negative_prompt: Optional[Union[str, List[str]]] = None, + num_images_per_prompt: Optional[int] = 1, + eta: float = 0.0, + generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, + latents: Optional[torch.FloatTensor] = None, + prompt_embeds: Optional[torch.FloatTensor] = None, + negative_prompt_embeds: Optional[torch.FloatTensor] = None, + output_type: Optional[str] = "pil", + return_dict: bool = True, + callback: Optional[Callable[[int, int, torch.FloatTensor], None]] = None, + callback_steps: Optional[int] = 1, + engine_graph: Optional[list] = [], + ): + r""" + Function invoked when calling the pipeline for generation. + + Args: + prompt (`str` or `List[str]`, *optional*): + The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`. + instead. + image (`PIL.Image.Image`): + `Image`, or tensor representing an image batch which will be repainted according to `prompt`. + num_inference_steps (`int`, *optional*, defaults to 100): + The number of denoising steps. More denoising steps usually lead to a higher quality image at the + expense of slower inference. + guidance_scale (`float`, *optional*, defaults to 7.5): + Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598). + `guidance_scale` is defined as `w` of equation 2. of [Imagen + Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale > + 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, + usually at the expense of lower image quality. This pipeline requires a value of at least `1`. + image_guidance_scale (`float`, *optional*, defaults to 1.5): + Image guidance scale is to push the generated image towards the initial image `image`. Image guidance + scale is enabled by setting `image_guidance_scale > 1`. Higher image guidance scale encourages to + generate images that are closely linked to the source image `image`, usually at the expense of lower + image quality. This pipeline requires a value of at least `1`. + negative_prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds`. instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` + is less than `1`). + num_images_per_prompt (`int`, *optional*, defaults to 1): + The number of images to generate per prompt. + eta (`float`, *optional*, defaults to 0.0): + Corresponds to parameter eta (η) in the DDIM paper: https://arxiv.org/abs/2010.02502. Only applies to + [`schedulers.DDIMScheduler`], will be ignored for others. + generator (`torch.Generator`, *optional*): + One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html) + to make generation deterministic. + latents (`torch.FloatTensor`, *optional*): + Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image + generation. Can be used to tweak the same generation with different prompts. If not provided, a latents + tensor will ge generated by sampling using the supplied random `generator`. + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not + provided, text embeddings will be generated from `prompt` input argument. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt + weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input + argument. + output_type (`str`, *optional*, defaults to `"pil"`): + The output format of the generate image. Choose between + [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` or `np.array`. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] instead of a + plain tuple. + callback (`Callable`, *optional*): + A function that will be called every `callback_steps` steps during inference. The function will be + called with the following arguments: `callback(step: int, timestep: int, latents: torch.FloatTensor)`. + callback_steps (`int`, *optional*, defaults to 1): + The frequency at which the `callback` function will be called. If not specified, the callback will be + called at every step. + + Examples: + + ```py + >>> import PIL + >>> import requests + >>> import torch + >>> from io import BytesIO + + >>> from diffusers import StableDiffusionInstructPix2PixPipeline + + + >>> def download_image(url): + ... response = requests.get(url) + ... return PIL.Image.open(BytesIO(response.content)).convert("RGB") + + + >>> img_url = "https://huggingface.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png" + + >>> image = download_image(img_url).resize((512, 512)) + + >>> pipe = StableDiffusionInstructPix2PixPipeline.from_pretrained( + ... "timbrooks/instruct-pix2pix", torch_dtype=torch.float16 + ... ) + >>> pipe = pipe.to("cuda") + + >>> prompt = "make the mountains snowy" + >>> image = pipe(prompt=prompt, image=image).images[0] + ``` + + Returns: + [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] or `tuple`: + [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] if `return_dict` is True, otherwise a `tuple. + When returning a tuple, the first element is a list with the generated images, and the second element is a + list of `bool`s denoting whether the corresponding generated image likely represents "not-safe-for-work" + (nsfw) content, according to the `safety_checker`. + """ + # 0. Check inputs + self.check_inputs(prompt, callback_steps) + + if image is None: + raise ValueError("`image` input cannot be undefined.") + + # 1. Define call parameters + batch_size = 1 if isinstance(prompt, str) else len(prompt) + device = self._execution_device + # here `guidance_scale` is defined analog to the guidance weight `w` of equation (2) + # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . `guidance_scale = 1` + # corresponds to doing no classifier free guidance. + do_classifier_free_guidance = guidance_scale > 1.0 and image_guidance_scale >= 1.0 + # check if scheduler is in sigmas space + scheduler_is_in_sigma_space = hasattr(self.scheduler, "sigmas") + + # 2. Encode input prompt + prompt_embeds = self._encode_prompt( + engine_graph[0], + prompt, + device, + num_images_per_prompt, + do_classifier_free_guidance, + negative_prompt, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + ) + + # 3. Preprocess image + image = preprocess(image) + height, width = image.shape[-2:] + + # 4. set timesteps + self.scheduler.set_timesteps(num_inference_steps, device=device) + timesteps = self.scheduler.timesteps + + # 5. Prepare Image latents + image_latents = self.prepare_image_latents( + image, + batch_size, + num_images_per_prompt, + prompt_embeds.dtype, + device, + do_classifier_free_guidance, + generator, + ) + + # 6. Prepare latent variables + num_channels_latents = self.vae.config.latent_channels + latents = self.prepare_latents( + batch_size * num_images_per_prompt, + num_channels_latents, + height, + width, + prompt_embeds.dtype, + device, + generator, + latents, + ) + + # 7. Check that shapes of latents and image match the UNet channels + num_channels_image = image_latents.shape[1] + if num_channels_latents + num_channels_image != self.unet.config.in_channels: + raise ValueError( + f"Incorrect configuration settings! The config of `pipeline.unet`: {self.unet.config} expects" + f" {self.unet.config.in_channels} but received `num_channels_latents`: {num_channels_latents} +" + f" `num_channels_image`: {num_channels_image} " + f" = {num_channels_latents+num_channels_image}. Please verify the config of" + " `pipeline.unet` or your `image` input." + ) + + # 8. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline + extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) + + # 9. Denoising loop + num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order + with self.progress_bar(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + # Expand the latents if we are doing classifier free guidance. + # The latents are expanded 3 times because for pix2pix the guidance\ + # is applied for both the text and the input image. + latent_model_input = torch.cat([latents] * 3) if do_classifier_free_guidance else latents + + # concat latents, image_latents in the channel dimension + scaled_latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + scaled_latent_model_input = torch.cat([scaled_latent_model_input, image_latents], dim=1) + + # Original Pytorch Diffuser Unet Code: predict the noise residual + #noise_pred = self.unet(scaled_latent_model_input, t, encoder_hidden_states=prompt_embeds).sample + + # The ITREX Unet Code + scaled_latent_model_input = scaled_latent_model_input.contiguous() + prompt_embeds = prompt_embeds.contiguous() + t_1d = torch.tensor([t], dtype=torch.float32).contiguous() + engine_output = engine_graph[1].inference([scaled_latent_model_input, t_1d, prompt_embeds]) + noise_pred = torch.from_numpy(engine_output['out_sample:0']) + + # Hack: + # For karras style schedulers the model does classifier free guidance using the + # predicted_original_sample instead of the noise_pred. So we need to compute the + # predicted_original_sample here if we are using a karras style scheduler. + if scheduler_is_in_sigma_space: + step_index = (self.scheduler.timesteps == t).nonzero().item() + sigma = self.scheduler.sigmas[step_index] + noise_pred = latent_model_input - sigma * noise_pred + + # perform guidance + if do_classifier_free_guidance: + noise_pred_text, noise_pred_image, noise_pred_uncond = noise_pred.chunk(3) + noise_pred = ( + noise_pred_uncond + + guidance_scale * (noise_pred_text - noise_pred_image) + + image_guidance_scale * (noise_pred_image - noise_pred_uncond) + ) + + # Hack: + # For karras style schedulers the model does classifier free guidance using the + # predicted_original_sample instead of the noise_pred. But the scheduler.step function + # expects the noise_pred and computes the predicted_original_sample internally. So we + # need to overwrite the noise_pred here such that the value of the computed + # predicted_original_sample is correct. + if scheduler_is_in_sigma_space: + noise_pred = (noise_pred - latents) / (-sigma) + + # compute the previous noisy sample x_t -> x_t-1 + latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0): + progress_bar.update() + if callback is not None and i % callback_steps == 0: + callback(i, t, latents) + + # 10. Post-processing + image = self.decode_latents(latents, engine_graph[2]) + + # 11. Run safety checker + image, has_nsfw_concept = self.run_safety_checker(image, device, prompt_embeds.dtype) + + # 12. Convert to PIL + if output_type == "pil": + image = self.numpy_to_pil(image) + + if not return_dict: + return (image, has_nsfw_concept) + + return StableDiffusionPipelineOutput(images=image, nsfw_content_detected=has_nsfw_concept) + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.enable_sequential_cpu_offload + def enable_sequential_cpu_offload(self, gpu_id=0): + r""" + Offloads all models to CPU using accelerate, significantly reducing memory usage. When called, unet, + text_encoder, vae and safety checker have their state dicts saved to CPU and then are moved to a + `torch.device('meta') and loaded to GPU only when their specific submodule has its `forward` method called. + """ + if is_accelerate_available(): + from accelerate import cpu_offload + else: + raise ImportError("Please install accelerate via `pip install accelerate`") + + device = torch.device(f"cuda:{gpu_id}") + + for cpu_offloaded_model in [self.unet, self.text_encoder, self.vae]: + cpu_offload(cpu_offloaded_model, device) + + if self.safety_checker is not None: + cpu_offload(self.safety_checker, execution_device=device, offload_buffers=True) + + @property + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._execution_device + def _execution_device(self): + r""" + Returns the device on which the pipeline's models will be executed. After calling + `pipeline.enable_sequential_cpu_offload()` the execution device can only be inferred from Accelerate's module + hooks. + """ + if self.device != torch.device("meta") or not hasattr(self.unet, "_hf_hook"): + return self.device + for module in self.unet.modules(): + if ( + hasattr(module, "_hf_hook") + and hasattr(module._hf_hook, "execution_device") + and module._hf_hook.execution_device is not None + ): + return torch.device(module._hf_hook.execution_device) + return self.device + + def _encode_prompt( + self, + text_encoder_graph, + prompt, + device, + num_images_per_prompt, + do_classifier_free_guidance, + negative_prompt=None, + prompt_embeds: Optional[torch.FloatTensor] = None, + negative_prompt_embeds: Optional[torch.FloatTensor] = None, + ): + r""" + Encodes the prompt into text encoder hidden states. + + Args: + prompt (`str` or `List[str]`, *optional*): + prompt to be encoded + device: (`torch.device`): + torch device + num_images_per_prompt (`int`): + number of images that should be generated per prompt + do_classifier_free_guidance (`bool`): + whether to use classifier free guidance or not + negative_ prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds`. instead. If not defined, one has to pass `negative_prompt_embeds`. instead. + Ignored when not using guidance (i.e., ignored if `guidance_scale` is less than `1`). + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not + provided, text embeddings will be generated from `prompt` input argument. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt + weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input + argument. + """ + if prompt is not None and isinstance(prompt, str): + batch_size = 1 + elif prompt is not None and isinstance(prompt, list): + batch_size = len(prompt) + else: + batch_size = prompt_embeds.shape[0] + + if prompt_embeds is None: + text_inputs = self.tokenizer( + prompt, + padding="max_length", + max_length=self.tokenizer.model_max_length, + truncation=True, + return_tensors="pt", + ) + text_input_ids = text_inputs.input_ids + untruncated_ids = self.tokenizer(prompt, padding="longest", return_tensors="pt").input_ids + + if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal( + text_input_ids, untruncated_ids + ): + removed_text = self.tokenizer.batch_decode( + untruncated_ids[:, self.tokenizer.model_max_length - 1 : -1] + ) + logger.warning( + "The following part of your input was truncated because CLIP can only handle sequences up to" + f" {self.tokenizer.model_max_length} tokens: {removed_text}" + ) + + if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: + attention_mask = text_inputs.attention_mask.to(device) + else: + attention_mask = None + + # The ITREX Text Encdoer Code + # prompt_embeds = text_encoder_graph.inference([text_input_ids]) + # bsz, seq_length = text_input_ids.shape + # encoder_hidden_state = prompt_embeds['last_hidden_state:0'] + # if encoder_hidden_state.dtype == np.int16: + # prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) + # prompt_embeds = torch.from_numpy(prompt_embeds['last_hidden_state:0']).reshape( + # bsz, seq_length, -1) + + #Original Pytorch Diffuser Text Encoder Code + prompt_embeds = self.text_encoder( + text_input_ids.to(device), + attention_mask=attention_mask, + ) + prompt_embeds = prompt_embeds[0] + + prompt_embeds = prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) + + bs_embed, seq_len, _ = prompt_embeds.shape + # duplicate text embeddings for each generation per prompt, using mps friendly method + prompt_embeds = prompt_embeds.repeat(1, num_images_per_prompt, 1) + prompt_embeds = prompt_embeds.view(bs_embed * num_images_per_prompt, seq_len, -1) + + # get unconditional embeddings for classifier free guidance + if do_classifier_free_guidance and negative_prompt_embeds is None: + uncond_tokens: List[str] + if negative_prompt is None: + uncond_tokens = [""] * batch_size + elif type(prompt) is not type(negative_prompt): + raise TypeError( + f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !=" + f" {type(prompt)}." + ) + elif isinstance(negative_prompt, str): + uncond_tokens = [negative_prompt] + elif batch_size != len(negative_prompt): + raise ValueError( + f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:" + f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches" + " the batch size of `prompt`." + ) + else: + uncond_tokens = negative_prompt + + max_length = prompt_embeds.shape[1] + uncond_input = self.tokenizer( + uncond_tokens, + padding="max_length", + max_length=max_length, + truncation=True, + return_tensors="pt", + ) + + if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: + attention_mask = uncond_input.attention_mask.to(device) + else: + attention_mask = None + + # The ITREX Text Encdoer Code + negative_prompt_embeds = text_encoder_graph.inference([uncond_input.input_ids]) + bsz, seq_length = uncond_input.input_ids.shape + encoder_hidden_state = negative_prompt_embeds['last_hidden_state:0'] + if encoder_hidden_state.dtype == np.int16: + negative_prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) + negative_prompt_embeds = torch.from_numpy(negative_prompt_embeds['last_hidden_state:0']).reshape( + bsz, seq_length, -1) + + # Original Pytorch Diffuser Text Encoder Code + # negative_prompt_embeds = self.text_encoder( + # uncond_input.input_ids.to(device), + # attention_mask=attention_mask, + # ) + # negative_prompt_embeds = negative_prompt_embeds[0] + + if do_classifier_free_guidance: + # duplicate unconditional embeddings for each generation per prompt, using mps friendly method + seq_len = negative_prompt_embeds.shape[1] + + negative_prompt_embeds = negative_prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) + + negative_prompt_embeds = negative_prompt_embeds.repeat(1, num_images_per_prompt, 1) + negative_prompt_embeds = negative_prompt_embeds.view(batch_size * num_images_per_prompt, seq_len, -1) + + # For classifier free guidance, we need to do two forward passes. + # Here we concatenate the unconditional and text embeddings into a single batch + # to avoid doing two forward passes + # pix2pix has two negative embeddings, and unlike in other pipelines latents are ordered [prompt_embeds, negative_prompt_embeds, negative_prompt_embeds] + prompt_embeds = torch.cat([prompt_embeds, negative_prompt_embeds, negative_prompt_embeds]) + + return prompt_embeds + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.run_safety_checker + def run_safety_checker(self, image, device, dtype): + if self.safety_checker is not None: + safety_checker_input = self.feature_extractor(self.numpy_to_pil(image), return_tensors="pt").to(device) + image, has_nsfw_concept = self.safety_checker( + images=image, clip_input=safety_checker_input.pixel_values.to(dtype) + ) + else: + has_nsfw_concept = None + return image, has_nsfw_concept + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.prepare_extra_step_kwargs + def prepare_extra_step_kwargs(self, generator, eta): + # prepare extra kwargs for the scheduler step, since not all schedulers have the same signature + # eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers. + # eta corresponds to η in DDIM paper: https://arxiv.org/abs/2010.02502 + # and should be between [0, 1] + + accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys()) + extra_step_kwargs = {} + if accepts_eta: + extra_step_kwargs["eta"] = eta + + # check if the scheduler accepts generator + accepts_generator = "generator" in set(inspect.signature(self.scheduler.step).parameters.keys()) + if accepts_generator: + extra_step_kwargs["generator"] = generator + return extra_step_kwargs + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.decode_latents + def decode_latents(self, latents, vae_decoder_graph): + latents = 1 / 0.18215 * latents + + # Original Pytorch Diffuser Vae Code + image = self.vae.decode(latents).sample + + # The ITREX Vae Codes + latents = latents.contiguous() + output = vae_decoder_graph.inference([latents]) + image = torch.from_numpy(output['sample:0']) + + image = (image / 2 + 0.5).clamp(0, 1) + # we always cast to float32 as this does not cause significant overhead and is compatible with bfloa16 + image = image.cpu().permute(0, 2, 3, 1).float().numpy() + return image + + def check_inputs(self, prompt, callback_steps): + if not isinstance(prompt, str) and not isinstance(prompt, list): + raise ValueError(f"`prompt` has to be of type `str` or `list` but is {type(prompt)}") + + if (callback_steps is None) or ( + callback_steps is not None and (not isinstance(callback_steps, int) or callback_steps <= 0) + ): + raise ValueError( + f"`callback_steps` has to be a positive integer but is {callback_steps} of type" + f" {type(callback_steps)}." + ) + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.prepare_latents + def prepare_latents(self, batch_size, num_channels_latents, height, width, dtype, device, generator, latents=None): + shape = (batch_size, num_channels_latents, height // self.vae_scale_factor, width // self.vae_scale_factor) + if isinstance(generator, list) and len(generator) != batch_size: + raise ValueError( + f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" + f" size of {batch_size}. Make sure the batch size matches the length of the generators." + ) + + if latents is None: + latents = randn_tensor(shape, generator=generator, device=device, dtype=dtype) + else: + latents = latents.to(device) + + # scale the initial noise by the standard deviation required by the scheduler + latents = latents * self.scheduler.init_noise_sigma + return latents + + def prepare_image_latents( + self, image, batch_size, num_images_per_prompt, dtype, device, do_classifier_free_guidance, generator=None + ): + if not isinstance(image, (torch.Tensor, PIL.Image.Image, list)): + raise ValueError( + f"`image` has to be of type `torch.Tensor`, `PIL.Image.Image` or list but is {type(image)}" + ) + + image = image.to(device=device, dtype=dtype) + + batch_size = batch_size * num_images_per_prompt + if isinstance(generator, list) and len(generator) != batch_size: + raise ValueError( + f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" + f" size of {batch_size}. Make sure the batch size matches the length of the generators." + ) + + if isinstance(generator, list): + image_latents = [self.vae.encode(image[i : i + 1]).latent_dist.mode() for i in range(batch_size)] + image_latents = torch.cat(image_latents, dim=0) + else: + image_latents = self.vae.encode(image).latent_dist.mode() + + if batch_size > image_latents.shape[0] and batch_size % image_latents.shape[0] == 0: + # expand image_latents for batch_size + deprecation_message = ( + f"You have passed {batch_size} text prompts (`prompt`), but only {image_latents.shape[0]} initial" + " images (`image`). Initial images are now duplicating to match the number of text prompts. Note" + " that this behavior is deprecated and will be removed in a version 1.0.0. Please make sure to update" + " your script to pass as many initial images as text prompts to suppress this warning." + ) + deprecate("len(prompt) != len(image)", "1.0.0", deprecation_message, standard_warn=False) + additional_image_per_prompt = batch_size // image_latents.shape[0] + image_latents = torch.cat([image_latents] * additional_image_per_prompt, dim=0) + elif batch_size > image_latents.shape[0] and batch_size % image_latents.shape[0] != 0: + raise ValueError( + f"Cannot duplicate `image` of batch size {image_latents.shape[0]} to {batch_size} text prompts." + ) + else: + image_latents = torch.cat([image_latents], dim=0) + + if do_classifier_free_guidance: + uncond_image_latents = torch.zeros_like(image_latents) + image_latents = torch.cat([image_latents, image_latents, uncond_image_latents], dim=0) + + return image_latents + +def fp32_to_bf16(fp32_np): + assert(fp32_np.dtype==np.float32) + temp = copy.deepcopy(fp32_np) + int32_np = temp.view(dtype=np.int32) + int32_np = int32_np >> 16 + bf16_np = int32_np.astype(np.uint16) + return bf16_np + +def bf16_to_fp32(bf16_np): + assert(bf16_np.dtype==np.int16) + temp = copy.deepcopy(bf16_np) + int32_np = temp.astype(dtype=np.int32) + int32_np = int32_np << 16 + fp32_np = int32_np.view(np.float32) + return fp32_np diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/README.md b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/README.md new file mode 100644 index 00000000000..ade21d9086b --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/README.md @@ -0,0 +1,290 @@ +Step-by-Step +========= +This document describes the end-to-end workflow for Text-to-image generative AI models across the Neural Engine backend. + +Supported Text-to-image Generative AI models: +1. [CompVis/stable-diffusion-v1-4](https://huggingface.co/CompVis/stable-diffusion-v1-4) +2. [runwayml/stable-diffusion-v1-5](https://github.com/runwayml/stable-diffusion) +3. [stabilityai/stable-diffusion-2-1](https://huggingface.co/stabilityai/stable-diffusion-2-1) +4. [instruction-tuning-sd](https://huggingface.co/instruction-tuning-sd) + * [scratch-low-level-img-proc](https://huggingface.co/instruction-tuning-sd/scratch-low-level-img-proc) + * [scratch-cartoonizer](https://huggingface.co/instruction-tuning-sd/scratch-cartoonizer) + * [cartoonizer](https://huggingface.co/instruction-tuning-sd/cartoonizer) + * [low-level-img-proc](https://huggingface.co/instruction-tuning-sd/low-level-img-proc) + +The inference and accuracy of the above pretrained models are verified in the default configs. + +# Prerequisite + +## Prepare Python Environment +Create a python environment, optionally with autoconf for jemalloc support. +```shell +conda create -n python=3.10 [autoconf] +conda activate +``` +>**Note**: Make sure pip <=23.2.2 + +Check that `gcc` version is higher than 9.0. +```shell +gcc -v +``` + +Install Intel® Extension for Transformers, please refer to [installation](/docs/installation.md). +```shell +# Install from pypi +pip install intel-extension-for-transformers + +# Or, install from source code +cd +pip install -r requirements.txt +pip install -v . +``` + +Install required dependencies for this example +```shell +cd /examples/huggingface/pytorch/text-to-image/deployment/stable_diffusion + +pip install -r requirements.txt +pip install transformers==4.34.1 +pip install diffusers==0.12.1 +``` +>**Note**: Please use transformers no higher than 4.34.1 + +## Environment Variables (Optional) +```shell +# Preload libjemalloc.so may improve the performance when inference under multi instance. +conda install jemalloc==5.2.1 -c conda-forge -y +export LD_PRELOAD=${LD_PRELOAD}:${CONDA_PREFIX}/lib/libjemalloc.so + +# Using weight sharing can save memory and may improve the performance when multi instances. +export WEIGHT_SHARING=1 +export INST_NUM= +``` +>**Note**: This step is optional. +# End-to-End Workflow +## 1. Prepare Models + +The stable diffusion mainly includes three sub models: +1. Text Encoder +2. Unet +3. Vae Decoder. + +Here we take the [CompVis/stable-diffusion-v1-4](https://huggingface.co/CompVis/stable-diffusion-v1-4) as an example. + +### 1.1 Download Models +Export FP32 ONNX models from the hugginface diffusers module, command as follows: + +```python +python prepare_model.py --input_model=CompVis/stable-diffusion-v1-4 --output_path=./model +``` + +By setting --bf16 to export FP32 and BF16 models. +```python +python prepare_model.py --input_model=CompVis/stable-diffusion-v1-4 --output_path=./model --bf16 +``` + +For INT8 quantized mode, we **only support runwayml/stable-diffusion-v1-5** for now. +You need to get a quantized INT8 model first through QAT, Please refer the [link](https://github.com/intel/intel-extension-for-transformers/blob/main/examples/huggingface/pytorch/text-to-image/quantization/qat/README.md). +Then by setting --qat_int8 to export INT8 models, to export INT8 model. +```python +python prepare_model.py --input_model=runwayml/stable-diffusion-v1-5 --output_path=./model --qat_int8 +``` + +### 1.2 Compile Models + +Export three FP32 onnx sub models of the stable diffusion to Nerual Engine IR. + +```bash +# running the follow bash command to get all IR. +bash export_model.sh --input_model=model --precision=fp32 +``` + +Export three BF16 onnx sub models of the stable diffusion to Nerual Engine IR. + +```bash +# running the follow bash command to get all IR. +bash export_model.sh --input_model=model --precision=bf16 +``` + +Export mixed FP32 & dynamic quantized Int8 IR. + +```bash +bash export_model.sh --input_model=model --precision=fp32 --cast_type=dynamic_int8 +``` + +Export mixed BF16 & QAT quantized Int8 IR. +```bash +bash export_model.sh --input_model=model --precision=qat_int8 +``` + +## 2. Performance + +Python API command as follows: +```python +# FP32 IR +python run_executor.py --ir_path=./fp32_ir --mode=latency --input_model=CompVis/stable-diffusion-v1-4 + +# Mixed FP32 & dynamic quantized Int8 IR. +python run_executor.py --ir_path=./fp32_dynamic_int8_ir --mode=latency --input_model=CompVis/stable-diffusion-v1-4 + +# BF16 IR +python run_executor.py --ir_path=./bf16_ir --mode=latency --input_model=CompVis/stable-diffusion-v1-4 + +# QAT INT8 IR +python run_executor.py --ir_path=./qat_int8_ir --mode=latency --input_model=runwayml/stable-diffusion-v1-5 +``` + +## 3. Accuracy +Frechet Inception Distance(FID) metric is used to evaluate the accuracy. This case we check the FID scores between the pytorch image and engine image. + +By setting --accuracy to check FID socre. +Python API command as follows: +```python +# FP32 IR +python run_executor.py --ir_path=./fp32_ir --mode=accuracy --input_model=CompVis/stable-diffusion-v1-4 + +# Mixed FP32 & dynamic quantized Int8 IR +python run_executor.py --ir_path=./fp32_dynamic_int8_ir --mode=accuracy --input_model=CompVis/stable-diffusion-v1-4 + +# BF16 IR +python run_executor.py --ir_path=./bf16_ir --mode=accuracy --input_model=CompVis/stable-diffusion-v1-4 + +# QAT INT8 IR +python run_executor.py --ir_path=./qat_int8_ir --mode=accuracy --input_model=runwayml/stable-diffusion-v1-5 +``` + +## 4. Try Text to Image + +### 4.1 Text2Img + +Try using one sentence to create a picture! + +```python +# Running FP32 models or BF16 models, just import different IR. +# FP32 models +# Note: +# 1. Using --image to set the path of your image, here we use the default download link. +# 2. The default image is "https://hf.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png". +# 3. The default prompt is "Cartoonize the following image". + +python run_executor.py --ir_path=./fp32_ir --input_model=CompVis/stable-diffusion-v1-4 +``` +![picture1](./images/astronaut_rides_horse.png) + +```python +# BF16 models +python run_executor.py --ir_path=./bf16_ir --input_model=CompVis/stable-diffusion-v1-4 +``` +![picture2](./images/astronaut_rides_horse_from_engine_1.png) + + +### 4.2 Img2Img: instruction-tuning-sd + +Try using one image and prompts to create a new picture! + +```python +# Running FP32 models or BF16 models, just import different IR. +# BF16 models +python run_executor.py --ir_path=./bf16_ir --input_model=instruction-tuning-sd/cartoonizer --pipeline=instruction-tuning-sd --prompts="Cartoonize the following image" --steps=100 +``` + +Original image: + +![picture3](./images/mountain.png) + +Cartoonized image: + +![picture4](./images/mountain_cartoonized.png) + + +## 5. Validated Result + + +### 5.1 Latency (s) + + +Input: a photo of an astronaut riding a horse on mars + +Batch Size: 1 + + +| Model | FP32 | BF16 | +|---------------------|:----------------------:|-----------------------| +| [CompVis/stable-diffusion-v1-4](https://huggingface.co/CompVis/stable-diffusion-v1-4) | 10.33 (s) | 3.02 (s) | + +> Note: Performance results test on ​​06/09/2023 with Intel(R) Xeon(R) Platinum 8480+. +Performance varies by use, configuration and other factors. See platform configuration for configuration details. For more complete information about performance and benchmark results, visit www.intel.com/benchmarks + + + +### 5.2 Platform Configuration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ManufacturerQuanta Cloud Technology Inc
Product NameQuantaGrid D54Q-2U
OSCentOS Stream 8
Kernel5.16.0-rc1-intel-next-00543-g5867b0a2a125
Microcode0x2b000111
IRQ BalanceEnabled
CPU ModelIntel(R) Xeon(R) Platinum 8480+
Base Frequency2.0GHz
Maximum Frequency3.8GHz
CPU(s)224
Thread(s) per Core2
Core(s) per Socket56
Socket(s)2
NUMA Node(s)2
TurboEnabled
FrequencyGovernerPerformance
diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils.py new file mode 100644 index 00000000000..f7e7b0ddd6d --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils.py @@ -0,0 +1,696 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import inspect +from typing import Callable, List, Optional, Union +import torch +import numpy as np +import copy + +from packaging import version +from transformers import CLIPFeatureExtractor, CLIPTextModel, CLIPTokenizer + +from intel_extension_for_transformers.transformers.runtime.compile.graph import Graph + +from diffusers.configuration_utils import FrozenDict +from diffusers.models import AutoencoderKL, UNet2DConditionModel +from diffusers.schedulers import KarrasDiffusionSchedulers +from diffusers.utils import deprecate, is_accelerate_available, logging, randn_tensor, replace_example_docstring +from diffusers.pipeline_utils import DiffusionPipeline +from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput +from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + +EXAMPLE_DOC_STRING = """ + Examples: + ```py + >>> import torch + >>> from diffusers import StableDiffusionPipeline + + >>> pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16) + >>> pipe = pipe.to("cuda") + + >>> prompt = "a photo of an astronaut riding a horse on mars" + >>> image = pipe(prompt).images[0] + ``` +""" + + +class StableDiffusionPipeline(DiffusionPipeline): + r""" + Pipeline for text-to-image generation using Stable Diffusion. + + This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods the + library implements for all the pipelines (such as downloading or saving, running on a particular device, etc.) + + Args: + vae ([`AutoencoderKL`]): + Variational Auto-Encoder (VAE) Model to encode and decode images to and from latent representations. + text_encoder ([`CLIPTextModel`]): + Frozen text-encoder. Stable Diffusion uses the text portion of + [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPTextModel), specifically + the [clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14) variant. + tokenizer (`CLIPTokenizer`): + Tokenizer of class + [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer). + unet ([`UNet2DConditionModel`]): Conditional U-Net architecture to denoise the encoded image latents. + scheduler ([`SchedulerMixin`]): + A scheduler to be used in combination with `unet` to denoise the encoded image latents. Can be one of + [`DDIMScheduler`], [`LMSDiscreteScheduler`], or [`PNDMScheduler`]. + safety_checker ([`StableDiffusionSafetyChecker`]): + Classification module that estimates whether generated images could be considered offensive or harmful. + Please, refer to the [model card](https://huggingface.co/runwayml/stable-diffusion-v1-5) for details. + feature_extractor ([`CLIPFeatureExtractor`]): + Model that extracts features from generated images to be used as inputs for the `safety_checker`. + """ + _optional_components = ["safety_checker", "feature_extractor"] + + def __init__( + self, + vae: AutoencoderKL, + text_encoder: CLIPTextModel, + tokenizer: CLIPTokenizer, + unet: UNet2DConditionModel, + scheduler: KarrasDiffusionSchedulers, + safety_checker: StableDiffusionSafetyChecker, + feature_extractor: CLIPFeatureExtractor, + requires_safety_checker: bool = True, + ): + super().__init__() + + if hasattr(scheduler.config, "steps_offset") and scheduler.config.steps_offset != 1: + deprecation_message = ( + f"The configuration file of this scheduler: {scheduler} is outdated. `steps_offset`" + f" should be set to 1 instead of {scheduler.config.steps_offset}. Please make sure " + "to update the config accordingly as leaving `steps_offset` might led to incorrect results" + " in future versions. If you have downloaded this checkpoint from the Hugging Face Hub," + " it would be very nice if you could open a Pull request for the `scheduler/scheduler_config.json`" + " file") + deprecate("steps_offset!=1", "1.0.0", deprecation_message, standard_warn=False) + new_config = dict(scheduler.config) + new_config["steps_offset"] = 1 + scheduler._internal_dict = FrozenDict(new_config) + + if hasattr(scheduler.config, "clip_sample") and scheduler.config.clip_sample is True: + deprecation_message = ( + f"The configuration file of this scheduler: {scheduler} has not set the configuration `clip_sample`." + " `clip_sample` should be set to False in the configuration file. Please make sure to update the" + " config accordingly as not setting `clip_sample` in the config might lead to incorrect results in" + " future versions. If you have downloaded this checkpoint from the Hugging Face Hub, it would be very" + " nice if you could open a Pull request for the `scheduler/scheduler_config.json` file") + deprecate("clip_sample not set", "1.0.0", deprecation_message, standard_warn=False) + new_config = dict(scheduler.config) + new_config["clip_sample"] = False + scheduler._internal_dict = FrozenDict(new_config) + + if safety_checker is None and requires_safety_checker: + logger.warning( + f"You have disabled the safety checker for {self.__class__} by passing `safety_checker=None`. Ensure" + " that you abide to the conditions of the Stable Diffusion license and do not expose unfiltered" + " results in services or applications open to the public. Both the diffusers team and Hugging Face" + " strongly recommend to keep the safety filter enabled in all public facing circumstances, disabling" + " it only for use-cases that involve analyzing network behavior or auditing its results. For more" + " information, please have a look at https://github.com/huggingface/diffusers/pull/254 .") + + if safety_checker is not None and feature_extractor is None: + raise ValueError( + "Make sure to define a feature extractor when loading {self.__class__} if you want to use the safety" + " checker. If you do not want to use the safety checker, you can pass `'safety_checker=None'` instead." + ) + + is_unet_version_less_0_9_0 = hasattr(unet.config, "_diffusers_version") and version.parse( + version.parse(unet.config._diffusers_version).base_version) < version.parse("0.9.0.dev0") + is_unet_sample_size_less_64 = hasattr(unet.config, "sample_size") and unet.config.sample_size < 64 + if is_unet_version_less_0_9_0 and is_unet_sample_size_less_64: + deprecation_message = ( + "The configuration file of the unet has set the default `sample_size` to smaller than" + " 64 which seems highly unlikely. If your checkpoint is a fine-tuned version of any of the" + " following: \n- CompVis/stable-diffusion-v1-4 \n- CompVis/stable-diffusion-v1-3 \n-" + " CompVis/stable-diffusion-v1-2 \n- CompVis/stable-diffusion-v1-1 \n- runwayml/stable-diffusion-v1-5" + " \n- runwayml/stable-diffusion-inpainting \n you should change 'sample_size' to 64 in the" + " configuration file. Please make sure to update the config accordingly as leaving `sample_size=32`" + " in the config might lead to incorrect results in future versions. If you have downloaded this" + " checkpoint from the Hugging Face Hub, it would be very nice if you could open a Pull request for" + " the `unet/config.json` file") + deprecate("sample_size<64", "1.0.0", deprecation_message, standard_warn=False) + new_config = dict(unet.config) + new_config["sample_size"] = 64 + unet._internal_dict = FrozenDict(new_config) + + self.register_modules( + vae=vae, + text_encoder=text_encoder, + tokenizer=tokenizer, + unet=unet, + scheduler=scheduler, + safety_checker=safety_checker, + feature_extractor=feature_extractor, + ) + self.vae_scale_factor = 2**(len(self.vae.config.block_out_channels) - 1) + self.register_to_config(requires_safety_checker=requires_safety_checker) + + def enable_vae_slicing(self): + r""" + Enable sliced VAE decoding. + + When this option is enabled, the VAE will split the input tensor in slices to compute decoding in several + steps. This is useful to save some memory and allow larger batch sizes. + """ + self.vae.enable_slicing() + + def disable_vae_slicing(self): + r""" + Disable sliced VAE decoding. If `enable_vae_slicing` was previously invoked, this method will go back to + computing decoding in one step. + """ + self.vae.disable_slicing() + + def enable_sequential_cpu_offload(self, gpu_id=0): + r""" + Offloads all models to CPU using accelerate, significantly reducing memory usage. When called, unet, + text_encoder, vae and safety checker have their state dicts saved to CPU and then are moved to a + `torch.device('meta') and loaded to GPU only when their specific submodule has its `forward` method called. + """ + if is_accelerate_available(): + from accelerate import cpu_offload + else: + raise ImportError("Please install accelerate via `pip install accelerate`") + + device = torch.device(f"cuda:{gpu_id}") + + for cpu_offloaded_model in [self.unet, self.text_encoder, self.vae]: + cpu_offload(cpu_offloaded_model, device) + + if self.safety_checker is not None: + cpu_offload(self.safety_checker, execution_device=device, offload_buffers=True) + + @property + def _execution_device(self): + r""" + Returns the device on which the pipeline's models will be executed. After calling + `pipeline.enable_sequential_cpu_offload()` the execution device can only be inferred from Accelerate's module + hooks. + """ + if self.device != torch.device("meta") or not hasattr(self.unet, "_hf_hook"): + return self.device + for module in self.unet.modules(): + if (hasattr(module, "_hf_hook") and hasattr(module._hf_hook, "execution_device") + and module._hf_hook.execution_device is not None): + return torch.device(module._hf_hook.execution_device) + return self.device + + def _encode_prompt( + self, + text_encoder_graph, + prompt, + device, + num_images_per_prompt, + do_classifier_free_guidance, + negative_prompt=None, + prompt_embeds: Optional[torch.FloatTensor] = None, + negative_prompt_embeds: Optional[torch.FloatTensor] = None, + ): + r""" + Encodes the prompt into text encoder hidden states. + + Args: + prompt (`str` or `List[str]`, *optional*): + prompt to be encoded + device: (`torch.device`): + torch device + num_images_per_prompt (`int`): + number of images that should be generated per prompt + do_classifier_free_guidance (`bool`): + whether to use classifier free guidance or not + negative_ prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds`. instead. If not defined, one has to pass `negative_prompt_embeds`. instead. + Ignored when not using guidance (i.e., ignored if `guidance_scale` is less than `1`). + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not + provided, text embeddings will be generated from `prompt` input argument. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt + weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input + argument. + """ + if prompt is not None and isinstance(prompt, str): + batch_size = 1 + elif prompt is not None and isinstance(prompt, list): + batch_size = len(prompt) + else: + batch_size = prompt_embeds.shape[0] + + if prompt_embeds is None: + text_inputs = self.tokenizer( + prompt, + padding="max_length", + max_length=self.tokenizer.model_max_length, + truncation=True, + return_tensors="pt", + ) + text_input_ids = text_inputs.input_ids + untruncated_ids = self.tokenizer(prompt, padding="longest", return_tensors="pt").input_ids + + if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal( + text_input_ids, untruncated_ids): + removed_text = self.tokenizer.batch_decode( + untruncated_ids[:, self.tokenizer.model_max_length - 1:-1]) + logger.warning( + "The following part of your input was truncated because CLIP can only handle sequences up to" + f" {self.tokenizer.model_max_length} tokens: {removed_text}") + + if hasattr(self.text_encoder.config, + "use_attention_mask") and self.text_encoder.config.use_attention_mask: + attention_mask = text_inputs.attention_mask.to(device) + else: + attention_mask = None + + # The ITREX Text Encdoer Code + prompt_embeds = text_encoder_graph.inference([text_input_ids]) + bsz, seq_length = text_input_ids.shape + encoder_hidden_state = prompt_embeds['last_hidden_state:0'] + if encoder_hidden_state.dtype == np.int16: + prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) + prompt_embeds = torch.from_numpy(prompt_embeds['last_hidden_state:0']).reshape( + bsz, seq_length, -1) + + # Original Pytorch Diffuser Text Encoder Code + # prompt_embeds = self.text_encoder( + # text_input_ids.to(device), + # attention_mask=attention_mask, + # ) + # prompt_embeds = prompt_embeds[0] + + prompt_embeds = prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) + + bs_embed, seq_len, _ = prompt_embeds.shape + # duplicate text embeddings for each generation per prompt, using mps friendly method + prompt_embeds = prompt_embeds.repeat(1, num_images_per_prompt, 1) + prompt_embeds = prompt_embeds.view(bs_embed * num_images_per_prompt, seq_len, -1) + + # get unconditional embeddings for classifier free guidance + if do_classifier_free_guidance and negative_prompt_embeds is None: + uncond_tokens: List[str] + if negative_prompt is None: + uncond_tokens = [""] * batch_size + elif type(prompt) is not type(negative_prompt): + raise TypeError( + f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !=" + f" {type(prompt)}.") + elif isinstance(negative_prompt, str): + uncond_tokens = [negative_prompt] + elif batch_size != len(negative_prompt): + raise ValueError( + f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:" + f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches" + " the batch size of `prompt`.") + else: + uncond_tokens = negative_prompt + + max_length = prompt_embeds.shape[1] + uncond_input = self.tokenizer( + uncond_tokens, + padding="max_length", + max_length=max_length, + truncation=True, + return_tensors="pt", + ) + + if hasattr(self.text_encoder.config, + "use_attention_mask") and self.text_encoder.config.use_attention_mask: + attention_mask = uncond_input.attention_mask.to(device) + else: + attention_mask = None + + # The ITREX Text Encdoer Code + negative_prompt_embeds = text_encoder_graph.inference([uncond_input.input_ids]) + bsz, seq_length = uncond_input.input_ids.shape + encoder_hidden_state = negative_prompt_embeds['last_hidden_state:0'] + if encoder_hidden_state.dtype == np.int16: + negative_prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) + negative_prompt_embeds = torch.from_numpy(negative_prompt_embeds['last_hidden_state:0']).reshape( + bsz, seq_length, -1) + + if do_classifier_free_guidance: + # duplicate unconditional embeddings for each generation per prompt, using mps friendly method + seq_len = negative_prompt_embeds.shape[1] + + negative_prompt_embeds = negative_prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) + + negative_prompt_embeds = negative_prompt_embeds.repeat(1, num_images_per_prompt, 1) + negative_prompt_embeds = negative_prompt_embeds.view(batch_size * num_images_per_prompt, seq_len, + -1) + + # For classifier free guidance, we need to do two forward passes. + # Here we concatenate the unconditional and text embeddings into a single batch + # to avoid doing two forward passes + prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds]) + + return prompt_embeds + + def run_safety_checker(self, image, device, dtype): + if self.safety_checker is not None: + safety_checker_input = self.feature_extractor(self.numpy_to_pil(image), + return_tensors="pt").to(device) + image, has_nsfw_concept = self.safety_checker( + images=image, clip_input=safety_checker_input.pixel_values.to(dtype)) + else: + has_nsfw_concept = None + return image, has_nsfw_concept + + def decode_latents(self, latents, vae_decoder_graph): + latents = 1 / 0.18215 * latents + # Original Pytorch Diffuser Vae Code + # image = self.vae.decode(latents).sample + + # The ITREX Vae Codes + output = vae_decoder_graph.inference([latents]) + image = torch.from_numpy(output['sample:0']) + + image = (image / 2 + 0.5).clamp(0, 1) + # we always cast to float32 as this does not cause significant overhead and is compatible with bfloa16 + image = image.cpu().permute(0, 2, 3, 1).float().numpy() + return image + + def prepare_extra_step_kwargs(self, generator, eta): + # prepare extra kwargs for the scheduler step, since not all schedulers have the same signature + # eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers. + # eta corresponds to η in DDIM paper: https://arxiv.org/abs/2010.02502 + # and should be between [0, 1] + + accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys()) + extra_step_kwargs = {} + if accepts_eta: + extra_step_kwargs["eta"] = eta + + # check if the scheduler accepts generator + accepts_generator = "generator" in set(inspect.signature(self.scheduler.step).parameters.keys()) + if accepts_generator: + extra_step_kwargs["generator"] = generator + return extra_step_kwargs + + def check_inputs( + self, + prompt, + height, + width, + callback_steps, + negative_prompt=None, + prompt_embeds=None, + negative_prompt_embeds=None, + ): + if height % 8 != 0 or width % 8 != 0: + raise ValueError(f"`height` and `width` have to be divisible by 8 but are {height} and {width}.") + + if (callback_steps is None) or (callback_steps is not None and + (not isinstance(callback_steps, int) or callback_steps <= 0)): + raise ValueError(f"`callback_steps` has to be a positive integer but is {callback_steps} of type" + f" {type(callback_steps)}.") + + if prompt is not None and prompt_embeds is not None: + raise ValueError( + f"Cannot forward both `prompt`: {prompt} and `prompt_embeds`: {prompt_embeds}. Please make sure to" + " only forward one of the two.") + elif prompt is None and prompt_embeds is None: + raise ValueError( + "Provide either `prompt` or `prompt_embeds`. Cannot leave both `prompt` and `prompt_embeds` undefined." + ) + elif prompt is not None and (not isinstance(prompt, str) and not isinstance(prompt, list)): + raise ValueError(f"`prompt` has to be of type `str` or `list` but is {type(prompt)}") + + if negative_prompt is not None and negative_prompt_embeds is not None: + raise ValueError( + f"Cannot forward both `negative_prompt`: {negative_prompt} and `negative_prompt_embeds`:" + f" {negative_prompt_embeds}. Please make sure to only forward one of the two.") + + if prompt_embeds is not None and negative_prompt_embeds is not None: + if prompt_embeds.shape != negative_prompt_embeds.shape: + raise ValueError( + "`prompt_embeds` and `negative_prompt_embeds` must have the same shape when passed directly, but" + f" got: `prompt_embeds` {prompt_embeds.shape} != `negative_prompt_embeds`" + f" {negative_prompt_embeds.shape}.") + + def prepare_latents(self, + batch_size, + num_channels_latents, + height, + width, + dtype, + device, + generator, + latents=None): + shape = (batch_size, num_channels_latents, height // self.vae_scale_factor, + width // self.vae_scale_factor) + if isinstance(generator, list) and len(generator) != batch_size: + raise ValueError( + f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" + f" size of {batch_size}. Make sure the batch size matches the length of the generators.") + + if latents is None: + latents = randn_tensor(shape, generator=generator, device=device, dtype=dtype) + else: + latents = latents.to(device) + + # scale the initial noise by the standard deviation required by the scheduler + latents = latents * self.scheduler.init_noise_sigma + return latents + + @torch.no_grad() + @replace_example_docstring(EXAMPLE_DOC_STRING) + def __call__( + self, + prompt: Union[str, List[str]] = None, + height: Optional[int] = None, + width: Optional[int] = None, + num_inference_steps: int = 50, + guidance_scale: float = 7.5, + negative_prompt: Optional[Union[str, List[str]]] = None, + num_images_per_prompt: Optional[int] = 1, + eta: float = 0.0, + generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, + latents: Optional[torch.FloatTensor] = None, + prompt_embeds: Optional[torch.FloatTensor] = None, + negative_prompt_embeds: Optional[torch.FloatTensor] = None, + output_type: Optional[str] = "pil", + return_dict: bool = True, + callback: Optional[Callable[[int, int, torch.FloatTensor], None]] = None, + callback_steps: Optional[int] = 1, + engine_graph: Optional[list] = [], + ): + r""" + Function invoked when calling the pipeline for generation. + + Args: + prompt (`str` or `List[str]`, *optional*): + The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`. + instead. + height (`int`, *optional*, defaults to self.unet.config.sample_size * self.vae_scale_factor): + The height in pixels of the generated image. + width (`int`, *optional*, defaults to self.unet.config.sample_size * self.vae_scale_factor): + The width in pixels of the generated image. + num_inference_steps (`int`, *optional*, defaults to 50): + The number of denoising steps. More denoising steps usually lead to a higher quality image at the + expense of slower inference. + guidance_scale (`float`, *optional*, defaults to 7.5): + Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598). + `guidance_scale` is defined as `w` of equation 2. of [Imagen + Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale > + 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, + usually at the expense of lower image quality. + negative_prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds`. instead. If not defined, one has to pass `negative_prompt_embeds`. instead. + Ignored when not using guidance (i.e., ignored if `guidance_scale` is less than `1`). + num_images_per_prompt (`int`, *optional*, defaults to 1): + The number of images to generate per prompt. + eta (`float`, *optional*, defaults to 0.0): + Corresponds to parameter eta (η) in the DDIM paper: https://arxiv.org/abs/2010.02502. Only applies to + [`schedulers.DDIMScheduler`], will be ignored for others. + generator (`torch.Generator` or `List[torch.Generator]`, *optional*): + One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html) + to make generation deterministic. + latents (`torch.FloatTensor`, *optional*): + Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image + generation. Can be used to tweak the same generation with different prompts. If not provided, a latents + tensor will ge generated by sampling using the supplied random `generator`. + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not + provided, text embeddings will be generated from `prompt` input argument. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt + weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input + argument. + output_type (`str`, *optional*, defaults to `"pil"`): + The output format of the generate image. Choose between + [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` or `np.array`. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] instead of a + plain tuple. + callback (`Callable`, *optional*): + A function that will be called every `callback_steps` steps during inference. The function will be + called with the following arguments: `callback(step: int, timestep: int, latents: torch.FloatTensor)`. + callback_steps (`int`, *optional*, defaults to 1): + The frequency at which the `callback` function will be called. If not specified, the callback will be + called at every step. + + Examples: + + Returns: + [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] or `tuple`: + [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] if `return_dict` is True, otherwise a `tuple. + When returning a tuple, the first element is a list with the generated images, and the second element is a + list of `bool`s denoting whether the corresponding generated image likely represents "not-safe-for-work" + (nsfw) content, according to the `safety_checker`. + """ + # 0. Default height and width to unet + height = height or self.unet.config.sample_size * self.vae_scale_factor + width = width or self.unet.config.sample_size * self.vae_scale_factor + + # 1. Check inputs. Raise error if not correct + self.check_inputs(prompt, height, width, callback_steps, negative_prompt, prompt_embeds, + negative_prompt_embeds) + + # 2. Define call parameters + if prompt is not None and isinstance(prompt, str): + batch_size = 1 + elif prompt is not None and isinstance(prompt, list): + batch_size = len(prompt) + else: + batch_size = prompt_embeds.shape[0] + + device = self._execution_device + # here `guidance_scale` is defined analog to the guidance weight `w` of equation (2) + # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . `guidance_scale = 1` + # corresponds to doing no classifier free guidance. + do_classifier_free_guidance = guidance_scale > 1.0 + + # 3. Encode input prompt + prompt_embeds = self._encode_prompt( + engine_graph[0], + prompt, + device, + num_images_per_prompt, + do_classifier_free_guidance, + negative_prompt, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + ) + + # 4. Prepare timesteps + self.scheduler.set_timesteps(num_inference_steps, device=device) + timesteps = self.scheduler.timesteps + # 5. Prepare latent variables + num_channels_latents = self.unet.in_channels + latents = self.prepare_latents( + batch_size * num_images_per_prompt, + num_channels_latents, + height, + width, + prompt_embeds.dtype, + device, + generator, + latents, + ) + + # 6. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline + extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) + + # 7. Denoising loop + num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order + with self.progress_bar(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + # expand the latents if we are doing classifier free guidance + latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents + latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + + # Original Pytorch Diffuser Unet Code: predict the noise residual + # noise_pred = self.unet(latent_model_input, t, encoder_hidden_states=prompt_embeds).sample + + # The ITREX Unet Code + t_1d = torch.tensor([t], dtype=torch.float32) + engine_output = engine_graph[1].inference([latent_model_input, t_1d, prompt_embeds]) + noise_pred = torch.from_numpy(engine_output['out_sample:0']) + + # perform guidance + if do_classifier_free_guidance: + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) + + # compute the previous noisy sample x_t -> x_t-1 + latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and + (i + 1) % self.scheduler.order == 0): + progress_bar.update() + if callback is not None and i % callback_steps == 0: + callback(i, t, latents) + + # 8. Post-processing + image = self.decode_latents(latents, engine_graph[2]) + + # 9. Run safety checker + image, has_nsfw_concept = self.run_safety_checker(image, device, prompt_embeds.dtype) + + # 10. Convert to PIL + if output_type == "pil": + image = self.numpy_to_pil(image) + + if not return_dict: + return (image, has_nsfw_concept) + + return StableDiffusionPipelineOutput(images=image, nsfw_content_detected=has_nsfw_concept) + + +def neural_engine_init(ir_path): + text_encoder_graph = Graph() + text_encoder_path = ir_path + '/text_encoder/' + text_encoder_conf = text_encoder_path + 'conf.yaml' + text_encoder_bin = text_encoder_path + 'model.bin' + text_encoder_graph.graph_init(text_encoder_conf, text_encoder_bin) + + unet_graph = Graph() + uent_path = ir_path + '/unet/' + unet_conf = uent_path + 'conf.yaml' + unet_bin = uent_path + 'model.bin' + unet_graph.graph_init(unet_conf, unet_bin, True) + + vae_decoder_graph = Graph() + vae_decoder_path = ir_path + '/vae_decoder/' + vae_decoder_conf = vae_decoder_path + 'conf.yaml' + vae_decoder_bin = vae_decoder_path + 'model.bin' + vae_decoder_graph.graph_init(vae_decoder_conf, vae_decoder_bin) + + return [text_encoder_graph, unet_graph, vae_decoder_graph] + +def fp32_to_bf16(fp32_np): + assert(fp32_np.dtype==np.float32) + temp = copy.deepcopy(fp32_np) + int32_np = temp.view(dtype=np.int32) + int32_np = int32_np >> 16 + bf16_np = int32_np.astype(np.uint16) + return bf16_np + +def bf16_to_fp32(bf16_np): + assert(bf16_np.dtype==np.int16) + temp = copy.deepcopy(bf16_np) + int32_np = temp.astype(dtype=np.int32) + int32_np = int32_np << 16 + fp32_np = int32_np.view(np.float32) + return fp32_np diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils_img2img.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils_img2img.py new file mode 100644 index 00000000000..e464b07acef --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils_img2img.py @@ -0,0 +1,755 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Pipeline Modificaiton based from the diffusers 0.12.1 StableDiffusionImg2ImgPipeline""" + +import inspect +from typing import Callable, List, Optional, Union + +import numpy as np +import torch +import copy +import PIL +from packaging import version +from transformers import CLIPFeatureExtractor, CLIPTextModel, CLIPTokenizer + +from diffusers.configuration_utils import FrozenDict +from diffusers.models import AutoencoderKL, UNet2DConditionModel +from diffusers.schedulers import KarrasDiffusionSchedulers +from diffusers.utils import ( + PIL_INTERPOLATION, + deprecate, + is_accelerate_available, + logging, + randn_tensor, + replace_example_docstring, +) +from diffusers.pipeline_utils import DiffusionPipeline +from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput +from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker + + +logger = logging.get_logger(__name__) # pylint: disable=invalid-name + +EXAMPLE_DOC_STRING = """ + Examples: + ```py + >>> import requests + >>> import torch + >>> from PIL import Image + >>> from io import BytesIO + + >>> from diffusers import StableDiffusionImg2ImgPipeline + + >>> device = "cuda" + >>> model_id_or_path = "runwayml/stable-diffusion-v1-5" + >>> pipe = StableDiffusionImg2ImgPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16) + >>> pipe = pipe.to(device) + + >>> url = "https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg" + + >>> response = requests.get(url) + >>> init_image = Image.open(BytesIO(response.content)).convert("RGB") + >>> init_image = init_image.resize((768, 512)) + + >>> prompt = "A fantasy landscape, trending on artstation" + + >>> images = pipe(prompt=prompt, image=init_image, strength=0.75, guidance_scale=7.5).images + >>> images[0].save("fantasy_landscape.png") + ``` +""" + + +def preprocess(image): + if isinstance(image, torch.Tensor): + return image + elif isinstance(image, PIL.Image.Image): + image = [image] + + if isinstance(image[0], PIL.Image.Image): + w, h = image[0].size + w, h = map(lambda x: x - x % 8, (w, h)) # resize to integer multiple of 8 + + image = [np.array(i.resize((w, h), resample=PIL_INTERPOLATION["lanczos"]))[None, :] for i in image] + image = np.concatenate(image, axis=0) + image = np.array(image).astype(np.float32) / 255.0 + image = image.transpose(0, 3, 1, 2) + image = 2.0 * image - 1.0 + image = torch.from_numpy(image) + elif isinstance(image[0], torch.Tensor): + image = torch.cat(image, dim=0) + return image + + +class StableDiffusionImg2ImgPipeline(DiffusionPipeline): + r""" + Pipeline for text-guided image to image generation using Stable Diffusion. + + This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods the + library implements for all the pipelines (such as downloading or saving, running on a particular device, etc.) + + Args: + vae ([`AutoencoderKL`]): + Variational Auto-Encoder (VAE) Model to encode and decode images to and from latent representations. + text_encoder ([`CLIPTextModel`]): + Frozen text-encoder. Stable Diffusion uses the text portion of + [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPTextModel), specifically + the [clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14) variant. + tokenizer (`CLIPTokenizer`): + Tokenizer of class + [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer). + unet ([`UNet2DConditionModel`]): Conditional U-Net architecture to denoise the encoded image latents. + scheduler ([`SchedulerMixin`]): + A scheduler to be used in combination with `unet` to denoise the encoded image latents. Can be one of + [`DDIMScheduler`], [`LMSDiscreteScheduler`], or [`PNDMScheduler`]. + safety_checker ([`StableDiffusionSafetyChecker`]): + Classification module that estimates whether generated images could be considered offensive or harmful. + Please, refer to the [model card](https://huggingface.co/runwayml/stable-diffusion-v1-5) for details. + feature_extractor ([`CLIPFeatureExtractor`]): + Model that extracts features from generated images to be used as inputs for the `safety_checker`. + """ + _optional_components = ["safety_checker", "feature_extractor"] + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.__init__ + def __init__( + self, + vae: AutoencoderKL, + text_encoder: CLIPTextModel, + tokenizer: CLIPTokenizer, + unet: UNet2DConditionModel, + scheduler: KarrasDiffusionSchedulers, + safety_checker: StableDiffusionSafetyChecker, + feature_extractor: CLIPFeatureExtractor, + requires_safety_checker: bool = True, + ): + super().__init__() + + if hasattr(scheduler.config, "steps_offset") and scheduler.config.steps_offset != 1: + deprecation_message = ( + f"The configuration file of this scheduler: {scheduler} is outdated. `steps_offset`" + f" should be set to 1 instead of {scheduler.config.steps_offset}. Please make sure " + "to update the config accordingly as leaving `steps_offset` might led to incorrect results" + " in future versions. If you have downloaded this checkpoint from the Hugging Face Hub," + " it would be very nice if you could open a Pull request for the `scheduler/scheduler_config.json`" + " file" + ) + deprecate("steps_offset!=1", "1.0.0", deprecation_message, standard_warn=False) + new_config = dict(scheduler.config) + new_config["steps_offset"] = 1 + scheduler._internal_dict = FrozenDict(new_config) + + if hasattr(scheduler.config, "clip_sample") and scheduler.config.clip_sample is True: + deprecation_message = ( + f"The configuration file of this scheduler: {scheduler} has not set the configuration `clip_sample`." + " `clip_sample` should be set to False in the configuration file. Please make sure to update the" + " config accordingly as not setting `clip_sample` in the config might lead to incorrect results in" + " future versions. If you have downloaded this checkpoint from the Hugging Face Hub, it would be very" + " nice if you could open a Pull request for the `scheduler/scheduler_config.json` file" + ) + deprecate("clip_sample not set", "1.0.0", deprecation_message, standard_warn=False) + new_config = dict(scheduler.config) + new_config["clip_sample"] = False + scheduler._internal_dict = FrozenDict(new_config) + + if safety_checker is None and requires_safety_checker: + logger.warning( + f"You have disabled the safety checker for {self.__class__} by passing `safety_checker=None`. Ensure" + " that you abide to the conditions of the Stable Diffusion license and do not expose unfiltered" + " results in services or applications open to the public. Both the diffusers team and Hugging Face" + " strongly recommend to keep the safety filter enabled in all public facing circumstances, disabling" + " it only for use-cases that involve analyzing network behavior or auditing its results. For more" + " information, please have a look at https://github.com/huggingface/diffusers/pull/254 ." + ) + + if safety_checker is not None and feature_extractor is None: + raise ValueError( + "Make sure to define a feature extractor when loading {self.__class__} if you want to use the safety" + " checker. If you do not want to use the safety checker, you can pass `'safety_checker=None'` instead." + ) + + is_unet_version_less_0_9_0 = hasattr(unet.config, "_diffusers_version") and version.parse( + version.parse(unet.config._diffusers_version).base_version + ) < version.parse("0.9.0.dev0") + is_unet_sample_size_less_64 = hasattr(unet.config, "sample_size") and unet.config.sample_size < 64 + if is_unet_version_less_0_9_0 and is_unet_sample_size_less_64: + deprecation_message = ( + "The configuration file of the unet has set the default `sample_size` to smaller than" + " 64 which seems highly unlikely. If your checkpoint is a fine-tuned version of any of the" + " following: \n- CompVis/stable-diffusion-v1-4 \n- CompVis/stable-diffusion-v1-3 \n-" + " CompVis/stable-diffusion-v1-2 \n- CompVis/stable-diffusion-v1-1 \n- runwayml/stable-diffusion-v1-5" + " \n- runwayml/stable-diffusion-inpainting \n you should change 'sample_size' to 64 in the" + " configuration file. Please make sure to update the config accordingly as leaving `sample_size=32`" + " in the config might lead to incorrect results in future versions. If you have downloaded this" + " checkpoint from the Hugging Face Hub, it would be very nice if you could open a Pull request for" + " the `unet/config.json` file" + ) + deprecate("sample_size<64", "1.0.0", deprecation_message, standard_warn=False) + new_config = dict(unet.config) + new_config["sample_size"] = 64 + unet._internal_dict = FrozenDict(new_config) + + self.register_modules( + vae=vae, + text_encoder=text_encoder, + tokenizer=tokenizer, + unet=unet, + scheduler=scheduler, + safety_checker=safety_checker, + feature_extractor=feature_extractor, + ) + self.vae_scale_factor = 2 ** (len(self.vae.config.block_out_channels) - 1) + self.register_to_config(requires_safety_checker=requires_safety_checker) + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.enable_sequential_cpu_offload + def enable_sequential_cpu_offload(self, gpu_id=0): + r""" + Offloads all models to CPU using accelerate, significantly reducing memory usage. When called, unet, + text_encoder, vae and safety checker have their state dicts saved to CPU and then are moved to a + `torch.device('meta') and loaded to GPU only when their specific submodule has its `forward` method called. + """ + if is_accelerate_available(): + from accelerate import cpu_offload + else: + raise ImportError("Please install accelerate via `pip install accelerate`") + + device = torch.device(f"cuda:{gpu_id}") + + for cpu_offloaded_model in [self.unet, self.text_encoder, self.vae]: + cpu_offload(cpu_offloaded_model, device) + + if self.safety_checker is not None: + cpu_offload(self.safety_checker, execution_device=device, offload_buffers=True) + + @property + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._execution_device + def _execution_device(self): + r""" + Returns the device on which the pipeline's models will be executed. After calling + `pipeline.enable_sequential_cpu_offload()` the execution device can only be inferred from Accelerate's module + hooks. + """ + if self.device != torch.device("meta") or not hasattr(self.unet, "_hf_hook"): + return self.device + for module in self.unet.modules(): + if ( + hasattr(module, "_hf_hook") + and hasattr(module._hf_hook, "execution_device") + and module._hf_hook.execution_device is not None + ): + return torch.device(module._hf_hook.execution_device) + return self.device + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._encode_prompt + def _encode_prompt( + self, + text_encoder_graph, + prompt, + device, + num_images_per_prompt, + do_classifier_free_guidance, + negative_prompt=None, + prompt_embeds: Optional[torch.FloatTensor] = None, + negative_prompt_embeds: Optional[torch.FloatTensor] = None, + ): + r""" + Encodes the prompt into text encoder hidden states. + + Args: + prompt (`str` or `List[str]`, *optional*): + prompt to be encoded + device: (`torch.device`): + torch device + num_images_per_prompt (`int`): + number of images that should be generated per prompt + do_classifier_free_guidance (`bool`): + whether to use classifier free guidance or not + negative_ prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds`. instead. If not defined, one has to pass `negative_prompt_embeds`. instead. + Ignored when not using guidance (i.e., ignored if `guidance_scale` is less than `1`). + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not + provided, text embeddings will be generated from `prompt` input argument. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt + weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input + argument. + """ + if prompt is not None and isinstance(prompt, str): + batch_size = 1 + elif prompt is not None and isinstance(prompt, list): + batch_size = len(prompt) + else: + batch_size = prompt_embeds.shape[0] + + if prompt_embeds is None: + text_inputs = self.tokenizer( + prompt, + padding="max_length", + max_length=self.tokenizer.model_max_length, + truncation=True, + return_tensors="pt", + ) + text_input_ids = text_inputs.input_ids + untruncated_ids = self.tokenizer(prompt, padding="longest", return_tensors="pt").input_ids + + if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal( + text_input_ids, untruncated_ids + ): + removed_text = self.tokenizer.batch_decode( + untruncated_ids[:, self.tokenizer.model_max_length - 1 : -1] + ) + logger.warning( + "The following part of your input was truncated because CLIP can only handle sequences up to" + f" {self.tokenizer.model_max_length} tokens: {removed_text}" + ) + + if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: + attention_mask = text_inputs.attention_mask.to(device) + else: + attention_mask = None + + # The ITREX Text Encdoer Code + prompt_embeds = text_encoder_graph.inference([text_input_ids]) + bsz, seq_length = text_input_ids.shape + encoder_hidden_state = prompt_embeds['last_hidden_state:0'] + if encoder_hidden_state.dtype == np.int16: + prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) + prompt_embeds = torch.from_numpy(prompt_embeds['last_hidden_state:0']).reshape( + bsz, seq_length, -1) + + # Original Pytorch Diffuser Text Encoder Code + # prompt_embeds = self.text_encoder( + # text_input_ids.to(device), + # attention_mask=attention_mask, + # ) + # prompt_embeds = prompt_embeds[0] + + prompt_embeds = prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) + + bs_embed, seq_len, _ = prompt_embeds.shape + # duplicate text embeddings for each generation per prompt, using mps friendly method + prompt_embeds = prompt_embeds.repeat(1, num_images_per_prompt, 1) + prompt_embeds = prompt_embeds.view(bs_embed * num_images_per_prompt, seq_len, -1) + + # get unconditional embeddings for classifier free guidance + if do_classifier_free_guidance and negative_prompt_embeds is None: + uncond_tokens: List[str] + if negative_prompt is None: + uncond_tokens = [""] * batch_size + elif type(prompt) is not type(negative_prompt): + raise TypeError( + f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !=" + f" {type(prompt)}." + ) + elif isinstance(negative_prompt, str): + uncond_tokens = [negative_prompt] + elif batch_size != len(negative_prompt): + raise ValueError( + f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:" + f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches" + " the batch size of `prompt`." + ) + else: + uncond_tokens = negative_prompt + + max_length = prompt_embeds.shape[1] + uncond_input = self.tokenizer( + uncond_tokens, + padding="max_length", + max_length=max_length, + truncation=True, + return_tensors="pt", + ) + + if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: + attention_mask = uncond_input.attention_mask.to(device) + else: + attention_mask = None + + # The ITREX Text Encdoer Code + negative_prompt_embeds = text_encoder_graph.inference([uncond_input.input_ids]) + bsz, seq_length = uncond_input.input_ids.shape + encoder_hidden_state = negative_prompt_embeds['last_hidden_state:0'] + if encoder_hidden_state.dtype == np.int16: + negative_prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) + negative_prompt_embeds = torch.from_numpy(negative_prompt_embeds['last_hidden_state:0']).reshape( + bsz, seq_length, -1) + + # Original Pytorch Diffuser Text Encoder Code + # negative_prompt_embeds = self.text_encoder( + # uncond_input.input_ids.to(device), + # attention_mask=attention_mask, + # ) + # negative_prompt_embeds = negative_prompt_embeds[0] + + if do_classifier_free_guidance: + # duplicate unconditional embeddings for each generation per prompt, using mps friendly method + seq_len = negative_prompt_embeds.shape[1] + + negative_prompt_embeds = negative_prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) + + negative_prompt_embeds = negative_prompt_embeds.repeat(1, num_images_per_prompt, 1) + negative_prompt_embeds = negative_prompt_embeds.view(batch_size * num_images_per_prompt, seq_len, -1) + + # For classifier free guidance, we need to do two forward passes. + # Here we concatenate the unconditional and text embeddings into a single batch + # to avoid doing two forward passes + prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds]) + + return prompt_embeds + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.run_safety_checker + def run_safety_checker(self, image, device, dtype): + if self.safety_checker is not None: + safety_checker_input = self.feature_extractor(self.numpy_to_pil(image), return_tensors="pt").to(device) + image, has_nsfw_concept = self.safety_checker( + images=image, clip_input=safety_checker_input.pixel_values.to(dtype) + ) + else: + has_nsfw_concept = None + return image, has_nsfw_concept + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.decode_latents + def decode_latents(self, latents, vae_decoder_graph): + latents = 1 / 0.18215 * latents + # Original Pytorch Diffuser Vae Code + # image = self.vae.decode(latents).sample + + # The ITREX Vae Codes + latents = latents.contiguous() + output = vae_decoder_graph.inference([latents]) + image = torch.from_numpy(output['sample:0']) + + image = (image / 2 + 0.5).clamp(0, 1) + # we always cast to float32 as this does not cause significant overhead and is compatible with bfloa16 + image = image.cpu().permute(0, 2, 3, 1).float().numpy() + return image + + # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.prepare_extra_step_kwargs + def prepare_extra_step_kwargs(self, generator, eta): + # prepare extra kwargs for the scheduler step, since not all schedulers have the same signature + # eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers. + # eta corresponds to η in DDIM paper: https://arxiv.org/abs/2010.02502 + # and should be between [0, 1] + + accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys()) + extra_step_kwargs = {} + if accepts_eta: + extra_step_kwargs["eta"] = eta + + # check if the scheduler accepts generator + accepts_generator = "generator" in set(inspect.signature(self.scheduler.step).parameters.keys()) + if accepts_generator: + extra_step_kwargs["generator"] = generator + return extra_step_kwargs + + def check_inputs( + self, prompt, strength, callback_steps, negative_prompt=None, prompt_embeds=None, negative_prompt_embeds=None + ): + if not isinstance(prompt, str) and not isinstance(prompt, list): + raise ValueError(f"`prompt` has to be of type `str` or `list` but is {type(prompt)}") + + if strength < 0 or strength > 1: + raise ValueError(f"The value of strength should in [0.0, 1.0] but is {strength}") + + if (callback_steps is None) or ( + callback_steps is not None and (not isinstance(callback_steps, int) or callback_steps <= 0) + ): + raise ValueError( + f"`callback_steps` has to be a positive integer but is {callback_steps} of type" + f" {type(callback_steps)}." + ) + + if prompt is not None and prompt_embeds is not None: + raise ValueError( + f"Cannot forward both `prompt`: {prompt} and `prompt_embeds`: {prompt_embeds}. Please make sure to" + " only forward one of the two." + ) + elif prompt is None and prompt_embeds is None: + raise ValueError( + "Provide either `prompt` or `prompt_embeds`. Cannot leave both `prompt` and `prompt_embeds` undefined." + ) + elif prompt is not None and (not isinstance(prompt, str) and not isinstance(prompt, list)): + raise ValueError(f"`prompt` has to be of type `str` or `list` but is {type(prompt)}") + + if negative_prompt is not None and negative_prompt_embeds is not None: + raise ValueError( + f"Cannot forward both `negative_prompt`: {negative_prompt} and `negative_prompt_embeds`:" + f" {negative_prompt_embeds}. Please make sure to only forward one of the two." + ) + + if prompt_embeds is not None and negative_prompt_embeds is not None: + if prompt_embeds.shape != negative_prompt_embeds.shape: + raise ValueError( + "`prompt_embeds` and `negative_prompt_embeds` must have the same shape when passed directly, but" + f" got: `prompt_embeds` {prompt_embeds.shape} != `negative_prompt_embeds`" + f" {negative_prompt_embeds.shape}." + ) + + def get_timesteps(self, num_inference_steps, strength, device): + # get the original timestep using init_timestep + init_timestep = min(int(num_inference_steps * strength), num_inference_steps) + + t_start = max(num_inference_steps - init_timestep, 0) + timesteps = self.scheduler.timesteps[t_start:] + + return timesteps, num_inference_steps - t_start + + def prepare_latents(self, image, timestep, batch_size, num_images_per_prompt, dtype, device, generator=None): + if not isinstance(image, (torch.Tensor, PIL.Image.Image, list)): + raise ValueError( + f"`image` has to be of type `torch.Tensor`, `PIL.Image.Image` or list but is {type(image)}" + ) + + image = image.to(device=device, dtype=dtype) + + batch_size = batch_size * num_images_per_prompt + if isinstance(generator, list) and len(generator) != batch_size: + raise ValueError( + f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" + f" size of {batch_size}. Make sure the batch size matches the length of the generators." + ) + + if isinstance(generator, list): + init_latents = [ + self.vae.encode(image[i : i + 1]).latent_dist.sample(generator[i]) for i in range(batch_size) + ] + init_latents = torch.cat(init_latents, dim=0) + else: + init_latents = self.vae.encode(image).latent_dist.sample(generator) + + init_latents = 0.18215 * init_latents + + if batch_size > init_latents.shape[0] and batch_size % init_latents.shape[0] == 0: + # expand init_latents for batch_size + deprecation_message = ( + f"You have passed {batch_size} text prompts (`prompt`), but only {init_latents.shape[0]} initial" + " images (`image`). Initial images are now duplicating to match the number of text prompts. Note" + " that this behavior is deprecated and will be removed in a version 1.0.0. Please make sure to update" + " your script to pass as many initial images as text prompts to suppress this warning." + ) + deprecate("len(prompt) != len(image)", "1.0.0", deprecation_message, standard_warn=False) + additional_image_per_prompt = batch_size // init_latents.shape[0] + init_latents = torch.cat([init_latents] * additional_image_per_prompt, dim=0) + elif batch_size > init_latents.shape[0] and batch_size % init_latents.shape[0] != 0: + raise ValueError( + f"Cannot duplicate `image` of batch size {init_latents.shape[0]} to {batch_size} text prompts." + ) + else: + init_latents = torch.cat([init_latents], dim=0) + + shape = init_latents.shape + noise = randn_tensor(shape, generator=generator, device=device, dtype=dtype) + + # get latents + init_latents = self.scheduler.add_noise(init_latents, noise, timestep) + latents = init_latents + + return latents + + @torch.no_grad() + @replace_example_docstring(EXAMPLE_DOC_STRING) + def __call__( + self, + prompt: Union[str, List[str]] = None, + image: Union[torch.FloatTensor, PIL.Image.Image] = None, + strength: float = 0.8, + num_inference_steps: Optional[int] = 50, + guidance_scale: Optional[float] = 7.5, + negative_prompt: Optional[Union[str, List[str]]] = None, + num_images_per_prompt: Optional[int] = 1, + eta: Optional[float] = 0.0, + generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, + prompt_embeds: Optional[torch.FloatTensor] = None, + negative_prompt_embeds: Optional[torch.FloatTensor] = None, + output_type: Optional[str] = "pil", + return_dict: bool = True, + callback: Optional[Callable[[int, int, torch.FloatTensor], None]] = None, + callback_steps: Optional[int] = 1, + engine_graph: Optional[list] = [], + **kwargs, + ): + r""" + Function invoked when calling the pipeline for generation. + + Args: + prompt (`str` or `List[str]`, *optional*): + The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`. + instead. + image (`torch.FloatTensor` or `PIL.Image.Image`): + `Image`, or tensor representing an image batch, that will be used as the starting point for the + process. + strength (`float`, *optional*, defaults to 0.8): + Conceptually, indicates how much to transform the reference `image`. Must be between 0 and 1. `image` + will be used as a starting point, adding more noise to it the larger the `strength`. The number of + denoising steps depends on the amount of noise initially added. When `strength` is 1, added noise will + be maximum and the denoising process will run for the full number of iterations specified in + `num_inference_steps`. A value of 1, therefore, essentially ignores `image`. + num_inference_steps (`int`, *optional*, defaults to 50): + The number of denoising steps. More denoising steps usually lead to a higher quality image at the + expense of slower inference. This parameter will be modulated by `strength`. + guidance_scale (`float`, *optional*, defaults to 7.5): + Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598). + `guidance_scale` is defined as `w` of equation 2. of [Imagen + Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale > + 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, + usually at the expense of lower image quality. + negative_prompt (`str` or `List[str]`, *optional*): + The prompt or prompts not to guide the image generation. If not defined, one has to pass + `negative_prompt_embeds`. instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` + is less than `1`). + num_images_per_prompt (`int`, *optional*, defaults to 1): + The number of images to generate per prompt. + eta (`float`, *optional*, defaults to 0.0): + Corresponds to parameter eta (η) in the DDIM paper: https://arxiv.org/abs/2010.02502. Only applies to + [`schedulers.DDIMScheduler`], will be ignored for others. + generator (`torch.Generator`, *optional*): + One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html) + to make generation deterministic. + prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not + provided, text embeddings will be generated from `prompt` input argument. + negative_prompt_embeds (`torch.FloatTensor`, *optional*): + Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt + weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input + argument. + output_type (`str`, *optional*, defaults to `"pil"`): + The output format of the generate image. Choose between + [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` or `np.array`. + return_dict (`bool`, *optional*, defaults to `True`): + Whether or not to return a [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] instead of a + plain tuple. + callback (`Callable`, *optional*): + A function that will be called every `callback_steps` steps during inference. The function will be + called with the following arguments: `callback(step: int, timestep: int, latents: torch.FloatTensor)`. + callback_steps (`int`, *optional*, defaults to 1): + The frequency at which the `callback` function will be called. If not specified, the callback will be + called at every step. + Examples: + + Returns: + [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] or `tuple`: + [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] if `return_dict` is True, otherwise a `tuple. + When returning a tuple, the first element is a list with the generated images, and the second element is a + list of `bool`s denoting whether the corresponding generated image likely represents "not-safe-for-work" + (nsfw) content, according to the `safety_checker`. + """ + message = "Please use `image` instead of `init_image`." + init_image = deprecate("init_image", "0.13.0", message, take_from=kwargs) + image = init_image or image + + # 1. Check inputs. Raise error if not correct + self.check_inputs(prompt, strength, callback_steps, negative_prompt, prompt_embeds, negative_prompt_embeds) + + # 2. Define call parameters + batch_size = 1 if isinstance(prompt, str) else len(prompt) + device = self._execution_device + # here `guidance_scale` is defined analog to the guidance weight `w` of equation (2) + # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . `guidance_scale = 1` + # corresponds to doing no classifier free guidance. + do_classifier_free_guidance = guidance_scale > 1.0 + + # 3. Encode input prompt + prompt_embeds = self._encode_prompt( + engine_graph[0], + prompt, + device, + num_images_per_prompt, + do_classifier_free_guidance, + negative_prompt, + prompt_embeds=prompt_embeds, + negative_prompt_embeds=negative_prompt_embeds, + ) + + # 4. Preprocess image + image = preprocess(image) + + # 5. set timesteps + self.scheduler.set_timesteps(num_inference_steps, device=device) + timesteps, num_inference_steps = self.get_timesteps(num_inference_steps, strength, device) + latent_timestep = timesteps[:1].repeat(batch_size * num_images_per_prompt) + + # 6. Prepare latent variables + latents = self.prepare_latents( + image, latent_timestep, batch_size, num_images_per_prompt, prompt_embeds.dtype, device, generator + ) + + # 7. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline + extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) + + # 8. Denoising loop + num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order + with self.progress_bar(total=num_inference_steps) as progress_bar: + for i, t in enumerate(timesteps): + # expand the latents if we are doing classifier free guidance + latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents + latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) + + # Original Pytorch Diffuser Unet Code: predict the noise residual + # noise_pred = self.unet(latent_model_input, t, encoder_hidden_states=prompt_embeds).sample + + # The ITREX Unet Code + latent_model_input = latent_model_input.contiguous() + prompt_embeds = prompt_embeds.contiguous() + t_1d = torch.tensor([t], dtype=torch.float32).contiguous() + engine_output = engine_graph[1].inference([latent_model_input, t_1d, prompt_embeds]) + noise_pred = torch.from_numpy(engine_output['out_sample:0']) + + # perform guidance + if do_classifier_free_guidance: + noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) + noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) + + # compute the previous noisy sample x_t -> x_t-1 + latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample + + # call the callback, if provided + if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0): + progress_bar.update() + if callback is not None and i % callback_steps == 0: + callback(i, t, latents) + + # 9. Post-processing + image = self.decode_latents(latents, engine_graph[2]) + + # 10. Run safety checker + image, has_nsfw_concept = self.run_safety_checker(image, device, prompt_embeds.dtype) + + # 11. Convert to PIL + if output_type == "pil": + image = self.numpy_to_pil(image) + + if not return_dict: + return (image, has_nsfw_concept) + + return StableDiffusionPipelineOutput(images=image, nsfw_content_detected=has_nsfw_concept) + +def fp32_to_bf16(fp32_np): + assert(fp32_np.dtype==np.float32) + temp = copy.deepcopy(fp32_np) + int32_np = temp.view(dtype=np.int32) + int32_np = int32_np >> 16 + bf16_np = int32_np.astype(np.uint16) + return bf16_np + +def bf16_to_fp32(bf16_np): + assert(bf16_np.dtype==np.int16) + temp = copy.deepcopy(bf16_np) + int32_np = temp.astype(dtype=np.int32) + int32_np = int32_np << 16 + fp32_np = int32_np.view(np.float32) + return fp32_np diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_ir.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_ir.py new file mode 100644 index 00000000000..35cf29d247d --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_ir.py @@ -0,0 +1,311 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +from intel_extension_for_transformers.transformers.runtime.compile import compile, autocast + +text_encoder_pattern_config = { + 'pattern_switch': { + # General Pattern + 'PaddingSequence': False, + 'AttentionReshape': False, + 'QKVReshape': False, + 'ReshapeFusion': False, + 'InsertBF16Node': False, + 'OperatorAdaptor': False, + + # transpose_int8 + 'QKVMerge': False, + + # 'TextEncoder + 'TextEncoder_WordEmbedding': True, + 'TextEncoder_QReshape': True, + 'TextEncoder_KVReshape': True, + 'TextEncoder_AttentionMaskAddReshape': True, + 'TextEncoder_SoftmaxReshape': True, + 'TextEncoder_MulReshape': True, + 'TextEncoder_AttentionReshape': True, + 'TextEncoder_CasualAttentionMask': True, + + # for unet and vae decoder + 'GroupNorm': False, + + # vae decoder & Transformer2Dmodel + 'AttentionBlock_Resize2Gather': False, + 'AttentionBlock_QKVPreReshape': False, + 'AttentionBlock_AttentionMaskAddReshape': False, + 'AttentionBlock_ConstantOfShapeWithMul': False, + + 'Transformer2Dmodel_GetSampleBatch': False, + 'Transformer2Dmodel_SampleSlice': False, + 'Transformer2Dmodel_EncoderHiddenStatesReshape': False, + 'Transformer2Dmodel_ConstantOfShapeWithMul': False, + 'Transformer2Dmodel_QKVPreReshape': False, + 'Transformer2Dmodel_QKVReshape': False, + 'AttentionBlock_QKVReshape': False, + 'Transformer2Dmodel_QKVReshapeTo4D': False, + 'Transformer2Dmodel_AttentionMaskAddReshape': False, + 'Transformer2Dmodel_FFNInputSlice': False, + 'Transformer2Dmodel_FFNInputSlice_1': False, + 'Transformer2DModel_UpBlockResize': False, + + # for all stable diffusion models + 'StableDiffusion_bf16Convert': True, + 'StableDiffusion_ReshapeFusion': True, + + # MHA + 'TorchInsertBF16Node': False, + 'StableDiffusion_MHAReshape': True, + 'StableDiffusion_MHA': False, + 'ExplicitNHWCTransposeForConv': True, + 'ExplicitNHWCTransposeForConvQAT': False, + 'MultiHeadAttention': False, + + # Channel_last + 'ConvReshape': False + } +} + +unet_pattern_config = { + 'pattern_switch': { + # General Pattern + 'PaddingSequence': False, + 'AttentionReshape': False, + 'QKVReshape': False, + 'ReshapeFusion': False, + 'InsertBF16Node': False, + 'OperatorAdaptor': False, + + # transpose_int8 + 'QKVMerge': False, + + # 'TextEncoder + 'TextEncoder_WordEmbedding': False, + 'TextEncoder_QReshape': False, + 'TextEncoder_KVReshape': False, + 'TextEncoder_AttentionMaskAddReshape': False, + 'TextEncoder_SoftmaxReshape': False, + 'TextEncoder_MulReshape': False, + 'TextEncoder_AttentionReshape': False, + 'TextEncoder_CasualAttentionMask': False, + + # for unet and vae decoder + 'GroupNorm': True, + + # vae decoder & Transformer2Dmodel + 'AttentionBlock_Resize2Gather': True, + 'AttentionBlock_QKVPreReshape': True, + 'AttentionBlock_AttentionMaskAddReshape': True, + 'AttentionBlock_ConstantOfShapeWithMul': True, + + 'Transformer2Dmodel_GetSampleBatch': True, + 'Transformer2Dmodel_SampleSlice': True, + 'Transformer2Dmodel_EncoderHiddenStatesReshape': True, + 'Transformer2Dmodel_ConstantOfShapeWithMul': True, + 'Transformer2Dmodel_QKVPreReshape': True, + 'Transformer2Dmodel_QKVReshape': True, + 'AttentionBlock_QKVReshape': False, + 'Transformer2Dmodel_QKVReshapeTo4D': True, + 'Transformer2Dmodel_AttentionMaskAddReshape': True, + 'Transformer2Dmodel_FFNInputSlice': True, + 'Transformer2Dmodel_FFNInputSlice_1': True, + 'Transformer2DModel_UpBlockResize': True, + + # for all stable diffusion models + 'StableDiffusion_bf16Convert': True, + 'StableDiffusion_ReshapeFusion': True, + + # MHA + 'TorchInsertBF16Node': False, + 'StableDiffusion_MHAReshape': True, + 'StableDiffusion_MHA': False, + 'ExplicitNHWCTransposeForConv': True, + 'ExplicitNHWCTransposeForConvQAT': False, + 'MultiHeadAttention': False, + + # Channel_last + 'ConvReshape': False + } +} + +qat_unet_pattern_config = { + 'pattern_switch': { + # General Pattern + 'PaddingSequence': False, + 'AttentionReshape': False, + 'QKVReshape': False, + 'ReshapeFusion': False, + 'InsertBF16Node': False, + 'OperatorAdaptor': False, + + # transpose_int8 + 'QKVMerge': False, + + # 'TextEncoder + 'TextEncoder_WordEmbedding': False, + 'TextEncoder_QReshape': False, + 'TextEncoder_KVReshape': False, + 'TextEncoder_AttentionMaskAddReshape': False, + 'TextEncoder_SoftmaxReshape': False, + 'TextEncoder_MulReshape': False, + 'TextEncoder_AttentionReshape': False, + 'TextEncoder_CasualAttentionMask': False, + + # for unet and vae decoder + 'GroupNorm': True, + + # vae decoder & Transformer2Dmodel + 'AttentionBlock_Resize2Gather': True, + 'AttentionBlock_QKVPreReshape': True, + 'AttentionBlock_AttentionMaskAddReshape': True, + 'AttentionBlock_ConstantOfShapeWithMul': True, + + 'Transformer2Dmodel_GetSampleBatch': True, + 'Transformer2Dmodel_SampleSlice': True, + 'Transformer2Dmodel_EncoderHiddenStatesReshape': True, + 'Transformer2Dmodel_ConstantOfShapeWithMul': True, + 'Transformer2Dmodel_QKVPreReshape': True, + 'Transformer2Dmodel_QKVReshape': True, + 'AttentionBlock_QKVReshape': False, + 'Transformer2Dmodel_QKVReshapeTo4D': True, + 'Transformer2Dmodel_AttentionMaskAddReshape': True, + 'Transformer2Dmodel_FFNInputSlice': True, + 'Transformer2Dmodel_FFNInputSlice_1': True, + 'Transformer2DModel_UpBlockResize': True, + + # for all stable diffusion models + 'StableDiffusion_bf16Convert': True, + 'StableDiffusion_ReshapeFusion': True, + + # MHA + 'TorchInsertBF16Node': False, + 'StableDiffusion_MHAReshape': True, + 'StableDiffusion_MHA': True, + 'ExplicitNHWCTransposeForConv': False, + 'ExplicitNHWCTransposeForConvQAT': True, + 'MultiHeadAttention': False, + + # QAT for the stable diffusion + 'StableDiffusion_InsertQuantNode': True, + 'StableDiffusion_CollectQuantInfo': True, + 'CollectQuantInfo': False, + 'InsertQuantNode': False, + 'QuantizeFusion': False, + 'StableDiffusion_QuantizeFusion': True, + + # Channel_last + 'ConvReshape': False + } +} + +vae_decoder_pattern_config = { + 'pattern_switch': { + # General Pattern + 'PaddingSequence': False, + 'AttentionReshape': False, + 'QKVReshape': False, + 'ReshapeFusion': False, + 'InsertBF16Node': False, + 'OperatorAdaptor': False, + + # transpose_int8 + 'QKVMerge': False, + + # 'TextEncoder + 'TextEncoder_WordEmbedding': False, + 'TextEncoder_QReshape': False, + 'TextEncoder_KVReshape': False, + 'TextEncoder_AttentionMaskAddReshape': False, + 'TextEncoder_SoftmaxReshape': False, + 'TextEncoder_MulReshape': False, + 'TextEncoder_AttentionReshape': False, + 'TextEncoder_CasualAttentionMask': False, + + # for unet and vae decoder + 'GroupNorm': True, + + # vae decoder & Transformer2Dmodel + 'AttentionBlock_Resize2Gather': True, + 'AttentionBlock_QKVPreReshape': True, + 'AttentionBlock_AttentionMaskAddReshape': True, + 'AttentionBlock_ConstantOfShapeWithMul': True, + + 'Transformer2Dmodel_GetSampleBatch': True, + 'Transformer2Dmodel_SampleSlice': True, + 'Transformer2Dmodel_EncoderHiddenStatesReshape': True, + 'Transformer2Dmodel_ConstantOfShapeWithMul': True, + 'Transformer2Dmodel_QKVPreReshape': True, + 'Transformer2Dmodel_QKVReshape': True, + 'AttentionBlock_QKVReshape': True, + 'Transformer2Dmodel_QKVReshapeTo4D': False, + 'Transformer2Dmodel_AttentionMaskAddReshape': True, + 'Transformer2Dmodel_FFNInputSlice': True, + 'Transformer2Dmodel_FFNInputSlice_1': True, + 'Transformer2DModel_UpBlockResize': True, + + # for all stable diffusion models + 'StableDiffusion_bf16Convert': True, + 'StableDiffusion_ReshapeFusion': True, + + # MHA + 'TorchInsertBF16Node': False, + 'StableDiffusion_MHAReshape': True, + 'StableDiffusion_MHA': False, + 'ExplicitNHWCTransposeForConv': True, + 'ExplicitNHWCTransposeForConvQAT': False, + 'MultiHeadAttention': False, + + # Channel_last + 'ConvReshape': False + } +} + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("--onnx_model", default="./model", + type=str, help="onnx model path.") + parser.add_argument("--pattern_config", default="./", + type=str, help="pattern graph path.") + parser.add_argument("--output_path", default="./ir", + type=str, help="pattern graph path.") + parser.add_argument("--dtype", default="fp32", type=str) + args = parser.parse_args() + + if args.pattern_config == 'text_encoder': + args.pattern_config = text_encoder_pattern_config + if args.pattern_config == 'unet': + args.pattern_config = unet_pattern_config + if args.pattern_config == 'vae_decoder': + args.pattern_config = vae_decoder_pattern_config + + if args.dtype == "bf16": + args.pattern_config['pattern_switch']['StableDiffusion_MHA'] = True + with autocast(args.dtype): + graph = compile(args.onnx_model, args.pattern_config) + graph.save(args.output_path) + elif args.dtype == "dynamic_int8": + with autocast(args.dtype): + graph = compile(args.onnx_model, args.pattern_config) + graph.save(args.output_path) + elif args.dtype == "qat_int8": + args.pattern_config = qat_unet_pattern_config + with autocast(args.dtype): + graph = compile(args.onnx_model, args.pattern_config) + graph.save(args.output_path) + else: + graph = compile(args.onnx_model, args.pattern_config) + graph.save(args.output_path) diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_model.sh b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_model.sh new file mode 100644 index 00000000000..d6b74e204d9 --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_model.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +for var in "$@" + do + case $var in + --input_model=*) + input_model=$(echo $var |cut -f2 -d=) + ;; + --precision=*) + precision=$(echo $var |cut -f2 -d=) + ;; + --cast_type=*) + cast_type=$(echo $var |cut -f2 -d=) + ;; + esac + done + +if [[ ${cast_type} == 'dynamic_int8' ]]; then + echo "[INFO] cast_type is dynamic int8 and model will be dynamic quantized based on $precision" +# 1. text encoder +echo "[INFO] Text encoder ir will be $precision ..." +echo "[INFO] Start to export text encoder ir..." +python export_ir.py --onnx_model=${input_model}/text_encoder_fp32/model.onnx --pattern_config=text_encoder --output_path=./${precision}_${cast_type}_ir/text_encoder/ --dtype=${precision} + +# 2. unet +echo "[INFO] Start to export unet ir..." +python export_ir.py --onnx_model=${input_model}/unet_fp32/model.onnx --pattern_config=unet --output_path=./${precision}_${cast_type}_ir/unet/ --dtype=${cast_type} + +# 3. vae_decoder +echo "[INFO] start to export vae_decoder ir..." +python export_ir.py --onnx_model=${input_model}/vae_decoder_fp32/model.onnx --pattern_config=vae_decoder --output_path=./${precision}_${cast_type}_ir/vae_decoder/ --dtype=${cast_type} +exit +fi + +if [[ ${precision} == 'qat_int8' ]]; then +cast_type=qat_int8 +echo "[INFO] cast_type is qat int8" +# 1. text encoder +echo "[INFO] Start to export text encoder bf16 ir..." +python export_ir.py --onnx_model=${input_model}/text_encoder_bf16/model.onnx --pattern_config=text_encoder --output_path=./${cast_type}_ir/text_encoder/ --dtype=bf16 + +# 2. unet +echo "[INFO] Start to export unet qat int8 ir..." +python export_ir.py --onnx_model=${input_model}/unet_${cast_type}/model.onnx --pattern_config=unet --output_path=./${cast_type}_ir/unet/ --dtype=${cast_type} + +# 3. vae_decoder +echo "[INFO] start to export vae_decoder bf16 ir..." +python export_ir.py --onnx_model=${input_model}/vae_decoder_bf16/model.onnx --pattern_config=vae_decoder --output_path=./${cast_type}_ir/vae_decoder/ --dtype=bf16 +exit +fi + +# 1. text encoder +echo "[INFO] Start to export text encoder ir..." +python export_ir.py --onnx_model=${input_model}/text_encoder_${precision}/model.onnx --pattern_config=text_encoder --output_path=./${precision}_ir/text_encoder/ --dtype=${precision} + +# 2. unet +echo "[INFO] Start to export unet ir..." +python export_ir.py --onnx_model=${input_model}/unet_${precision}/model.onnx --pattern_config=unet --output_path=./${precision}_ir/unet/ --dtype=${precision} + +# 3. vae_decoder +echo "[INFO] start to export vae_decoder ir..." +python export_ir.py --onnx_model=${input_model}/vae_decoder_${precision}/model.onnx --pattern_config=vae_decoder --output_path=./${precision}_ir/vae_decoder/ --dtype=${precision} diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse.png b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse.png new file mode 100644 index 0000000000000000000000000000000000000000..0374ac3d663fc49e2d6b466389fc7bbcf16b9a58 GIT binary patch literal 464344 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

})kM-T+U8^qISVJ<6W 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%0DRe-8
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
z
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
  • -kAG{SyxJ~uLlMiN?IOs0h+d8}GFEwWm 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᜸KnqSwE+8sX#GBWvE0N(6JZXM0) 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 V$2*qBD+~f2EAwk+4W_pf{s*F)NGbpT literal 0 HcmV?d00001 diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse_from_engine_1.png b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse_from_engine_1.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5cbb6a0b549c72b0e0cbcf65d647863c356e3b GIT binary patch literal 256718 zcmV(wKs`%roVyy4rg?t{dZfFf$lnW-yq6p#eouqLvI9O4{WHgWQeXKNJdy zu^S;OB(5Y%T!}%6L2?OzfJg!Y2|vJi*JHY;d)jw(RhKvKRXzKedo$1eac^dxlbQGX zUN^9t-Sxg}(wsbb&hMPG7yr|L=TnMmvIvMs1PDaH0s&z63*;YVLz@uWe=eO17}60? zJ`a?42t-lg$o{oOV4E}gw8V1jDJLO(;agnz_U%MUN=11Ap_Y#Fj%}1BG3GJPqh(Bv zww_d(I0V$@!g<<7AZU4x)H1)NvTY6W^@1eff?6bXT+}X1o-m1tfeCLvAUb(VGmcB^ zqcD}mcNQYXcdTM{qim!lnPmfJa(El;I{-caqdX^sveg(pAwv9+(<{V1PMFXpm18;O zlGCwxwMx(@$>v<)L0{OZSGns;}`>ff$0q|;{d@!BmrV% zQHk2T5daKXobML^q)-7OSu3hd#PK@r7=&m^O(MG6*7t}H4wJc2z}QM6BDE9{fC7a` z1nm=rh=}Ma+3BgPY7oG-n22gjE<6q50+_5W(E`k5n8)1($rt%t1kU~)SRFC&H5Vvb z9QV$YeB^k+uu=Jp2na%h0D1Nk1aDf1GkGBlMWfLDrA}nF!r)$@s(3|$zTUz;*hfr2S1atm#Zg882#Wg!LR2Y!lGZLFLXw!*m0aMUkLa`FQbt~k zd1W!ME+QpZ69@<-q9EgIYy||ouqQ|zba>Y>DJxDASF|(Aye{Fb2c8zcfCO8FYmqS3 z6U?&i!&LDgrjy8%;iZw0(K>Mm3IGtP0I#$N;g*G4a#|&j-Ca<ClhNg6Sh2c3pkRkfoybM(lXvggyo~VSH#2? z!tfVwY^F;|Y5i69n3Q)oQc4M(`Sn?{rpP3VAS3kxWby^1W@u|gh2$efhtuUqRikW# z0mO(G(vmsRLP~W?=G>vNOG8A+>41n|{W|4o^MjxKVM1KjUv3|;j57_4@`h`>ca-vS zkuwdfLHU@8Zx9cp2v7uA1cyYvMo#2?6*#{H*Jay)jOo=q(NSV0@wx|k007WCkR*}^ zzmf|{=T}gNQcg;|yhTO`@@ys6c|rhCIfY59pFHMn0x}lFGK->iZ499?3|t&d#9CBR zcR=*-5veS)cD4Y$;}+b8?tQ>SPhEeeEJc>sl-bO$$wcXy?I9=AedT0cWEmI~zY|O^ zpB{xda3%MhFm{={7=ccXwz<(O$N7+)$umblj~x`HPb-tDJAWUpBkhjT@WMswaAlSz ziLrublvgYvtkhweP!b4Z4B(`MkxHSwE&`DxHR*MQ0@Hw^y@l$zJ{qtmi*ZIIbOmF= zbOg+BCrcZo%@o+}WF{0=VANLV%w$);u6W?{fn0RDQGiYkQDUATT1x5?@$CoV$j3d$M23T& zup)xgFuaU4fq2Ks5ulP%x>W?|dkdk?{lsM8J8du5iO#nphODGch6+k^6}1EA@=iTV zW{kNI^jkNUmuo8U4kQz*4%t)W_msN9Yu5@KW^ygw7Dt}Ktbxo2L=#8+O=2mzC; zE*|oCnTn_VA`*A5saw4E`V_=USSt!uEckm@N21_1AcFe& zo*-`umJ*%w$t(af^U-Lb_g7sFI(EhK&4_XRO6f_Y@t9J3Odv*7sB35(ltW6%75aaE zRTZ%ww5w2;#Pf;yG!Y0yA?`3!)WD&FZPCsXU;>DI%pZi%an#^lQJKFNpN{-6!rc$? z;Oia?Kj*uy5f>IgrDB2A_lMFG{oo4v_r0gweM8gd|e&*g0Fpnwh-j2oMj&aFV1e zBiG3=rRf^NJ#hmlu}Uso4U=%AV{9NX@9xP~l{w^|AUB#>WMA9y-w-!bO7=DLu)?jQq$58o|9qUqn`nRUEk}g* z9^iv)CLU>YNi4%m5b_wyGzE%yvjogU0!r2cCRqoFkuO_GbS4@Ii!N6H=1sO%AkkF- zV3>+&!!hZP5re%zz|b{q|E7R0NoE#4R%i*z*ww~ar!FBysN@Qj-CW+SB4AkUNbwi0 zirFAo#~BjjhyW7~anN$A&t=iOlqiLw{ljc3`Phs@&PQ3~WI5VAu1hTQOzWw1%TPYj z<$aG(IZ2fygwy7#AKUPZVGXYsL%8I5M4-5U3?nioD1Fzy&nR-FN7&XtOa$e?gXG!; zo?}#YBsC1TB;_YsB~)VfA2G}Thp@pC z2EjQ%Cnr%`j2|XrM|}fi%mnb31z`5cS*WxXy!+GD0iB1)tQZ4wPID+tm?}X-Xe2(| zny*D$km|(6EyGS@F=S@HEjqW!iX??>;no}x@h)|SvRIA6@+bb*F%CMlK#shv6NE|S z5m0VJ>kx)TWkktkqE4qU+zSMD$)s>g&o>i@QwQX&R_nP_OD)DcV+Id%eYjR}SoVv^ zVB$la-|ZGigpLcvN%$MD2MCb?bkXIb6gp$Sl}%4)#9W3rZy_ucMT!j`u`~(UY+%tX z9w5h-HWT#kG8`6e2~+0|4TTNiR#u=@)}@~Z3^%a*&Wx2 z2?<$$&w~y(BQeM065=`{fLn_Jj6ZDp(3MLeQ43Vp?=m2m+e&e8OvCD4n-P zkr$E1@#Y}YxNfWv+?ZEt<)X65r*iu3AypV6iT*x~bWifSlyT0IHd0=CLKS!peZ#;m zBPR{vLCo>I@WJLffVrf)%vbiq; zFJDG9z!!2O3`pi&w_KwHI;4xhg;ClOHsQf=BCbg2SqU)rwxl1+kk>6ksw1i&yFAr` zfV3;o6Qs`b6_f#5L)@THav5W+wVB*gn&U`)>7zS_3V@>Nq|nD1igno333m|SltYO^ zNWqGhs)i!m6Q}r`tSmAnrD8l@$E(P6j?>)Xc@ZMEKVnU>YYO)pR~n@*1p3{8aZJ1; z24y4nzy(CKh?0rI?rLIb7|WfiVC$IYgqi@5u^&XrOz3Y5imp80-_~rNw^w~g9E68i zfWE9eqU7R5iStfz&eTP8EGb-2AWn%$QhG?{`65J;zzk)qxzdeEE8vJ>=;0SZ2<-8^ z2{^|y6Z3~@(G)8S#dM_TP4a@LK-M`bD8;Uebfm3+e`)Z6liO27xAUnKZ+ZUm|St%dP8R1(&f{RwEY6jTYWvYn2y51D#(3n#YDNxSMIHx zUCCfSwy)9YnW-s1904r!-gc>gGqFjZ6g5(5E#s0 z_hgySh$0qHDXK=H@sXhLkj(H4#S+Reu zgAgn1K>2f}B3bYO=}TY9SdL=R>B!9xU`~`$sCNc5Dl@4<+{2eS$z;i^T*jF=89G1! zM|eS5RCP#@ohX5A}t7c z1IOuFmMA-6*-wP8gj{8tA9PG|lYQ%+vNFimmJt!uSHD!JB2163mv=h+LniaFwD%eb z-pHbEv1gbqF?r_j+C7kaDg;GdO{23XOgcJ(^Gra@6hxmj?i(s1b8atekar8Sp)V5CL1gge)<`-{BFJtt z?YABWHg3zZ>=)kU9*oZ;fKwjjL{xt?6jQJTLMbYk|KZO3QQOld*aJmmgOU-#o5fE>`ZX| zSon_Z=i)iq_7GoXDzX-Ne1?NQ51;8$He@PHze^Mnr!8G(XzTYntE~@VW)1Z(pPm=L@8uA-NWG$%Im&h!d0TVhBZz)F!nnoWO4Q4Ewkn zbIw5*pP=(^S>4-d8ics6Q5gu?da+opz2Y6Sm|lAYhzxQrOHA5fxf-)Oe@Ksbn=$@= ze|o_PVqikx*~G>qyhMxIB$SEaF(zT5MKcJVsm`Jnl6n$*=CYW3ajm5^M0@CjwaAe#iD3VN$VYBTDq)#hjGrLOwLjL< z;5=>b6ts0?(#&+p9n;mlK?D*XgrTUpl56bj0zW7?A;#Ma1n%lbZIBI#Rwf0ANu6ko zlPlW&O?_90r7hU9nDsd#7PlyP@IQ#cbK(fXBw^pu!PpKgu^`y{Y$1b1zHBi_K28GZ z@=?b1?ZFL_O?MuW=nd4D=|fae_q%! z2Ql?mioBRp;4?dzI$)8vSS){MEd(-0{_A4fpQ#}-&CQyUr45jIi?Kw@+}YM`k0d<| z^k0SXn6?O`os_5Q$z&MAB05%W(Z`^WFoW6|4`dNt%ej}Vfm$3|pwIb-z%0E#xDe<7 z{*sX5NRPyrWEYXb(Q_2DJW%3)m#Q$bzi@DFgqrn%V_M8oW+Vu6{0Nji%x*h;T zw4$4l1}Bfw8H=Psbml@)y|wYc5jZ2^MOHA3`ZH26N=P9-_nCraW2wBGWp^ns@s*HO#rud(^#x6sN!?dCKL?1Cb5@;f#5yR?i}t0a^rjV+vLXzG z$daRAh#W+dAbJ(oFURA&S%}3>u6K^&A;WZJd{1n9kekkCl7HbT46b{6b_64Yl+Z3i1we>I1%DwOPdOTa7&+Tu{Eu)LIjLoC~Cq83U;v4R@WQ;^EEk~||PrV5vK#nTn z*3Th!QtcO5xND9r(GF?NW7OanilhRO+n0PFZ`~c zg3-x{jto7zhbheo@$C(XM$IJPN*HG>#YbSm0ZgxtDGPRnKEap>lcZR3ln6Mx6z2{e z(wrn^dAkN2`IhF`wO=nf1lU2>ClBnBJ4*!fP&nZI-#uaN>v_lwTa0m;0me|ekdYwM z+2X<-LOAcmPm~?R2rzWy5&f?E0PP}HP%$Zko>SSg)Ow_$k3wGoXSfeAngNn?qDT*x z`LIa!{BetEK_UY_+r#}Y>0c}=xkvS~o-Solge8ihs;(_!q{{LrKqNo-8=~c295fbV zmK3XieZ-CeVBT(aNFbMKASW?yE;j;q6olX5Ore#6es-=}$deUGJiE{prZ5NWk(9vz z*V_X?Is~loH3$mSObgc)9tUa}Rv-ptrF+ z=IxCDm_S{e>jEYT6B|DQ-;i0#Q=M^wzz_r(%JfW<_tq;=74PPYhKnc^oew=??4pZh z{GReqbh40$truI;*qOkW(?rFheBxXuMrXc&19cih-N+p*M8KP?Yp6_Kp05019kP&q ziCK`&DHg>e{83bC3o(w7{*7Gx+)s{H%0v*)1R}W38ds<8{NAOY&#Tt^6dCt(Sb#jT zf5bkp7WAXDoUOCT#S5d%{8i4y2}JRjA*WWdihuyIP;_Ht-O3@yS}v0QtP|FwZ(aYC zKqhl2Pg_hrWZ<@>OX8(Db2W`t%`DS0Zylm@#txP`ju4^w((QxGKUl#n{ z89+r_H~<_IV<$T59(B*KlXjm;%>T$v#CfFC(%`ixi%8K7Ay3UpNWqk!Wz)ABS`s4j zXHRnomHje9oO2*Mc4P?JiT4GKbwDA`%Ee+=gprmpwmu_F+BQv}BZ;dacgka#>DK~Y zw#(Buxa&bI_-+cPmZVB$Li#k{;2AR-E+Yfy(G|lw9T6c*NyO8f>B+zY0wPhth9lhw zWljMD+uhPP@`8YlX6~HDE+P3po)9OBuK8Uyi;+5zx??Bs32*t{>1X+3F&mcR}&T`l_uABn1nCPOYx*j zs28Os){i~S8LdQ+8K$s;Lz7~AZtcRcB-TM-kQl#Pm@@M556DvpjB@;l#)$ghBm-Xu z2-xwWNTFoWm;!KiLVR=)h6+SI)RFu^t4|X6USu$<99q(Op~mT+b|g0NJ@>=qR=tI zK_~G>Wh{#|FER4MnB|j*nq-b~$QX{CmS);(0neRpBr+1O`%-$95P&I;D__Loegn2B z2?6iN2o7eAiPve8QpK3N$Sdy)@s>GYE+{`3K=f<6@q+#Z5yAFj^rmMpyB{bI7`$af zPq@I~MK~g-vELpEZYQuyD3^IA-_(MH4AxB``7py1U!i0Qu|^T>zACKVADiEo0rt#R|_Eo*04 z+SDw(9VFng#QlkkV3WT}vRLAnvL~rwcw4y72@DsBq_uk)<9wMcBZLv`6mL~bcxZ;e zBXSxVB4T)mo{YS&!}LY;7{$s4V3SJT%WW;&JM6lF%cTq52Vnwec;`}N-u@F_3Imon zc2sMZEXKspY8ZOP$!uQs5i5%?~)9}b!U5daBUm(4BQpQal(DynbQkH#w`1a$n&&QL~|;Y zn9b#d@}7r)o-}ggAZ0OEW}b7RvMk9#OE#b0;H`G10sRdzlt@9fkFqqQW#OQf0G%Mc zy=HTID>p<=$>R7i2#&5L?wqXKF4swGT@a;k+-`*89m&@!Y0NgFiw=w zv_5W2El)Pk{b>g$V+X~q17s(&$_<1vmz{e~S;`PPM@Am9%&C@^!MmFnm?=n-kejq) z?lHGW@y}=(#^)}iz5}}0!xrw>n?1hw)V3oT_)pG;u zNl8j@dYfDGkfWW_7vXtY5(F=rw&Cw}HJ6g)CTU95zXbhv6cpiA+cOl)0a@G)~+J zK|VGXe~BY*ZDhIhkjrCb6eS{;`d)(5L=KF(2}kI!J=W1{8sE zob+#f@H_ajV&d^^`Kln_t#+y(w>={vDk{~Dx62imv=6HQglq*vRfPCm%efUiQ7^`& zOz}h_Z&<*&xCU+Rg1_WPyh-HKg8}{rBBVi-nUf?c)%ZUSw zf3*w=Si~^W7;2g(ca=-%PAk$UEKw@zSSnmr}ay^Fh!WV*|uxW>fn=2V2IJjUy~o9EHhm z;6g%G&qxkQ3bT=uLFpdiktOBAmfQH!u`g6AF%NRfRI z#eqAXvBj+M3|x;GFbz@4j-}x@3 zA}FX#%8EeA`UuOHktkUj7~x?d8Sx~Uw}==Z55-GHBKYc%NDl0RHxsf3isT0~EX_5W z&@NX3#c@(A5h#EN#30R)zhm2O+IwR44VBBcQ$jfzy21U_t z>#?#(St-kimLpY4Qg0QdO0#V#NfUBi!(4<+Ao(X3A+m!!X+T%6N+~tK+3fGxg&$pI zGIgMkMMPv}3*pNTvgXLmKalUxW$2+R&b}Qiy!dBZ5KV|(9HSRsUREnZ^4sGA#%7UyI{z^6w5Hfs^pqz4u{!edIMEOMkwGjLS& z$ak*PsJ2N@lOT+uVzNb_Sw-eh5`QTor*6Ul%wjG=Yb0dhzI#fPCRpasv1kjmDzrpf zIwd9KL^p@U$;eZDm-|3^=t^Qc1k`@S!8J?dytIF0#fi8B1fs&>Me5%;0+QN!H9H{8 ziE=^-VWA;mxAEIm0KGk1+J=&hz&h#^N?DIM3Nvw0wz+(gk`K-iCJdQg5yo*A<@^pb z3qiQPlmNL)kIel}%FCmt3;rBGY0g{eku--dsQ~MabtUu3%icQWMy9fXWcfY?$@>7T z&g|y%cTaoTKorq;=S3%PxuV;giB0R!4>hfdMWwNWA>95B=N>IEUYUEL1ER%JIm%`$ z3{P(?FBW1`5dhayDdA}&AH=+h~ z(R}xT@jh%h@@^UW$e}>CZ+J0lGQ)EWxg^dk63duv7{3n%=D}Mq8Jx2d&tvj4yE3Yj zXiuw;2_9w$NX@6n$9LdzFxPzpRTSf_6!-U{KaeG)FNpPjfi~$+#xm{fR?eGq^-MDj z8ye&m%;3Z#0FmvEh$+0!Ea$*Nevt%8$?XlUYMBK#>50}+c)Pe0XAM%~96cz6GS)e% zF7Jej&U$$r5PL`>Md$68Q_;MZ1%>iWm186Mc^z3^Z|-cqzOUA7N{DhhF7jzQ`Ay?8 zrZ6<@=;Y81;h{5@`AQ*VnA}^NaIm>7Hm9Y%bz2ev9bhI-oL_IW=&N(@tZ2ui7y}dT zM%f+AML6hs-nKEKW(_xaOwSyCnabo6^v@O1lT5_+#7gtwkeNM78i-qWT=YTAj9&gci!ieG2I`q5Q=yUr(l$Q7`1Rlnc4(iDzce&)H}Pt(-GFwAgq+$Dj!t3l035My2gnkWW67er*j6R+2Iw4l!|2| z)hg0%p9~@F{t9x#36KpI7n#(PK?-CpS-#SSh>G=w%)7jy@wsN;fYZZYCly;xkBb;E zF`jIYBt#pEf{sM-QL;Q}GK$uXieiEv^d}`oR6q0!1Z&#zI?PLHiYkyk$v~`!IvLqB zD3^cU?)f@qS-qIbUP~&wh_2~dj0qYm6bE=;A>$}52~tfl8vgO7iy7;j>akYufHo<{ z7ZkvIkrKxR#4(AJ7NYdvWx$W@BEC)^u-gdcL|6KZ{$#FT^jwv4#6`=-x=k$UD12|= z#j%V91z8SyiWuHTh`$h|q5^X?^613=W`Z-2Q4E5FN07E*TNR3rO@qaplW}-c$!ad= z{((b}$xU-xZs1SwRsO*?fYqHWYrNnWqIdH~So8<@Z!`S;^vGaOv8{kqUxo zn*p1&1<}hp=vZsEGI2BX>gZB1Jz&9Uqf+#nmKvp5Tzt|C)36bnV} zQCaMsqQ}m2?@HiiT@F2ZpdTb)ZE?iD}#ttHo_|mNx&_<=km$Ck-RJB(IdmA1)w8tBjoe5L>LK)C?!aE zOM9xKkhFd*?2+m4$`(tbOb{EK!~nS;FPpBBI{ZfWbzw#!TgZh-qVK?^Bq31}5>+?g zu`AqbO{OKtErSPg9(wSP+e<|9X92MV^Sq_d=O>gZ$WjJG;^B*=)qKS4Q(v#B;<;o= zzQS>#xE>wUCORX_@AETU2@cN#nWC;Kd433*&zJ^n;R7}C)N{1Qa&f?n)O2OMlMtj{ zJ_@-ay9QRzzVd^p^%N+DChg>-Y+<&cC?}1J>dl;T1mJiW&WaD^cTJx`@IC?)7~zM= z%ZYR3CQ&v&FW%R>y-W1o*$D4$ba$Nqx$MdHG~&i{jFnsu9FC1v6e%W`otn}vjfuPi zl6nd3HYfzAv(q1rAGyi`*7{*4uGi<_V*l)7Y1P`Xbk`(g$*%svFBMZ6Ov*;1jC|y%0HIR63q$e7FvZaeta4L zEc_lt6e2MUjo%OXarr(1<{H=Yjr(9I^-9jQG!z1Hrxy_3xU|%Ed5o@ z38)vESTh$U^zWR2H(W==B}pM)6~ znjH({b?S=;X`Q6VuxgRVg-)Yl!=C3+_mDTBkdqkOdSoENatAD!PZGAJ#AZfHNm^Ev z87+$Id**zgAw-p&Cy+4A0Yf%drap0oY`sX9T@ur&ol6t-AtE=D;AZ0x+RidC9c>*f zKKa$X$Iy(vKnk^DXx)AnAn1@AM(C2Twd9@y0OXct05M~OjBOoOp~n?~c0ZD6l5n(s zr(Z-}AJx?joIwd2f6$Y`xDfcsdlMA+=j^ge+5zr-DhXTRG??6QSD)jDWV= z_5~hv*-}=SpkYATUaRp-dC) zB}^?{oN>5ID~saNH$bo$K}RV`nK51qh~ddnGTB0#Oro5q_m$&;iVsobGDvKHsCxH6 zx~|J~l^F}pbzZ4-&44S;ok4`*G4rQeDddKq8QoaA*+y#D1L1v{?&A=C*e=Wh5rQJJ z3WI~%#`Mb4rf*TK-RrM{KDp(M4&vLzeuBrH8Sst+(;lu-fShIQ+}a?GY5P-1z;C0t znMWxXmj*8JEE$QP)`1hubBVpKM>w2OM~9N+G(Sb@cmRyQ&WnD}=0fg~%IdVLCWVgw?*j73p`$Yrzcy>}5}kj^6Bex6>64ZE>R|m!@aK3@;e7;h`9kAHY@5o*MencrWoPZX zuA?7Od|>r-t_pKPBrQEn)QWI)k|v*2UnoEef-t=3Tx4#+Go3ufVDEcz1Hdl5{RH7a zGoA&8GM`idSw~LGa|?iI#l)gQu&kTM8rq*o;#3F0&l_|LS2A8oI_B${>-%83!2OQJw-rkDPDFI(a2k4fozNO5KyizZ%`5Jv#KOBgbkXIa zv(D0_)*z-d)U`a7>l} zNC6O#LbM2EiP`~O14_H8O4~aA78N2QDkMvm2vGU8qt3c@1xnq)(AkLWm1IuJHRnh( z8KXE(n#%pO)briZp5q}Za`r81OPMS~!ctIj)9V;_dvi(pN{Jsj!S$0$T-Q5aE6yX9 zuNcZPQ(K`zeD#;CMc{7Hr@;tJS|Dm2aSpG{JCd`5hZI*Bz5G?CNwQFtx$hrx$ftGO zTR0LGz&S50ZI8-JK*yo@JZ))&!|q49WZO$Wh2Com9Qmafv8|C3bdb|29Ooc(trEnQKnc}=~U`0Ghs49~~0zgFT zhh;kJXxisUL|P$PTOb%~ttHd|sI0X_s+-Lv0<=mgL;_F*WWjZ^FpLcZZ;5-Go)XUj z$-R`dqJ}M8QXI!~DAMXEd1!b(-kf#TnX-FfXBoPFDVw$D91gx*Pu0+SwrtyieD@~` zEm__1G9*|80Bl&sSIa~0a&Qyy$e75z78V1+Z9hh!ZWWLcS#c@lB8=euSNATv1sM8I zk(SJqdJsKF$q)I8naP9g36GjLCc(!^9%kao-;8NZswjoji(*ehV$_h`Z&<3$o#*&v zuF0c&seKs%UwlqA1Bsp}y)7aM=O{r@q%}*AQBlwAZx%Xg@}OG5+Yi%h-PlAB{Q4NYqGkk0JH)H00p5|T4`nK zrYH-tRuu{f$bwScejlQC4#N@Ydh~(bMcj;R0!BX_8-hm|ouS3!M)pu(da7PhG6E)q z(QZ~mkL5ynfxw!Iw;87_tkQ<;cyU@l9t}lp;~PJq(f-LSk51IKOG+5O3)OMZn?V9L zan!{|0KXBey`vB*q6f3)B(k>sA&5mnd1&Gu!=DfD$RtZ}<^(zMSiJI{gK?KZdXR}{ zidZe~n+FImb=cj&w`&YP(dWi(h0Q|Y$;7RYLpPEYkdK**6f-CZQQ5f|nR3HpM+j?* zR%uea001{*ni-@#P#|Cm$;S>4M1TJc0=QXQXu+M^R6cg#8VB73uuC66*ph9>b^xrU z3UxyOjX?#_m^s?USW zCGwOn;QBJHi&tyOtlkzXB#x%M?eQae^6Gp9k;pH5PV4Kq+=&RqhEe!6ei2s7K=y`T z2_quKlNA`(%Qr8E-|Qh_X&usM;0h3ek{NiV(n1Qz*0uO>IDxvwAkQ^Zmv&m0me? zbnVdL+m0Py9gVBOkmhEzvbs`@21P|=XVb~f_U3f^=4?9I+`4Wib8DNT&{`|woLHqa zB3Rq45kdz+4!oET<2`9gc;IU)!GOsPCJ$N00-RIR!V;%~oDY%2cDDr4$Xh^iH|pxB zimW1ngvp4kOyQK&Szh(RN&k4Qm`>^F2CkwJPzCf~23mX>TxVd=e-D61VaqTg89%5M zAa?!-Tf4}uVnT3u#@?o!jDQflJxtXxuKp4(E#_apg_6_V637HcLs$n0AZ_DNLH)c2MU10_F+%?WzlCNa`_~h4CiK8^7?LH~P|7y{E?47JD0p!oohg}P#N?E| zXjyNdBd$f;u3?84UlrIX0RjLhZ0COv0F4H)1O*zjc0M=da5$aJZ|%*mZf;j=hwpge zy$`?Vv17+hu8c+}kDVH-0u-*4#c))CHCtQT8&|Hs_|kJPzw(Nm&(}sP>#HZq!QOOl zXSzSBG&H6j3@W9t?b>(i)!VXz2}cM{e9X7N^N4p@O=|Hqwv-N`Fhr8C<>owDP_9wA z9J2vn22s+>W34Bt%X+nPfnEI8lZRbhmaUEV%jcsWSA6Enf*jZt-%%))Hv&`9V!Rnc z#aas{CV{#9$9T$gjAZMi0OTZw|BY4>cL}Ac1!IYBgeP%aP7nUivggi#S(&u4P zUPcv6Mi!&ob7C0o@+))_XD6#(i>nf4NIg}{m7Q?R4Y>4D$WluB@>FL?=<&HSmwDNi zsai-O=Gt%p=I+E|SwMp51Gb$zAC0^@&2mE-Os4&ws<2!duwB64xs*sq3cwO6Y=?iy zpe95Zlugsz+^%20cx&F&C+~Rhlb`zBlOOuXJ@?&J4hMEV*Scutvz?vYrry1L_2T!w z{`E6w-}vr#e(=`$i|V50~e4` zT$Vy13f$j}1GR>dVOE68?N#LPATwhuHbEb+-qzSV2T&*ee3P=z)S&Q zbzF?@eYMH7QSY62))A1Nb0swe;}^NS9XHwd35Dt`!2#^YegvHE4Gu79&_OEWwiowwj zedxzN{@E`){+=gBD{G{|%uH1dvDv?J`P}Pg&R%%){0q;&`1L>j+KpS+u3x-rfe>JI zR47&K?a#E%HeC3B@cqPo<;<*0WTC~CYY z@N=NRBSB6zxY_YBSpy)j1u8BgTLmQP4yX8Z(%$kY#s)sGz^H@ZoaeCLMOeZ^o`kh$ z4C~l+L6-$Kg+fXBZok_Bi18*P>T!rmW>>&BM%q|BSt{`)HBg$xUYn66dSM^{K9$Wm z?u@lZDzUc-IXxt0ASAX_%T zdHt0i{Qj4|{lg!<@Ybtm&c1T?+NEp5!EkkDKs7b>8~}1ajlUagz?5Zys7hn!)}Ft- z^W7i5@RJ|=TrpqPSgoZR1V>mlK) zl}scma_@a#0l;-nP;|>WS&1!?+)LaWBs3X$}n zD98J|)AO72tDAdA*G_%mGavo&AOF;S?|OLU&|p@BK~S|(Xpr_^eEGTG`!~Py8^7_# zSI)m_=Toru@Zn;0T-jOEpxr|Rpi(QPQGwE+wJz&s_UapN9Y6NMCqDM!^&`hOuUxJM zMS-P-#-C8%t~zyWY5jNQndJMOoiZj;)}A&8?j#}#i3DpsbmT&&tLb>ppeCGM87qEg zuD~goKr9DH0->Bn`Myh%X;e>Mm;QJXSr0IQ_9rwjxzhW1%>8h8xK?N#0)(P%{+96U zmiYx{%5xqBCtOb>tCHSZ@?-#?CUr+!Wn6=hLuk!hBgRQ$@#R+w;`Y3DHe```BUS^s z?E-ov3VZr>85%+vJTrH)LT5AM(sL0K4}S0y zpZU~h9)9?-6L*~|3SHMg)&dzK1GsOmY}`w_B^nonVe=3%bwG-fYjtJC+bY> zl6S2Og_&~=eT+aZRYD*!`h@LmptFx9?21dr!VqyPITt0+&$+e0RZF;) zfvWI=SOQ@Lh+`QCaal>>PcoG1R{#Q(@F0!YC?-V8}|LAE{97Ef|+RgQ^+Ps7{H-TFU%;)$aCq9EpeWh6{4 zGPLI(N8rEwbKgQk5*8;#1<}LoyaGD$U}*6p`{9t% zrHJgD$Ydu}rU)nv5NO*xp>_0({rox6ORI3OF7P_xASY7OJY8%xB7CNp_%N zSdg)3tOX=h>Z()*X;_R`$AjJ7?e9PPgA+%O-G1AN{k;t&vc`}#s9P~m@^nYfJ#t?T zac=|K5%7h;u3NZd;KwWp6BS8l zf5^aoyhSdWw(Hb|17oi>I!M7N|2m`XH|u*eb9M1^G_Bo71SmLgv+^-v2*VDSA3=N$ zx~%<@isb9t>0KXZM2bL;JV~&-a;nK>)L9(&k?l;bsmuUouX-vFsBkU|b#1}Dr1qy> zppaPv!6Nk*;UY0)^ePyPAMt9Wd%`j~O2bXr_T>*V+wbG3%UW|ui298b9=2EFdAJE$ z$AKHdi6_y>80#H#-C|h=566L!pIh{+DTxTkB4`9uYCdm(EL6ql$k7Wgp1Xcy_SsK- z?(;wY@0@t(-f93%0|o#M=mIP?#?-TVYWJrX&%E)>x1M?Bg;(v~OanFmlldGG=5u3e zOGFx=(5MkfsRF58%RyR^X{t((tBQ;*^vcbxo$vhMJD>T9pQ?uAom)2sWmQ#`v4$wj z`Lg9w?QjL30Sq-qUvY-8Eh8{KuLOBQ=1~AZMpl?9XOoSw50HPxsF7yf1FTrz%Tsfu zBTNQaki|vmzO)78g`Op2RJZD%(WE}jVL&9uJ%z)F{N7nb@cQpF!KfgA%m9(!2-aEN zbfHg1cZFGFc6x!DCtaUT{scI;ms#{rQ)gnNMu`3Nou&|HE1MtV_tU-Yv;B066%^$vWqbLZdtn}V=Mq1Yf3L;&o z3YFGSXhlRwmQX1G3#O{7vQ(-6KmtT9~6CeBdY`SObnTCP2fM@{}G0BN5 z7LUmC%@V>4sxG0F%ofL!o6LDcp;*@%egM*+iNmoOxr@Sm+$4mi=?lza2`iMu%V<`= z%wc+yNFj-NFJVz5(qu|DIGeMi>{2Xbh~2l)$15cG0`JxdNbh4L10{ZHx;Nymc%jrz z+AxL}QIo{!>}kmbEtiYc8<-^ZgOk8s0%qDgVzN^^F-{lT*p6k1dCbm;h)0V|Sp=Vp z46_h9bU$1^F-G`QNc)6CT1)<$8Ndm-Evb565i+F^xX?ziXUkLxS>?gCEgSO_#j$)a zfEFTXRD=lD0;uWUWVljPgB7&&=Bsag;C)a3AO4g7@XiMxXb4OL2$qlvg@D#ttFSA3dKmP zA4Lj7kcdfX7{^Y@aQ!W54kV3lCpcpiU^jY=9S)I<<{}raSk^)D3x<%9#1t62ZlYTS z=H76|3a1PM*JGd)^@yHF$|lxtB^?hGaTi$q{;<%nXQqtXjS=1{L3FQ~S~!2j7ZCFx z@eKkg{bUM{X=$p?7%yfCAKc@vTbwa>se(;QWIrQ`?VEl=GSv4Qxm;B-bBC;fK*ElI zc5VaE`6e=jlrT9*6pSSjky6-LtE^pLTeqNqikII!fBev~&;DC~{*K3<007&V0vafY zOjFNiH*aiQzkXw~yS;vRw0?M8m4iVw+TY)q?%82gS|UU>tLMX_DzpMHifEwJV5o<~ zsw%Z5Ye^G8p`fS=4N#Uq))u9z2GwvhzPY*i{qO(auG4p{t{>aHetBgyL^hf$_P{vx zp>Af-0w9UOOL8Y$%Y~oa>do$)OUK917??TAEN#0)@}dZ?r2+tOP{T}8>Wl;M#YMgH z(?cDP)04OrSco|_- z3pa#>nOEM&%~U9=-GY$QWp}~eQ3tc()(M7;)Da~rg&_K+Nf#9%BAVl22l=f60U-FV zuV(7vbjv%xoREyk@0({x2{~ZM&$MS_IzeMRMaS5VT!^ZW(`JPHxJ=hJOU-j4*{Q1# zV|NlLloaHVU4&l@zE2`PNllRL7hz-|`V$+;G>rymOry(6m!qpUHdIsm>|gkEPkrno z3cxlKt<3J$b*t^=^OtYk*m&)=bLZYVw{zphP{E1YPaipPI9%CanqQd_dvsR8OjRfQf6D{G7;t2G=ya;Pfs#3X)#Pa*dmP6Y*El zkmlOY=k_0Kc~=kb38fSGeRKsg!F~JQwZ5UOh zL@WuB^TFHXKxq;rj|3)0dw_tsm_~B)6gfkS$jCetCO~p5<{+1ZuxS>$cJdjKH}$BL zveuNkwPG{ zT4Q_ubD?#qmDZq?vSbMrfYq8#ojCH={?2Q!pSkDW`^SS)mD)69Edp9{V&YbF3vb;}qBZzw&IJPJSV`$di^+1K2_T%l94MCi9 zFT^ifUCEj(Pn!hD-~*%<06_S$siEL&+(l*hs&41tg++o(g3#blMPF#ZO!malBS$47 zGZJSgtAmXEUdqBRiKlXKhr&PK*>po4-SKIi)dsMnP!U)nY#NJYSq)a+I)CQask?ss z)1RqEE7QFzmo8lRH~;!KzVqAI~%nVsDc2g{lGAigKWg^^YcWO zP$3bJwFF>{QK$ewDYDior8<%8PPayGI--%%U~s{W1*y(}qC5S&bF+iy8I1$ z${aCQF9HHk;JydI)8>50ei%<{CQ^l&Am10uq)B1DBPgQWRfRhO%cx37>c3kUKSkky z&nML)dn{&63gsW9{zEn=lwX z{h80*d;dc_o15SL)*ruq<_)X%w{LE~@V&E7JbK@IKJ?_tV@J-vae1_Q^!8)7-}SEB z?tJf4ANuUi{_qPw{onl8|NU3L^33ZmJ%9HjkKK0k_|==+WN0u{)j+MSkLUAxyjl#0 z#b{6ti%KaRl)5ZS0-DXI+FEOsR?t`&jR%D;$-<3|&GY9jKKkIphYlS=H30-`2r%?A z5xQ9|L?CMb+r0v0ffRt&x&>%!Z7ZeLT13VBL*6?iWaAWmn8`y}x1j=^^#~qo^mSaX z>Ezppl?LtvfzBskD?WShO7zny`!w^O2V}3q+<99Q@iK@1Gpm;RzP-ym0Z;LS_UN=<4S5XGuPSaTs5FYwZRT2@w%>V;Zf?Te}-aPTcdrgYTM8 z=Py3{>>ID2xjEhW!B>9twJ*K$I^7wJHKi4I#udiBTCleqtg8{9s4%SB_ zumEVa)^k&rSlD^3wFaU>0}>h249ar-(0FHO`|6cTM~@uUsxVE1O0^Q$HL|q?h-3*6 zQ5n;eh^iq03+M3EJTH10Xj$D*@CV`5j)f;RIbwj z(5;r}mjAdzhT29GlaX>QY3r6Cx6EDZ1VjxcqkAT|%Z6=&TUbtfWo#Qw+e7!Wp zg+-ATHmOLp=p2t^a1nBytSoH@3cbZMRm^+=Sy*L1D+ho;mJpH1BBIi2-qZxm!;d|3 z>W92!SkF*C|4+kO)vI zv`C<}YA1&cz`Sne)5&bs6h$>$8N-~0qe`Q)#u_r36d{l`sC4LW5<2ey0jy)THv$w69_MbMu#Nod_*@fU335%+$J}0d=es<7SB}Uc5s}eFwKv8W1JKUK-gBGJzJB)1SHAeAzxjXq>!1GA$Nw*X z^KagEX!z^D`peVV{%vRLPHgc#MI!XwVFYRs)}2xs z1f#PD&KqHpfZ>3etgv!#(?|E1liPXZnh$)z&R3(HSLX1Wcqwm3ffpc0#;c0938gy0 z)BxQdHynWw7e^5GuT$=uzyYFJDa`+BucYp^rFjm<6?1wQQX`*2@mAh#G3oXQ_l@7A z0U5cAy~J!YrL=v33E$i6%zPN)!_n3r5~#@LVW*f%0!p z!bLXgZCd73C&)WiQE|lMbdMM3jgl!#i-ypGQQ4T>GS|eN8j)dM#3+Pz=)@R{2#Rby zuTP!6=k`19e)Gkbs*%~7-2Bl?uiyLd10Vaz5B)#>^Z(wXznf8Siot+tAcDPX+uyqS z&A)Z|++X{*|H^;#xBkXo`Rjk<)WZ+{#y|eYH#T?gzE6+Ghi^N5YJd0E+F)c=ZRa&u zQb?8720$sTlr9v_=QC?9k+D!U)>wm8Iapa4Z*A{y+`4(kowqBc=Ji}_4XTxCg$jYJ zwV*(w*5#l8DE4=DYbqXn??;~ez(|(0O_Xb0u|=;ZP-m?B;y8q7 z?pmbEk-|7BvcLkta_xxmEPpOs-k6D89J+Lx(#_%Y`jEnr>K=u;6+Q%%6qU=ZSL+tF zg+x?$DO%P|LW;H5f+ho;0fc51kL`2EsjCx@h^EgHZ-2G@u@Em zxf$X%$8(NC9c4*5-psqTYTUl_?BxT0Hc{__eV(G^TRKKQ_WRbB61->_vlo!9gEyd0E;E(+9GXr-vJ#@c#5ofGP!7*s>m)J;{DgVAt$ zV}EyNj}#(mBve2Rfg%ev>I3*M=Hn;K`4C_G3T&+41^uU8oX`oiyjp zzVYn$zB3*a$4{Le4_D2kMktN32&h#7?F@dQ(SjvHqV8mD_eHYq=sKkc0Ni(zyKV<> zLLlU;D7`w77^fEKuo#7jok{3oqTeVBY}CYMCrx}Tn?b=BuZnY(@wpQ~*Wc<nw?O{D_%WRSY+ z#H*YEnFv{BVE~XEs_K=Vr$4a4JYb03UTKN)4dUqLYLEdv0tmAq5wSUMo5j!9$?-hJ z%s5hi56(H&nPk1Z#rVO(IGG4R>?BnfwyC;0$<2j+mzN~pX)n1kiT2n(O$DfC+EjzV z>e}(0?Y(oC-n_YaQ$g{_x6lG=VnhagNbm1TTvwwK< z)R8~?i@*56kNo6Y*KYmZZ~o@`aQJ~A`*gE;^Ub~KY&O-ku?;BHWub{wRThLmhRQkr&@@11wuH<|6$v;BHn z8`UVKwL(N94QK!WKp_$kk=D9t3|T;pWI!oRNMtQ4BqT)UHhD>GKeZ5qB{#Uue2Wxb zh@wbb0Az#?k`V+ngxG#Ph1iUhEqGD2!q6_ z4gQi30Wkz&Hc)Un3=T;To8c>e5hGU|8{%eM6c}b@;GA0y2mAu|oKX@h#9~m%0MG)c z!Kh~`T?<~6Y*o%s4yRl!g(gUPb42%%x`4sG*bEEZ`h|&o9@w>0P{_rC;LSaGc}84B zK!#>w+@|=gZ~rKzuwQOt2RiE&wmSBhL-esbZx+ESLq=;=(qR42kz3cdUi{IkFTMEc zyWaEON1uA)fBP@~o4J`Y5;cH9u$|x%Ac7?zph{Q9G%vmMqhI-zfBA*af8q32K$D#}4Qkt1vIwML z>?RDjej z8dZSvrrF)yEfkeyiCP)39_o>~<7^#=TksiFI}Pm|MzmCntqu(}{9BlDtvJca77$KPi27y`e{JPKF?}2HbO2y;G zj)P)WG2_gWAYt_&fY9-W$qPu1WCjnYhXB?D7^3<|$S^&Zd3IbTLn~y??(-%)+qk{A z?pf9@xQ18^;2~yj*OnC!Pf^9P7erqi7nLauJ%ilIV^OX=LwOn53fAh;t`V*Xe$Gjv zi;LT~iWvUOREo(L0stt`py$@?>}{8YKKJI?8#k_zg%c<5*tm4{#>Nc*fTDng01PVC zt-2(#EqW2!rUn2aGRA^|m(ITO!mF=7aMx{*KmNqWKmN&Ae(>TCfAGRlWk==ET5GK$ zGbe&-P;Bq)O{Qi|9a2?QRE;rU4Qj2GwPjH@4OPWpP^qn*y<4}o9)I+)W^S%szw!Eo z^Dn%7_VqWfZ_K)ZZ30jL2rvdXb?o-dYddPVZHbPZIJG{)8yC;6jC5IQrD3u)f8qJF zcisJ?r{4Y4p+mJ_)P?H93@Z=K`p zq|meU)`=Z}6&*vItwKiTq+O081~b#f!SJjndUCp1=7_y^S8cmZSZSP2C)U`atW=4I zjvdB?aCxlK&a4mPoQp^HqVQfF8x>kufO*{{Fndbo%h}MbD#bE z-}%mSKlu6&o_gZJ^}~nuZcLPd>8zo;)@nQ)4|i_es^`t1&}E@*H86EU7KhcarWzC= z5!hnm=KS)Fo1pcLz5Qoic=h|wy>j7ZJp(`hceXQV00bBw(i_`1-#quq%CYhBlSkBe zW&7IIv#-7U!ViD6JDnd|U)$ZCZ12wh;A`KWHTFY4_WsA;bLYmjtEh2OH|5l9>}*}V zeB<)<8`p1aZ0&6A?oH;kwPe>2oDP|trOJ1r4|;=s!W~FuN2etFRQmxgU_`){}t03Kq*>`7MW$=!pFM zL`&?mG7}i8La>0&Md4rqm1dm5e-so1ZzWNWuBjIG9#Ut!KQMuaeSr31$H!E+a%$dF z0B@~+S3tD>0{M^;+=?#eP*FF;fdHn^#p>#4YjbmVT9yO#@PiMXJa+24&-@Tg3+q~g zYM>qVA+QZWHvqz%R|0^t(vz*7Z+_=%7cXABQGbHmoJ}v?}PV{qP@Mzysqn= zJuq`smZRZtPY?F?_J^a5s0EPw`R02F|_ zwsq;s){njS(o^q!?E zRCKOTSD{RErW^}Gj^Wo!bXz8YA_7Zv@zSLuC+}YyuMWypYwTV3-ct+)Fs(uB#>`Qd zU|L8t*lGY-lv2}J1c0j-&;Reg{jWdxvG>~sZfxE>`{uPPSFbUlF-9nJRU^VzhXPYu-;;Ov>}zx#V%d-1h5Z#4h_ zW7LXBVM7*yNF&xja|`8^o`2=WORxOy$@M>6UmMRR)BXK<0RVG2b$kuxwL(>uD>FNL zA`ld*X$9!qJ)ut#g0YAUIfH2sQBdTbtf^t=%caU5S2ZZM&u5|KMVWzQ z3dc5-2^2>$KMfTKl{HC8=;{<~q@$j5!Y>{SO~*=&I}zbo^d^iNVcg=0Fek)@oe2^@ zrNr><_idR;jb+Hb?`tU{Au`VWWn$x63(~t_DAF>Q`eo>o@ilp(XmIWg%Pg`B+*cqA z2%rmHnNl_Na6Fvu&5xbB?TL3ieE!1bL+^Uzdtd(^m^mmcbkUe@H-H=ZNGi}YfCx2x z_u1zRz}o7G_0?k>UT_Vhzxz^>%pjfNQ{dxV|4`1Bfo18y?;r!LT8Gr^*040D{s{LM>C2EhA9u>uI zQ(wMzeP^#;TU(p#&b8K!G1#pYa@tMqf4_*iQ$P}m#G0W8{h1g=LM~+~(*TR|3|V9R zDm5$NE!*4Bzmhr1EN>t%d6Ie1r>Sk(1vp0?7AJMsV^O{G+NJGlTU{m=>-m()m%?rxD5~yIewVF6 zGW7bH*DhYzIClHd$DVlb@>?&C$Kz@^9*GMXlP1g4V8^8bfFY(?@mnvhlc7< zRaRP4U602DjZmAWu?<UUqM0qPe0+fyD;86sUOBCy5+fCZSF z+5lYJytzN03|B|HdsGw%hHSTnT#g9_aUw41k$SdKLz`3ApaOe(Llzx~<;5+&fGx^v zA10aP$vBAG_QcC$*TF-3c%F(py(I+@2jNUuTp8+22oZGK&3WFz;5)<4;!(Rxg#X`V zC;ztbEK%!jv;mT|@_*t5Btb-wZy=vd@Jt-)JAr9?`tEOQdbjvLfL^Ctj3;b z7ZFg#MMO{tN|YfulA0;>gP-WRg-U6SNJUXuGau>deeZg5b93wb*|%nUI{@mgd+r4Q z0*k8K{iwR-r(HJI!x{5%FK=9Y;f0rnYoo{C^X`?yhqib3>!v}lhHSMq7_N==uo@p( zUtKx0GFo37k5#Gbc{8d?MA*J@{o3X0lgWHCZKzi3V|DcK@aU)j ztq~io%t{3%n4{zB#9DQ1JXjf)D?_!mHYBjKcJHw!Jxjm;|kr(n={!pbCJ|+De0JJYE}&20*A#L+5I+y*$D->e}4tj+E0_ZaMnr z0(&Q6NW6UsMUecKaRHy3wm?+LfhUF0u%^-c;7jz=#E435xaEa zxlDFC5p)h=+LF~a`t`s-$VhE0#!f>{SG{Sz2zQ6ku3qTLyY~)e&K70<`PZ7;3 zZJQh6V5GW@fGM+h)YK@)UPzn0H?E$#kjsIDrQ>}k3cby_ppzI!4x{8DyIgxDosk{^ z3cT-oz;cND;JN(b^am+5D&MiUg)Qv%i;*Q%g{68p8fgi0Gx}MLQ zc|9nL@!D`u6~nTsia}GG@o1$QmUTThrXG%}TQ@hZU%PR0w>Ayz?##^GtX2cmMOEq9 zeBM|)z|xZ4+S?}!^QHk%bpwS~mC~TG)P+S$U}iOGMWaDcjH=0GUK63QgJC()%9Jpu zG|XV2fKVeSV@z$0Mk+L+C9;4@S?IncW80aHh6cJidE3d|-Oc@58vvx0Mnq6RWWjBA zOHPcN_2}--&U}BTwt%SGjFbXvfx=EU-XMrdku@|oSFT^O z04I+fU0XR!sCKuvi&Ecq`czp$rBqoI#u%fho=mF&&Zbj^(3pB}G9hcPT)$DzXm8&R zN5!XL`NCCCWNl77D(n5cq2J|aK2z`lskOs_Bcg-fkhpIL;zyr9|R!E7X62G!?Wo@q3n$aRW?R3>0p z9vTH^7KG~{^*EcQxD<6t-loO+g=wr+ohwh!Z8+jH*xpB>xDmPMkYFS_N5qq+Tug#) zDU!>X)myk0UY@y~k#tB`gyXy;pNWa2KdY=Vl`R7v(w^-saN;3BZs`( z10V==57F=7RvMA8RD)}muZ*hkPkr4U6%hP^us-2bDsc&SuT51^{dA zumDwPRog+S2W6oZG(=j1nVVsy3#F6>Kx)tboLfRLNJ zhOTdJ|D#|2wa4$f@9^R3T@T)Ucr=V7C4{i9u1z7AIrj*{ z0X9dbK460Jj$~dUMhSY1N>WN(L@+8@91Mb3p6Z5ARID-WG zyT|0rZl{RoC?lR49pVt6QnnmasJ5@3yY$hIee}WK`JHFJ`|P39w@oL_U^r~%GXMh6 zNCp*>CEg8d9aq;U=$fm|ycnwCSec#u!z;ybyrN4S40Tht^IiaCwJKDBRL|-;UATO0 zV{7~R25rsZ?mI^J-*v~@Xi#dszgJ(lvaz|bwY@#tsi(KLr>iT~NUIaa50#3nDKx-r zHW`*hZ5q|sqS9JvY7aaGFi2HZB7!Aj8#@}}uqq0GIe-GtZP&(FQb_F=2DICGO+=(D z*s3U+rg`(+wd7oaf0wNTZzWbK z{*HOe3#!qXz@&2SnXqHg1OvYksGahLBabIG%X*aK6&Z8RLnH_cOP&45K&HcZ1_iOz zf1AMQ>dCv2VhpH<#XXLPkcQq8Lln1zJat&)I{c-z@(L&Uip)hx=wuesBX|!?Byi!) zF0giRolwW2)~IRK;W+^*`_(W0-rxMs{?m_q;K!bO>4p8tMN#eU&uv4OE^VB- ze*MiWJEJ4(Pk-W}yYIZ~sFfyb5iKeh49mfw+?&-FKs(z`ZDXVA zHaCM(KuQCGHbhFRy0Kexn$F?;#cNutK{c?pwn**aaV_S$fn;X|rHhgqb{B2wma#=n z2qiL}185P&`SmFj#K4zHoV;2n-k4m7OnTq(7sQJa?!S{O1OV)gfZLyihYv z2D8(U9;$+3)4X%{Q6^rZ?VVFi;WkvtKg<}9G~2voMD{N-7Cv`MqPM5A0-$B!m-&Vi zPZpbL#!)X_!bCH3nPAg94&2bB2>1>P2pAYkn=7XMA@LiMNYba8P@ z>FIwJo3F^Xj1vWg^K$?RG&wlzg-pubqAT2kG&;+HGJcM70{@wql#-yrQKf|6o_cd4 zUfL>g9oPU~lrsM6f**>(*dS4FLA?SYzj4IvV-K(Ta%E+cBQtgblD0-E-ZG?4M3PDH z0TMIZlcOM>_%DcB$G9$(E;870h!ie6y_}I61n~0!{ehYMz&t`w3W+q4QK+j*Rr6Af zrqBK02Os+J4}A0kPn|n|<=mMYFTU~;4hjokn?@I?bV0_rSI`a5~ z4Ea3?N}`sIlg735Sm!AFr(MZe7)d293rzJqoh{!b%4(i@GE9a!uqk(u)aG zY`%V9`Wap#QcxA`4vBy{L5`6LJS6feEU`gv!v}L!V3bFx6NN&D?BO_QOoyRkLa1vL zx8+^HTvTXuoMR}O)0}hhqSBqW=5ouJ;|8x6(Zl z3zNclmiJ(|(P0+FU191aces;OfyAAV|DHfefilM)`_P5O0-KYm;PXoLT|$WUXNO6x<1$6xw`-~Py_p8otNKmFzJJ$L@C z3%k3!D{566w1B2DRFG1NjAh@M>Mkr17z+UJd;IYypM1}3Z+o({arnsU%0MG(V`yi( zH=oX{YCx*0C$k&do7XnB-}UZ~{KV(K@cs`zy?W#*Km}lSHn)H4xBm6>Z(jQ7XFmPp zyB>Vx-iMD3%0su^w_aA?edhbW^)LUoKYr$`Tl;%60|QG+;r`U@?QB(Ak5)!iQ6MT* zWbC}IXQeI)2#E+Sr~;6PtWq={loi0VSM=f+L5I zRHI>44G^g|MkzGLaIQLOX>W-yRVLprYc~iB+f7^s_#7EWbGBw8Xk;QFsTaj>g>wlBn9x{xOAYtYo~%9If0f=Q3XJ!Uy_QP$1tideYA{}z&)~|&=DG9Nf9xYa z^@Tt8ix0f(NyG{OEP&bHJ@eX&2Il|wzwsa6aq9S8x1U^HUxRvb=G9AIdggoopMU&M z&z-w;>Eg|K4a0#R5350?$-uO(w|1HaCadF7RqCPEQ^G+tFxCQ*Rs;%wELkLM$^u4J zSt*=a0tBUitO_Vg8n87AKx7M4O{*se3SfT*7q48N?$3&1IIpLE;Ga!@ft)j9?Gv`* zv1llq)q|*a<}!(rER3X{>kb^)mh{w|i0nFnO6d?!;w9smV}sj_$%|zUNtnM#?Hqu} zM_^S70p9nQ5ExXVx?}*VDPi8fqLv5D&CUu@rO}?kr~L4gPau$gGXYXI5Ieb z4!H{_Uv^)}nzXmY%HW>K*~kv6+76yI?SLLx1J=$*gJM%n|JASm>fid$|MoBb!WX{y z```S=wQuj-+|mlkparE60hQ9wG;;tzR6rIAO~wE;gL3fn2S5CUpZi&Crk5|hIo;bG z4Tqy)IhmU2Y|mP|a`>pVX8Y#O>#x7HcJ!W~`3ryX!H3@0sx}dr`FwA(uhv$7_Gf?L z#EHX|9w;;4y>|22XTI_;e(Sfs^3`v?_|mNbA^~b3YK$?pF*K}(L$z+3U1exGooTGp zU^p&DOX667$Xt7flH?i1hIfCzH%N2v(JM3|ySVOv(vK1E!L$X7b ziv@EH96`vuR8~x+-8}!?YoAN&8o8Yfo(Pi3HIF!K4&gYMltus0*zRudToG=JU^f``hpP)F=MN zfAa61yL9HQ^B30+uhcV`?KNeo$=IfuqgG@rwP%9X768g}@ZtBp@2~ww|KY>$esuf# z^{tyX$Tr2GXpA9iEtzsyHBCL4)@RS3w`%pz{nB4};E{I|741UG>E3K>d!vEokw+gN zsH&m)WM_A}z4_(e{@1_qEC2lEGjCkHuwwvLR|jN_o!4cB3aoAFVpw6J53LR?SZfVp z`!#n^sLDc*ih_`g1+ZilXe7XUk%ko=c-kSrmB1_fjY;O55u zk6wE1;Ro(5i>jWRLKU@bR5usz4u{K(QxN)-;YfB_9YjITxrJOB-i{FEqYG(BU&xn2 z<3>uVL2C(tP3myeF!I?I^pJ#Et)&~d?Y2|-*e&W#JBXM|6-jE+!a zl!=YWbVL@oUqYJ3s$tKmX_c%;(oegYC^-JFh`2V=aKv zSdd}GSOWm>e(>>s_pkib&wc*qiRv4d&YEVYC{?Kog{a6Xjf2s^5WMx)g^lYQAO6JC z?|%PBv>K2#NMIYhwsGs${`Bb4W0e|BW_EvTI@#O%*0;X(&wusT|L9B4?(fbN!Wcjk zfgu1W3ypw8IIm4@YEm?)s%lUfV{h&3?oOt4W6Pq@y4|r02<^AbsIF&4MJwa71h4?s zT0{WVy6>%Pq!1AmD(FsPYJ2~raIDpAMsHrYu)Q-G3|AE@RH(b`U87;}u4JoVW`fn7 z$mJ3rM7;k09Aq~)0<8em66AW4Bu8rHfURY^gYXWp+C8H|a|42AJ44+`THwnQ@Rs6G zrrzW$=Rk@_%WOOAyOGhH21duR^~MjsDPABGn*#)1gPfpch3^2c-bITpl9$0`X6#HJ z2{Dd?eUTxG2yv8LZI=W=HhX~5ARpZN2Du~W0|eJ3Wi^Ecj$g+X*U2}si{QL4%j*6M zhK2~pk^wN(RD*J;^^vthS2kb&7r*?EREhuBzxmfc{kcyb9u4O8q|~GfZEd5=a!`~d zs?lggsR6*?-rFDgrGNVuf8o#lnQDEswXr#wZ&xLa#zTux8@oH(Q$<AbN9l_CI(gxzXTL?9wt0*r@xJZRZKglGu} z&;k+Ic3QieriIpNM+?*tSyVHCOV_SmxpZZ9Wlf>NZry0;qZvX@`#o=?VTVkKym_6R z0Ny|$zs638xR4PJj&1!Rfl-2(earafM8ZFC`NTFf4EaQ889WO9I@^QbiqyqneoN#C z2=xfMAQOlVmrub>N3R_BafQ-aN`7|N9gkd+&<)_v0NV380LhXiDwQ4&@M~ZCop1fY z7jL`kp8xUh{M|47{GUHEUNiH$-k&t4F|(PqO-*)xvS;kz;YXkRtAFj^|I2^%-#dEh zL^IvJbn)!g%?khxDb)})7KWo?H5^X%r#G%%GX(E`|Bv1Kz~dIk0ufqkX+EE?9~vJz zveq6uI-gBzTcb96lWk>c-846EOq51dXls!WORa!ZZNZR2tq2ta+r0E7x^0;To1DD>KG zm*$s$?brX&@e?N=eE$djyTALlAA9PNfBwtA`r^wk!PJ=Uz3GJMI*_Zyo>;S!yTCcBgRe z!joW#S9R_7UrU838svFYno}{Bi6I48lk^vVLvsG(>s1 z1(TF&x(oe|PE0UDR4Z&JfiatPPk9kC3YE&LrbHL_6)bN8y06Si*kP7KAj0RL zs(B&`5zI*ZW>#zg)0c);7K5S7}A;l2e~Or)pimr0fAM3ptWt9 zvMlbr{f@J5o%_{)^8fxz1>FDM5B#nF^MCwPpZe?{{Qhr$vKK_|a33J@WWVk3an4^RLvk)mGI2WDSA^ zg|@LZDJZm2-RJ-Tpf&B`T3TsPRM&N>U^FOI31BQ1CDk>MvSc*EsHz4EciKLJLalYX zu$2J2bA(jqq3HHZECpmy0oFhlu3z8W+CDrU&6+7%+s+SjwZZlTZGTF!f9>OtN7B4@ zwH_t1NHTo})bjEa^6uJQ$VX@Y7UjYH5E z_{Qr8ZwqEgsLNJXDMl*dH>{#r4>DV~yiHG_I(AW$LWw;`@jiN)D@+uak3i0DM`<$I z>=Kk(iU{n(R_zWZJG|F!?%-@kt8>fUrZT3x^G)NN~r*A*gxnbmu{n^*R3T`USa zpBSZ~D9XM4i9(vq=Cl3Dv7?9Xd+6bNAGrPcjcYHz^sVz3Za)5=_Z&TPY&aNpN=Y!U zYhB=QJgUl~9GCaq_rSgPKJeV{Cwt=-+L^+4;QTpbQp$Ai7CDWNUOf~>UwWLwV+2~d&kPDJlUQ3wFq z>$xtHqf}SIut~3hqZ&Cl?_(p4Q(9za>!+0j+*_m4_z+;5&i6Mlv$o1wWZe)SEGe zcQ=xAmmRhs_~l43cU+xCJGwD95hoZO7LB0S%Zpng!Kw)KBX>a1le@@ZeV^TsMm`@f zdnumv+8!4rTKX1j3OFva`I45$k^U^E(|Z$1B;R5k@S;cHB}8|rea>k_Z<1xZME2j6 z*?*Wr-ZSIwMdXeJ1zTcu5uH`-Y-_u`9so5efW|bYX+}kL`yHoWdg(j=?SFOVr+(^l zAN%Z|T|0XF+S-vLPaLj+6qEp{6`H1*>}_2;_ww%MMO0>9TVoKZFwL~As`+F(nKi@F z=*a2Yhlkd;Zr-|be*4?s_~!Pl{n2>zkq>@!xDE=z0uY(uu+#&!b?ufhvvORVJbCi= zQzzFBukKE66i5mY5G-O%&;S(#Ud0&Ken`sViD)f=1d(+{^}N(dk( zqcF&n<2GY`+fwNE*Lbv9++w2jq$F_3X!8zR`ytI)YJo)To>)$F!_G%%M-mAKu354i zVN)b{Fq`GxxtTbZW0BNXAiv9t0y;YuJ0q88v+o^;Oj({1IC|K`Eg8jc{qg!D$vX^~ z+z5b+jA{#Rv9BRaS7Q7ZPO39grp|ZIY51Dce(PL&W4LGFM9HW4f&j8G&Rtk&{@A zWzV}by;vxrkJw*u>K?IyOK7ksBrEBG8;TauJ?arJ0a5zvdxr1dFS*AWWh1DyczaS>u z1QC+?vKH^9H#Qq=Pj3_f!FhZAWB0l2-EY6ih%*!WiaY;O)G>@uQJ^qB(b^$DLzGVA zy2%>^rBudz0B@GTo@R>&AeEX#+=2-ucA)9y|Za`Frkt zU_4%-ju8l2n^|qhPNuupH?MB(Zj4G)!@*=eX$TBKsbSs#AeNvTWfcMf8uv8<+cc?-Ab>@8u$!Ax z!f>Sk2}^(}(bAUYbe)P!UqsND9>l+(a3Ol^#-n)yca7M@ip|xf{n;WvWz$@3TtdB?K z;qe0x-#?i=U(Zbq%^Uy~YC=#25VYU%0z`!t6cN=3SQG`2EtImxSWt*c0gi`Im4iZ8 z76H&2JFjp!9uG#ta(BNj+9TmwW2q5Hwe$cWC}`&Z5YbY5VjRvJbMe~s^A|4Oe)A@9ppX%CU4!f#Kxo{ICns?wPU~7Wa#G*`qLl_FY_WJ^N_AiABm|<#YmB?^ zO~P~vqoW{zO*?wV1mn>|8DFH!v`Iw6C{5QWyypBs2tV3}5DhOS9-$ir3ud5Qh_Mi; z`&b%VB_5x78Lh{M0IVCze8e;%vfDpF5XQHA!p}m9%I_B@HbubWv(X!j({KomGfoX8 z1|yT0Pza6I57s^{dG|U~EN2AI=O8v9i6c*qLWd6SgbWnw>uM!nqCE!L=j)-ROGgNZ zK)QexH7o~%$=(dDSzjF=J32ab>bRNh?a!uP{8ztu;mPx#F4rG>_hSW)P>svdZg1ag zsMy}VHQ8ylC+haQ9z1^X=v$Yr+<)JFr|-V2&_!)Y>%q~ZCpL%IjvPCrl>+Ck0#Tum z3S2+5dgE5Pv$ciu+0#G%$-7S9_J_aq+h6(ex8J&SVc$YoK~ZQzr4Y(OqgG0(QlkMw zmXNFhRaS*UwANZOpr9)Bk;8`yRg^{1)W(`dYh4t2fO=3C1hpZkltv4NKo=NzhG4r> zJ3IfEsAUe^+^XNYeDx{wxK^4-8Fxf>&^|sVz-&OTli(sdWJsl=vnjqQgNGQhJ(%Jy zPz;j!CA2Y8;eHg(x;0PLP{Jrd9iQFEI`+a(EvtN&Di7aVMafBi(-AR%zsY1MEDo~t!PvE_ zd=H@0HKa~t3?YFowJ|kn7!OC2*{q)05@~f*9vTjRaPzfSU%K#_pDPq7!g92JwAr6t zy>($UT)pGS@yVolaIpUPlTQrG!Kn*x9Y20# zUuS^w5xA7+#Idb@fEiwJng^x%2@BO{f`WfdGVj83lG%XPQUycc|3R!0{8>^v4;7hu zllKLjqY@NanE7lvw(;WtTHcpmf4aC2;J7Q>+q*Qvy7m`yK=glGF+-sXiEwZwD!^H{ z)MQ4qF-cwMZhQMKtd4)-$5VQopN_aNw3&Bzx`!m_;@K^$URJ8bdSc-+2#zyf0Ye=5 zlATmQ*iNbfm4%u&H3C?&TC1WQY;EtCE923TW990)Dk>^RR@av|ZVgvXKJd`}ciwfX z(1YP<2%z@2XDcgf))vO#(c5lYUs**c2&`T|YK!(ujolziJLigsl`aZ|`|i8v-iIF0 zx-7<{dmn%Fqd)P{7cafC{oNnVW-~AriUP@603=daw0pqHqCjIcpaLpDP3E>5=&CGC zW1D&k%G#y@f=X*+t*K{4H5!z<0GJXLNQTH5>c(oQ!!QK|U;z~nSn8~!LTrex+}PaM z+B$vW&}_b^sQtK@0e%u38+^-nEhyWmr|DbdCo#g&&Pc=pA-4_m>kQ_v9W7BZ{%oPT zdwQbt?%rOA+#9z}m7riVy#Q|3Q>bHvdKo_p7S*B0>P5tWN2iW6uHI}NVMxgwP5*)Q zB|#vKOA}Y|049j~}>Itgt*p^+h6RH@C=xgOTF zJShT8L}WE8)JkbY(55kyX@fK}6TJP7)5CJGyIY?*cXj>H+Nsm0A3t_{b!~k-8Y^7@ z*vVvi{pPLX$B(QXK6>}P_s>l;*_kL^n7V12rl_j5l|!9LRA31KK|ujnj>ap;)=sUg z9|8l)&Wj_}y${~;LK47FoEh^PQ9fdwKU3vm7B*7X~= z?z!tWy{C*Z*0!IPv2IrbxOsZN(LQc%=_M`>ZnwJ~exfU3N)%Nxz=B+A*5ErtulVBx1L13fu-HK_m*-Gt{3t zxPx}rl>$`OS_KFQ)5-o|SdG?J$AfA<-5=>|d={*-`w`uUX`8P(&BK z#x6P&Mdz=m<_p==JbrO1-JFR(XCjDNn8-o`N{5;_y$4*<7_DpSk}m6L1uM?h zKnbk&q(}tEj(8D&(K0vW$@s(rb;Yx;h97!FU}C^^fQdfq_PIMD+UP#J1=Q(TA3pn) z`I2&PL8Nue2d0EMUIcp^`3>?+FgK0H4UnI%CjwG{mJoDVl2UsOt{h!oT|c_9Jw1B& z;GVnhd-27WAGq(HwIhcL#IvuzMaCSz{X{*VHMMEaacNAwx3zoq`qkC(XlrwGck31n za5CRp9U)NFewC#iVw%;H_4OlK>v}$U^+zwAdF7cmUw!Gh@BQ%2*Dr1CO>j_@hKQ&@ zr2&wvu~rv|g;EGwDbN;boYnL7m4QM9NQyw~qWyfaA+pwLrHRN=Qu@Z@hV2i(E65&Ue zvgcT`#3UbQ@hpH!epw&$B3L5kMsV~G8FvyRvf_*B@&!rSIxC4@y^x>~)$=Q7^OEoQ z4hQI7QF4pyF*DU&wv-qKQ2_=jUHtaauO-eXbXNWQ+GR2Q6p}fumxTI-Cpk`{jT3&(55A>HL}3u3p}xiCI}0 z7rL-uhI)WNsL0k}8fz*Tl?9P0%R(u;H>sPZv9?so^?(Qo5Kw_K-5Fm*jcv+mG#U+Y zXWjr*1lsKcYe(^v6B65gBoY9qJ5*C6)|NK6Z|?5y9X~qWpYEYj)>;Ujmum_F&urO1 zEC?mdOa!8c&<*tE8dY>DQq_;7N4j8ws^HZige7AhC%kLr$!)8dl{Pjz5tq=d*z+riA~V}wI-Uz&2h+?;l9V#@9Tt)ii@)$d zfknYLagHO*iU|s-B)Z(t9;*MSh5B;22lqa@?ExM$Dmm0vdPH1 zfpKwJ${ApAcwWYEQGjc`u!DlHT5fd-yS;&aAk@9-M!ggQp;ClY8(TM~HfC?n-f_?E zPks1(6_nN#E7fRF3;@8?Fj`%?=g3M?4tKZrcBiwGKmbisPs^$}blcr4tE);^C#u0< zIM~>_`QnSu9X)yM{qO(iuv%3LY>j1E4$9$;OP62x(My|~Tbr9VuWoGJ+BOORW)mV^ zm8eK#3r$4ET1ytOER+JJ6=}p77-~NXhG0=^vIw9JkRnt-g;Lg9vZOSul;r?m7PO!n zx*_Mx1CU~ym|DIW01I$^^VW?U8+V*~P%CY$apNTM1dxNxXi}!H&A4Zkc-RX<*Ova0 znR9lPq(~n}^spSTJs7WB8tY7{z@BIYN?KTmh;9KIrx68J4xzAMJe4k9$U}NSEr~f& za;yxaC+q=|pe^xWUA6(IC7OugSuwl9)p@b=O*{_qXD)BI8g(&HEiNNU%fMEyZ}-(p zL}yXyBs#ZQlakLQg37dvg;pUGxEWfciP`o1{=JX`ccM=BlnDR@--n3}MF^YFBDZ;U zA`}*eQyPC^joG$~Zt6JM%1yjU+Y=(YoLiB%L`Z zj?+i&ZDX4A6PyW=Wo_Ofpue|ocx4-_iZ+_z&S1z1yOlzgIu@=adrPifF zvIt~sU6fiO&cP6xYFJj4Dhh2I187hwARya-ZKzNHgbDympw0i3~$R=3)l# z5Li88T9%+_TZFWnabvvw@HUbq91RX`ATO$QNa>>?0PA*nMCZB0rFuVr$C2d39!zi` zyrz4(3A&$QwFDAZa!wOH9e((aSW9;nrZe>j-2e!6i`NhU6xn7vo0nBFUL9`VeCw{e zA3bvTWS6l)RTh)!47D*(5A@Jlg=7?}qA2IHIU*IR9FJDeVq>TwGnww~@9Yh$>iCH} zj~rRG^?YJy!=Ww|7;77{)o^^`_VI1UPd@tKosXTq^VneY`+xWcm#*KiKuUoHON|9p zlX{t0GOtsvZ=Hllp0J!?Rw8{ zttSAqoM8LG2?|6)v;ag_0c`KiFI>Jcoi;@=XzJPzO}7Bm$rQSA<96exa0-*=OmA49 z0a=SDs-HJ1iM}J3iRI3dtAooeo<0m8yN?Ly4B!IL^Dj`Ol@Z+}85O(&%xFYr2K^o| z3`7g6z_HXF$hUax#9JZscNhu|!(SpFOw$8%gBJ|?xa#O}O^jjVKBBuLQ`7EE76)McHWMW~j4?@6Sz@~+MN0dB1jWm~P~lRu(1wwAGb z8uMaPb=jgF5SV>AM4HC`Dh05d1h*cb#f``i0iz@RE| zykf}~)ymE7`PAGzbgV3@5=k|U0YD_Qa|5O+2kNf-Z-3(P2Y&F}cP?JPwm+!{l_~~$ zv@)y^&Ab^5wL&n)z}(F1ni{CI9*oKo(b~E;jRJ!93-DmO;T<9iWXT$uSEU{g2YT8N zfFf$W%y#Oa+Z6}SB(&OPfB>u^1lXU$8y7EKzOs4x2v=$DvKZB6hS&mf{L<~D$h<~tT|IJqymn{= zUZ+>7!?Hq{w?j7W#CGLcAAliBXFfV5BZ8|pHm+R0 z{@{a8?(E%~8w2gvKgn7@dS{)?Vtd|F7&7k`l(;qtFwcK7P#j_l&mIrH%hkjU#|4!}?(RmK zyue+@whetZ!u3Mh72fd*a1ur|z#WLX^8&@sL9GT$lYs4kQ?^$T{T}$z#fxu?IF!|E z^Ni-gy@bb-!jp+lgGCZ1N$=PZZJLdyiE^Z}GLv}$uNcIPb3T`d@N5}@EE?v|6duyq;AG!CGr<(=;=(qk%5UqACil zG#Jxve6VCqg9=r9wnJMrg=38sSfvzMGS(PX+Nvxyg6%fGh1TlCoLWwyhOih&Ay~kg z=-h=Hubeycf%m^_I9%DAOcW|>Eh)#r4yK$B;iq3BA5A`T1~`opT}K$pkt254_*q;D zsHMvS)4(PoJXE&RxX1w2`Dk%&E=3lnX_~# z-bRsK6ydu0KOw10k~gLKJ8l;cpj-YLp*LeK&%!skcu5IKB+C;-;6eK`61U%;J(8`K zNatdU7sDDki46_{%9FN0B+Z)>w^maevTJeY3vzv?@wlTLg=w>REkjY*k&})MTGze3Q#MhfXE`+LREz>2+^9Ru~q>RAt= zS^^}p3b8D7RpQ>P-M2-mb=KRy0}yrx0kvvv5dl$=wH8PLGzibXdFG8XZ$0?n?Kf_2 zw0NZeEq2C2*jV3i-0Sa{A8Rj@h+gH5(!$?93`9QBxHW6mSKQ z0-n^*D{#?Pt$i36wCF${7t84dEb;cD)B+gZHpAX&;D~jALNWSf*~H!g&z|3MQCv(^ zvTN{dgtyrf5v8!rSlxYh7q)LlGgI7@5KkEJ&rQkjGp9uUZb}pY8J{^6%Ps-m!M2z~ z+=OtiI}k0nCH00Qw%ckJwY7JFx=7d^vm@+6S33lB9Vx{p_z(ds5r74-#-c(fv}r8O z41hj;_Z>%$9BR*s00Km;N`2qGr>vPEnUzE10@R$$Y&O%n)C!H6?QQS9`NKEA@|73A3 zS^=4E{=mttXDo9pLTiOZ2F$Zf1i(SULIsRmDYyTT>rx8PB;NI9oL4v(F@ z{n%}{-*f*%51+d8fB9ek;q`BQ!#1$GHXJCLOlMS;h*%&NK*Q0XG4*UZo6Kf&Qy&5x zj|OE~HmHP3XL&URgDLg-fK*!5{du-tYRh?p#9t= z0+2#9KuFMb0`{ix(rd5&5S4evw+&Rk7`mezX~hh$x&@ z*ixy`SPMiNwbr_>8?dT@`K|rQ^;>lJefOU{ednMmH31cbXj-O@$HOO{c%T3U77R7@ zWHz7ASJzi(`?HG|ubh4J?3uUTEJ?rrsdukvG?UqdYgbR*wszMekDNYz?`J;$xqI(_ zNa@1N>q1ou5kVEJ>+k)<)1SF=`IT2++1$KUl_l9(Q5Fcw*tU+g(4>m0uIv51d0kIT z(=^R^I2dZJ=BAm~jkRPOs&r`q0E{J5TVn|{0)bV4U~2%~9t&y!h``!bv`{Hh4vlR) zVT44jSBj(*SOP4Hx@j(KZl1k(;mP+tboI)gd%;jBjRka=Ous~3PBJGyD;96FbcSP7l(1YSUCyl+C1 zCs5D-Cb}0|=}!gnvVj@=|DT3Xd+uMqgK#izcz|7EKiC=wNFxV#h=4&SUANtVmU5;4y>fr7mjI%xg2( zu(~=Z4;^Z1Gnv*~TQ%Y?0SwBjF@UPDP2Dc|0b3Yb8>p>mP?uV1OV&1Io2DEN2USrP zFl!t}JARTEMCz896Cpv%*LD?{C4kMX-Rm3MpN@V+m)*d)@Si%v)?*vXFVioD=kOJuE8O0|b304k-Fv4#jnMYT_MvNNfn z-mT5UkG}7*4}9$S`dzbTzO`d-ZEUZMDy1rfqA`t92!vWGM5w2;8ymMQnDN?e8fZ8i zt`DoVm6cEY_y_IYzM{$D!)r}F+uGjVo6Qd$T03#-R6U(?j=uN4%<93Ar@LO>b55KHj|dOU-%q;Ta5c8sgkwqlQ zB_JT!0R28a*xvN|Mp+I7Apk~)%ctFdkgd)aVgeO-B6nYW6<|BJR%0kz+(s*kR8RZ5INd^9Rn6nqa^GQ+{!I}VWK^XO;)TXrlV>A zOb%X|*h>?QioP?5dz0*w7R(s}2WaNx>k+jqMp77lUm);tLM9h}qbS38p!gyy4E-*o z9pZrkP03^`FPU@q!`LQ!fyLK(>{PJ+3~Hu)b70{C6lazrDl_6r-WMBU#8;SOqyZi9 zpQ+qAM}2WIICuGl^G`hMU@0)6x4zR0`kD-oCrEhxo+~VgQYo7m1cBB;xnzZbmX<7!m6lG< z?H}w;G%RPjw!O2d!=C5qmGzae#*A|9UbnNcz9yBsaOQNo*ZcJPXAd51oIZ8hQSNuY z{VH&H=id6kQG2?idOfe?Dk%hU$V`DB%8I3fAT(r4F+17tygq9qP)cPZO5zYj#DGF_ z963591Vk3Vh5;!IJZZ{~?OK+EzK+m+w829NNKSdjRD=safgn&&w0h1AC_+Q)8=K8$ zt6ZvdyIlZGHd?3Or3{~}l*T=k$ObNKdC6WC2I-@wkV8Vfh~{~i&5y|o2j9jybJ4S% z2Q_#38Q|k=Z7azoiC&cEo1=M9azHNQkuLAWe+OY%@n^mR zhZP4FQw&`>HT9_L_&`%br4=%cS{4VvbxwXAqg@6C_h=uXR7MTC^p8f|1@Jtek}%5- zk_l@(j$(UKy4?jJ-lm=!1d|zfMpoL*dBu{WJnu?b@BvO6W+at^Ei^PTM^t*~$*AN> zPYe%({Fd~@e<}AJGcY5vM9F}mF~AIr#0C&;p+HF)@=>QHr1E^f+vyz~b|2i|?i(|; zeDV*z_q(SqK0iIZ$T_R$7}UjAr2SkXWxJO-R;fw-J|A} zkKb!lUF>$fPO#tct8>b-gdh4+O3RikK??Fc4-u8)DkVh84MU?Wg$PE6$e^TTfsz3k z98?4-kr7Y`v{8VOEG>Z~5lgnMzz-ANF#w1l0VrX~IA%2hf{+3Pvp^&Up`;(u{^3#c zuswBlP9E+9Yg6c$Vz(yD|LEbG!KOmG5u+wQXc5x20vwU3h^DY$?!tWLsmw_VAKcfJ z_jMmFDGQ`B3=WmyTBO#>H2e5Z6bmSSap9BUdJYbf+&1BS%5*#xTLLo3&G9$c)Q$5k zl+`T#{a8W$XhYj?cjbI|^3s1;A-<@8Bl41 z4T8nLoY0@-&AC~0er+rZ*`F9-G1&xJG}Pzyc78KO9PDXWyZR{A&Z=MYMOESMM8Fr`r`^SW8~b_hB!1o_+?e1)CgXMnn zccy^*La3$rxu-6ieeJDxdhOm{UisYZd;*gY4=jwTF6Py&hoq1$bT zS`%Q&Eum1%$LB_n&|AnX*%1q;jdEEQ^KdcD<@w-U!X!!TuA| z=gyrw`PQ3n9USf)9Qm!*!QtT{+qTy|^xJL2Vsd=?)vtVUYxCjHe)5ykbMxTMKDfI- z(`W=l(ON{JDpF%n=L*a9#P1q8~H zmNuaw;|i#iO0H@K8aP7xSr;V1Cu0#Fuc3zk0+10U2qnqug%2KXgqkG^J+ShZtkfDz3F!b$IW&=rkJJIfS3zeD74yh!a=e^dsu-cKhEUaUM8tZC830tm z|8Z-kfk8*w$5V-w-w~4=!dVLsptvEzj-&CBq>s4r8s^b?7657zTQDzt3XA=i3akWL zMyUrBZI(Hwjlu(Oi;^c#OV(q>*-O;SIPg&>@p1)0?B{k&d4uscMl=NgB2dcbiPHo^ zG&19kOy5SmkI_CT21pSZ#w>-yMa8Nmw(J(TH_;je#GQVdm*M%o8#&95S}g;6nVRIn z-+}hX8N6_i4$cNd{!!981i*$FKw2u$0SeJ>dtRtrSM>aFXMe9cHTUJOe(%fQ`Tc6O zW;7XQDUl<2iB?FAh8eNsy43GjQc9!5%H%~7tRp-ijWJ$H8vF*+S)$6|L_4bAW36bhh}SU_rhf;Tdoi^H#_t4OHY3I_G|Z7 zZvU-6_};s3Ub%boj#AhQ0^4>$kZY;H_bmk_$97#C0YlANV?aUB>jBo3LZt*UqY%Ih z%mfGql&}y;fB=EE<46?57;0Z@Z7WrBWJenY5S#?7Cjew55C{YY85jvb5C9?z6pS)b zEIQP?hX?(hCzZqykczt#iyKjo0i2vYO2;pum+`+W#77c z9Rl-%ul-EK1ed(uuj9t*x2qnV#F)>m1#>d;8$<(5_Us9^BvF+BrJvO)kuJ zx;<^eez*B>_r3~y?Da36I}scnetPBOi|3bm?cImlyGN~#L|&Mg5CXK;LZIt9<&qOJ z1pN?%L9lEo$QU7PDWj!T1Vlz6A_g!_#3Y3jN}^B<078Vm2I$$&SjBbryS)$qnUR4I z5si$xJNBamCI(>u1aov!335KgfX^rVQ+g99$EY9$ zISHmifZ_G7WF$Xgfdx~s8jG#G4u)geXEfmhA}bXFkI|YVrAJQW4r-I6XL8Ik^l?F5 z9)}i27kVtg`CNu`OsI%tYuu*!n@G0i@MtclWFmrqnBwsv9h7PJbQ;c#LIQx%CURI5 zLSVF}nb`TGVMfVL@{EHK06_pU=imiIyI(OSKhdC>>jn>XS)5<8zo$s+U{#WVU2MU0 zxnkI$U(^&h*q<4x=}kQPqghAhvd9=ayu`YJ2zmjj>iFq1b2zp=bz%m6n4Vj@@Z1-z zQq3496KccA29(7NWDFYs0L!v~nAs&VEM>)ZfmxswfFRJ2QA#?Fqnz4NtNq4XuPu)) zy*l-E$F<210jV)IcKzB76L^I3%12i>HaDMn;n_2n&i~}ke{}Wcy`#OpcAJOorty2) z!(aXKH+ODd$Iia6Ontn*zt>t>c~AHH)oO)w@93zd1Op0fjH859w&PZe=SwiQWvPll zL=?!R0SG{#Kr#%7hBPCQ1|_89*h(oP2({KBljeZKYDKw@QUWwZ%K*p}$#xbPZI*}` z0s#<7fQ-3_jW!4X?QXZz=~bs4h~|(SvtZP>X@{j&i(;2Tws?buFEUh{iPM3xm<^}T zaSbKP+>Hv8kYN=vz_KaZ0~Q9z2k8IBbOCb-pU}2pv%U~2I=8-|6 zqm%wg*1Tg!mAFQTf`AOOLIEhr;8C~V3gLz4F3!#^R_4x}Ie+qKvss-OA8SkrMlhiv zCKE~_BFCY43x@yzfeIY78B9n<2$TR)A~G_wP(oQaF;$zL84p75`e&cM*?8^zljlyJ zJSA-lg<`uj*=Ve;9c|pdzkYvhVP@gQmtUEjn(TkY_gOu>e}7|VBlJRLq43c{ym{^J z_S)^K3AbW9hE3S@j}E&_OA}No^}AgiYDGeVFd-YmS{vUBv^GS95>cXH6B;5i0$B(t z1O^5)lV#bKQc_AGM5sff+4qB<9})uvz7SAyT}O5NfCMHS!w8HZSOAhBL2;A^!9X&Z zIwBed1n74AtzKtQ%?g2-sAI-#_+h$unQ+bE0V^?Uj1XNJ0~BxqCTRWf*YQFw&F+|d z2BlwNxv}^S!ia}(jQGb9KVweMmL($rHV_NwxVsz(9)5M~03DgpBWg3OLIKiN8Bv?# zzD{M`@K=fCL{9F840(Cta_%<_siI6XFD&7Y>f~6oC2OlW>72fbac9otRFK}ex+hfR zr5XZqYP?G4Z;+FWsTnhCf?ONL`#dt%~KR=!xt>=q*57>}X3t$?B zE7E_+iS{P}z|6#kPtGFl5EEr|kANMsaD zgo)7&M0BvO=mpU3bc23>a%|F3(hx~RLZO5#+s;Izv@q4U#=(Q#2P-SL78aLW+a^uY za^_~|o2}0F)=stDICbW1z0z>q`qR(9BwYLYjq7i`{p*Jh?zekE1)M5_jc~Mcn5Y2Feey^zEae??5htWDdSR4k-_d z*GI{tM1Cj3A0RmqjN_4;SDb}vWbOR9>Qz`^{akwVx4ItN!h`(5gAFqPF9#K6F6(UG zkZX#hy>hViczV*3hc({FS2-9kDu*b#KsLYRfgSD1)F-LnKwa{o*#!V07_Ei07=#~? zTXr0~)bDrMXfO~JM8MIZvIv}OArY0unL=d9&@zG$AP5W#ArT-s6r9P#5LiU(fE=$n zM&z)Q>l`CG~6H-bkBjph-gNIt{(Ac(=mP7_(YIQmr4AJzlh91LwVq58 z4YC6RWcJdGEk>pt%|Qt*ael)>{Bc5aK<#93Z8*h%@=2NYxO@xJAf3o2KUJ16`7xZ| zu+l_$j3W3gTJNuaJ)&)gCs&UrXHe+pE1sb8g22zdc)U^^NgR)+v(VcEDKPy{U~Eaq z$jsSUQgc`~TaMcxr9HB5ATSCLO7(mGXLs(pcIm0h&sA#U&BHw**cO5#I^!~Nv z7v?|5v|}N+0rgv0B8)6ejKB~%{gV*DWPp`aR^Nxl+}zi{^E;C>OJRrrq1X2Wn~*7N zwUt!La*Rf0TLJ_lFjL@pp640kN*|b*1-Ck#kV4i$^Psb-tVXTwmMRQ{K%@gd@GNj# zyZrPEFHY2|&7Gjx=}u08vMkbuf&9QjDWxry<65PPLBSG*u*+kOiSens*RQ_!+8e#6 z&NrLerr#W|if${Mn5au43c^aQY*+_@4<3~qS#m7^(uVrIUJ&%9kd9lHLL!Q|qhskH z0D*}^Fs#WBLN5q(XqcH83~{+s63Q`w4s>Yipj@t%97lD0%>aM`5QShO20~`0Xj2#h z3KU4OvpE|RbCV9Z+3655fB=rajk;)13gtvqVrl%G5;*yCfGLg>b6G+Bh*Y1W;DOvS zpq+bH%qGXlkA}d7e@7RJ$$>C~?O3E}sGP!pOCE7Dcrsht=WG1`yla?xcvQ9HYd}5} zZieN0R7S2v{yM6S3!-`iodpx%a7npd7lW$}F#<`85b4vxzU{0(GT%>(4k%Y)7~a0I zdhPD^_Fn7z-~Mi?TJyRs5Q>eDD5HqRkrz;`3^*Nw3?kXkPHZTqFghXDbzMY3f|0Zd zNLfl*lC&|Tb*NDYCJ-nX2$%qc5E#`2)79r(Z^bSZm_97%o8flD1eawiTp3bK)?1>K z>G038Nm^N?9YcT&Y?PFSKx=~l%NH*#oH}nQC-8fn*5SjAO@XFbuQ7n5RL=`SFPxZ~ z8LN*ur4lm%lCXsD_kGXX+T2mDTw0i-YT0)xt^LCt{cwI}cFrzE2l*Q9`Q6Tb^PpZH zd+wR@XHK8myt_@LL*KU@+W@&0x7};)>}_{i&2!y8O4MY4gg_*KzzbIHt=;uZ~x?1A5Kmze)$Vevm0{g3#9}|B8mzSn5_0< zq(xYuASNb~LV#3Eni(w1GKQqG9M{!acRO7rM7dHz6v|T4#(v-v^#OpGj4_BH;<*4Y zbF{UH#ir8*?+D!-LjQr+H*KZe{J>#Q3CLaf8s)+COUT?`^CsElfOp@nWqyQ&m&z ztLq?10})8&Sk;M1E!IL*vQ!}B^yQAaV%yaU@3)dDa)~K+ae+|6l&6%L!(1&3>l^<8Xf`zNCXh2l52<* z07ywdz!d0E2;sPnG1`(sir9RJB4Qhgf(a=L5v5^dKuv^z2G|e*QOF<#AOkTFg+N*W z0CUdUr?AyM9oYkLIX4C|OOZ>K{af7hkx=}|L7ocRq3L`oxQAs7=SYFUPmWVK!)4}b z_UJ_U+h~kL(|=}_ZHOrDn#18wb5blf`^l1xFmXTf%1hv(q*>O*?Zk{9AR_1&nn`F|qeB=YJ#g#k%JAPnr^%C$Sj-Zlszl*LF=DgZ!ZB7-Ud zBN7t}gjgph{VP&GAxuj{h~+PtFs#-mPn|kry?yP-z)xTQ&E)jd<+C&W-X0J|mVQJO zDJW-V28oeZ1`A*%B?>`g9LG{pmE6)nvu#;csZwnnH3QGcs#1;}dSMW1Atg#xsnv-o z^!(5dhz%1fDFDG}vV@9D0Ys5C0COUrlfA}KdnKJ**j$%(OODepN{(6X#fFam%W+Ne zi-8iSAe2fnBUpBAV*bRbO8_$T+wIog(b0ipL%m+nq2KOyn}_?G8ykoFdx&H!)$erY z7Z=AS#saPT?bgP|!}h`cjm-x{FjjNMCM%BZZncka#X5KTY`IovATJ0G+nvzpQ_E*- z3)Ff=z@%+%XlvJYO*2<3E_k1O!5)v$>EaB@Q42&W6H5o0K$pA;991w*N zD55}MfC6k`3CSQt5E!iq5eZSCl#XSX9HpXz0VE=^5dboZCjr7RFo9=C0BADFA`#dU zfFWQQFT;tsdB>7{6C)clr#93^^~aZytC^-XJM|HbB&+ww@7?la|zPU5zIzL#%q*dl_=15W!kMZ!m!uv z9337W_??ap!|u^hyVcv@-}U@n;CVo%*F4&W`}?*<+LP+Er~UgYx5gXd(xv6H1J&_~ zi|0<3>*f8U=5OAAe{*|t|8Rd{ex894MaXpO^1(1+k@GH%L?m+biNXw10M@Zs9JvEr|$ONel7|#EgF2Uk^9H_j{+1tOOzoVzQ)2VU?6Z*{a8+gj1>1Y{#)&*Vjjm!jkQFI$dUPT-WdW&X|J) z60NT1xei#iWeYoiz%AFRwJHd1H`|CtAZTApDS=rDVT@r!A*0iDlV}tW?fXC|Y!Sgc z0}KzLqERS!7wj<{LHs`k0stWuu@=%IfnKY%-}Ik+VWuQxzuVj1-O@q7)9wK2 z-Oa772b-Y|ELSS#vZH*j`{3|M6O;CBTkPx|93AeRyLcw3>-o9K6U(P7^-2(ivQ%1_ zTiDs&+TPqcvwTt@5QMH%o1Cl*Q3K{640Xstf+5}M_1k@qSxT_RCmITcZHe~L!OrGE zcyjUfty?!f{_tpj&sDHITibqkfXLFql51-+mJ%p|$XEg`OH`|_W7(kz8PT#;1zj%; zx~)#&Ya)(a{80+Q1O&hmg%I({?*h?MBC;)NA^;F5Knlf3hIJ4s$0cTB1_T1o+DL%} z$P5Mq8LbU7ff8f^0J3J#3<985!c$ALFFpU{*T3|o>B*|sJpyI{f>6X($Si~kVs2a~ zP6_G0rHo_p{E^#3mI3o2wnIj=n8Nj7*E=L3&1Mh{Y$ zn1BFOW(z2~o)5%z$u&XtJh#@%32ZIWQ52tV1+4dMAG z&eiITezz;6Kx9J(BB>@4S(mt43KWbiqWQZ(siY9ng#O%gW!*fDoxMNxTVs@{Y{%$*{W16ha~-e$961+ei#Inl8kZa97vXKIc}nK zZ+z@RNSXNOjF~x|bQK+c6J?q)eL6YI?M#cxVdf|_12Uix41yVN+`8NBSzjU9@3l9# zHn$$$w`@E(*tZk_hr9cmhC?OMQqpzHpsd5ay@y+y^|A8&;(WVxXecm2urNRGlq$Bc z{XQ_U1Z#R?veP^O3O2SLR7xeKT!Cmn2qAzOnGsl7N^9QQ+f@z`T*h*SLIhI_x zd24gyVXw2_+1pb@wTi7h-?lOE1186EREZtOmV#L-S(&UU$97x`fyrpcvc|@1Jum15 zVXyDGmJ$NV000sofB^-YA_~p1*Yd^pj7VKXvMarLf;^_4}PbYZLoC6U6S% z$?n;B`()H{3DQbXSJtsPRG72bq$ut&Hi7|gd3>t8c_1%uumJbc+%S_%k1xEK?lIpb z?47BN$P$szpt9yE(qB-i1Fw_M2TC5bDJ>_)M);~9OY?}gkCM!v@5*{3uhBX8-)JqC zmW}`ep?3z5|De67_!iO?_=02~*d(0DtRXV;@0dX#>M#(Ndf}-T+DH9gzy2B^KK0a- z<%;NanvPPEgr<-pW4!>1L?#MAB%)|eZWyGHmL(m_GCG`?m|UKlD_OD=8U)zdZvFC| zcTSx=;kvbUd*8JrATcTw2+Woe5T942wC2f~nF~)n>sA}S;R^HQ`~t8sT6bD4-|KdJ z9WWprtJi6}jk4DM)cAs1E=wWjm*$(zBS5Rxs579~D;phxKuua%N{8AQV>=Epfk-B+ z(cXkap+*yQft-!6NWP~hqyZ+{fz!q=j>X)z;%L04vL*FK!o=fAO0OO4?Di_vnfgTa z-PeEd%U}O`tTIN3y?*oJ>E)o`4*edHHb{Liy|6PiIcG2o!k|*BxVAkuR&RHjt9RE7 zso8l!Wt5f-HJ8Uq&pmnRx%1~H$HzQlHn(>V4%-HCesKY!AVMGkLV?Os_IRUOuQ#NS zq#@MoxNga9I7*cq`1sAg+FD)R*<7#J>{^M5!ctiP8)H~0tk){GEggk!xole&8$wGE zv#n*R?kvqM-d$f~2G@2F2oQ|mKu7018bgMd5Kt%4NQ_~DEKs130g!9ieyA-=p+J;8 zHrc3;O|Z1Rja?0qrveH<4P=Zl28iM&FDr3!y0N@4d+OBUnKO&0mKVpz$D}ZRuhaAV z(C>#jWCkQoqcSB1m8eUT?JzlsmSC>JJbKhs7_bBKHQQA=w9K1_YR6EZTo-ug{rtbXRg8Rme3Pzd3G9U3weGP9Dx5R);sQ<73LvF+HlV+%wn zga)!K3lOL3jrrNJI}Z*Nh!E)Gn^)ia;QTkg{$jU#$jA(2DP@-&DQp1Cvdeo12X|K= zuCLvnn45j?vo+5^KQJMP$$G8PsJqIo*DHb5%vdplvj)M$+LyZylHk)|LFq?AfohD;CyC?Xp~g6TNg_>)YM<8~Ja zkemn=<0MQHaI6djrkk;g-GDj!0w4%R6qaVgs7zlUw0ciHdHI=_U-7%mAO5>P`|#?` z)61tCv-Jz-PTH>3Y&MPYJH4)80$VIiPEAeDHII7rYNb?i#%krmy}gaKwO+4#?b@f+ z@u|7_xrxb%lc!EEEG)c=D3?oN=mU$u_oPw`1QM5*Pw0TO4g~-L zI?4v<``yFV!S=OJKIm+2mRvD5R%YtxgFB|fcl=VEM=kcgHSLjNdX%$h$vj8BCk!&3`~Y}v_XIj1CR%SLh1Jdp->80 ztJOh@gTrRC-7^LdP#Z%!3>h?l1SkoZXt<}B=g*xw@x-~4Czj@?rW(pZuh;E&c1#cu zN4kQdQzs$sWu74WJe*Gzd2U@`l%U3ee~*Q`sn|^Ut6&Dmk6RwjH9?)f1%CbQa4wGc zjU#H8+#x``7RdlG@<5o;!mrqvgVGfX#U}DSm*}ykm3$f=dNuexkNTPK3^+c0vI0Ir zqwrwjW5_*T>F2MQo(z@bW?_ji8lEt4)?j(?lC@0afGGf2g5UE&&_uoQg_mFb#V>#M z+FP$zs^$5`X^-0g089!A2(|GIv$B*CMp^dM> zJvfjOfuPgoU%vPDv(H?pRjXmpW57<&pz*W`n(a;yh_#2CJG=XPyGPyYYoYPm-M%)u z?~&t3yW~ir8sqi3*}1c4PG7!!xm=QneD?Io3r{>%sg+3wy-ugQ8FWHftB*0-3(FG} zgk$#~JXpWYem69S+AvD3P?*pMsQ_6>DTH8RDI|*M_+7?q_{Fn>cmX`xU5b(86{k)_ z2nmElk(=M8;}s*Q8p|320#=9s7D2kTrKPny_glU0++=O>#N4^_%Z*0W z7>|(+nlSVkcyg>UH94`gFuk?ARja$5eyi0zx^?5zpZ@qS=cj7dudeh+*BXrL7rUX45)F#gl?TnEqcayTqLh~9Fq!6IyD`-uB0yQI)qx2CnM_qV{pMk3 zd;jXk@7%k2rF*oc5FA9-Ub$iuva(RwqFQyzCD$!GjoO%!Ae1nM97LgU3><*$gLz~iJI_!_?vIh`m;m35 zgh5(T56B$Ijf0bYE;G=8$c$of3@U(;pnr(c6c-(nY(QuY{v3Lgs;ju&k`5h}c2v%T z9X3MQ3{iqZ@AE?Xk>Y(+2ASXDVHqmY!mP=I~2ITd@ppuG+$v~yr@I&B`?yPU^Z0~9T zQ)3g0(-XGiET6tOy)aWPS1kbF7y%N%tUlO$`~44p@4H|2Bp)6%A3QwRZMM3;=?6qw zZSHM%y8#nyZMWLpjs~z10)}p12S+{t$cG14KU@9qqtD)Y=Y3m&t;#RF@WQiC9ZXM8 z+O9fk?XKTnwJkL@Id%Ec(-&r!rNal#ezO;X?=vXNc1vYP0ymG2m<$?WxfT(7eUFKi zl*C#H1OO!^128dw%*DuywmlT)k&v5QVcOQ|(2dW&fn?-HqmF|h^o^;ERc%?HIdO7k zX37RQJUlGBR;e_%v^Y0C-2f@DA2^mhJw7p6t_51x>a|{AKKpT0tcE>!1ApJotC#Wf1+plhO9H^pA7uYy_oA$MC6dP-*12N>3bi)_2z@syNBBkXU4{SZ2O)kP_mLjDrKq0Sfy60lq$}| z^mwgQ4*Gp5CD{^$td}Yeb`Ls!(DK3npsj^nYxH{EPS^|jT_UJjWq~p>h#7-O43aG+ zB#U@mz<`vfQ0dSQ4G3jhPMHieJ6?P1V7Jxv0R#X7lx$d<7(2bZc<$_pbElV2EiX+@ zHIxM3>opG!g3t@SJ^^ZN0E97!Km^DfFY!bchyu7T{LcMIyBr|5mn1X7@2 z?WNd2$5E8O@<{&?(tmV5$J%Rts|zt>fB{jR)ihMgSpX#NftI)T1KTD-0k&5RnvUn54icVqIi20)XhW z6K%8*LP#M%ghuZi?#<6HUA*vAePV_H_jk7L-dlgLx*6#1_{`Ge%=lPiqNl@Fw;dSp zSxMKTZhPhagCjp!xqGkch0Xoe#KhdxWMy+}bGKy-m?@`R;jlF3p1*i@d++cUKYy!I z`l##oc6Qt6&Mho2&iC3ub*6Ff^7Auu3tm8Ti}SYYAfk|{P0&1Q?rd!|_qV-X>;3oM z{Op~NI=ct8nlsTTqwo2?*AF!M=-9Ge8*^Q&TCLO?jj73Tfe-{eX$fVOn52(Zx5wLU zf8pf03zsghuW#<{YxSwx}VZ8v*uqqXPtm^pG~ zCKf{1tu&nGx|;GZH51@QjYxdtX1 z|C!f7BP3cb!PuC^0>WfE#gJ>IAzhGEZ-k{hx2pa)k^LAtGnxB0*Ak<|_TZCaV0lpo zL*b)GD9cAsGSogJ3M^`rY{Oo}+X$TO!Zpz@eWS|dS6=?Y{d@P{d+)>X$%#An9t13w z)%^I_q!*MOON=Q6V7>Rjhwogu-V6M0FYI~7_d~BAl7{-&UQgJkPd@p|OJBHh?OLn7 z7J4BFp#kpPfB4z$JLjMLUbEd_eXxIjBL52`*;)%}q24pbN9%Vs96bCCJ77~R4 z6c`zf4_fVmR-58je`T}p^~THY zM7?}+d7&}hsMW*J^Zl^Tf$sLZma+^okwIiB6#zyD8-PTn#FHm>Ux=d6qmY6bBud68 zEOr{TR7MUz%Ca?SZAjQM1UWUgbomQk9IsBWV4f3$S+%Wa}ih2z#~6D z-o0{=q~p_kp68#3+{ZAQr10mA67i%&B*F;0%CLIfZHU=|8N3nR2K!OZ03i(h!< z&AAv`yWCa;c##cidII ze!typ-@bPHqmMs$>gne%ojd#B-UH7VA{GFhE`N68<`=&3{Mv(q)y?g;j(jdDY8Vmi z`icDuSRgWi6j88W5&%pr0E|IE5Yc90CKZ1ylmI_qf!yskw{|{=W(h)~LQ$`m@2;<1 zySpMK_FA2piHVu%#>W2s#Kc&wQnf8vD>=5Z8{;K~5*Yek55W~uhJgt<1Tp}Kf~AxI zlx`s>0%n#dqb*-3KnTIiY#5NWMq-eTWjl@~p;j9U(LHzeLZxC~xqka!{^DOrfT@}3 zzx((9>p%FD?*Rz#53Yao=?5RadHeS2M>lTVxwkGrb^870e)FgoW_=h+W$@l-tL^>n z-IeS`S*{7aWF04M> zym$N4+t+Tj_qJMxTdnO4N0QBAvTm2vRN(t2^vF=4L#J$)%WkbwuGj0;T2)z=Qc~I$ zqjV}ZOJ$+0CG4$i@3ni4#S`ECga6`*r(a~vVxe4d%1=LW>A~v7Mx|!C_RXs|f*_Pi zQ5fnFj0udAfZ!-(1|Se9q!giHrG!&*2m~{SKqP4S#PWaj5B}u*$&&(!P2czZpw~Ac z8Pdj3sKYSST8Ds0k({SU-cuBBDhhIv27oAvqQn#QSV@`z^qfRZUlj2A=M&ks z@aoOmq1O)l-iIH&abjWqnM>#I-nx0`?!!K?1rP$PJlJ^u!>cO~wmW_bv?!@V#5F13 z#-ab2fdMHdJCe4jiG?63BpCw$Ou$S+2u&nG08li`*M^1Uqh`Nv^!=?S0o2Q~)%Nah z?%Y{>IMt|4PfuDBrW#|7TIJO838&=fFesI4j$=8>_B=o6`+m?vAOd1$9fq2WPy!gF z62K5@vMfmq1T3T_l(Z}xQMH;KrL4)xamT4v>-F)eDORp6?ZeLQXCGbrvw!<@WT?&5 zPoH~cVfhk~zVhw||I7dU&p*3;edFQ5&h9}+vjj+E7DrbJVP>+S{jlc+2ZwF1ZvbFo zY;6Ca*#Q86&W#7nmNz*z_QH#omZxhAON*10y0RUwZ{B?Oot^s|6n4Gle$}n7uC4yR z|INR?`r%b>A5|S#oE@89o-%%51UZt7q<%l}eb2V7@rm*JSaqyYuGYugQb`m0z7Gse zxm+qaA#@IQk9u9xY_)}5`SO>)_2qATOM(-kR*EMVW^5tH>(=3e`wzD_x3+ioclK*e zso(3hyS)(DRs_t5vScZWdXX7{jV8;rLX$9pkYNyjugAt3&HYWU*8yZQqz#kNhB*w4 z2{kiBVYZo>lJg=UvUO%`mBgRJ6!}Lp;dq;EK?oJh7ny}VeT?yl$^_oy24nV<2cC>b zJ@oc5lY$ZN9%p9Y!Mkj&E5DQd7@3*WJ3bLCde6C?Hk`B*7MiFi?MAo72-Q&} zH@lq^C+4S)CR@$D-92w+dgrjc_0&^O>}+oId%?=)o&g4ccDMKO)vN1UTP7Ynf`A01 zUU!i@cjP$(5FH@^49wA)0w6#M3BVE<5s?fd8wN-=l`xWO12`M|jkHW_i%Hssf0p+O4Xg79Gjk;v~AmV-0^zZ_#QDC3Iosc zLLd`LX-g>?*mfMvTq@O22@rOzK4v*?KQJesTjW5EH|k1?o$ak3|LXN_yY2bj&d%qEHJ`m_J==dEV@sOkNG{^Cd1uiy0z`8tkLNyUy^th?X))_2QQ_rni9e)*Ya zTAo)KtN9;(Qgtd^@*1|BT$tWmU)$f^`|6io{My&QvV3BCa(ZTAc0zLL*6kZ>o40${ z*FJggmsZ%i@bu++xwhD--VtHB?2ftiY^@UXJz~&IEZMOwAh4uxDy6BZiShCAN~PqK zN|v(vejpT9YIVz&erS%`!P@s}lrDai9%qLNJc)Fo0!SVPF`Tv_U|}w#ftpczAU1(Up&v z=N5!bni-4DKRp7-Gl|$n0S(;p2t1ftf@4 zI~~1|06k`V(g3he<2nFjrm4qVsqn~ahY=_i2kwu(GMjMn;j!69fd|sYOX~o@u@?{~ za4q>RtyFA$9;7E4xsN3>6^NW8=aGpY@qDPliMAW;+rg%Z-(_8pxr4(&;G&qBCK^q-~gZ+Cyxvjn{*tZL3iYFxC{TBQA@4FJ*2Ut`JNB zOrV(}?EwkuLjVDwljaEs4w~U7w^quP>SVoME~|<0?nJ%T?R9;>Uv;g?$+4NK$?55- z6AN>dl4Ai_#;(-LzSnPcS^`mPBZMrKOG1={TSv>@J?!1NyXAMi7hnA1(=UC)wjHnC zy!P>D|KZPm^wvA?ghcy$hYZX*oSvRLH9Pasjcf0{d*!XSKI(YX>xU6-DezA_Ys`j= z7f*iuOD{hA!b_{`Tjrg&tCQo>>u&6-a~IB>JAdlr;$pd0-fHdN_{>^fp8k`+_qU$B z{B*zFez}I!Ftyh-MEv~QJTfe*V%*yr4FMQ#J7oMviY~H@de&4Z0x9@9U z=}OlvNrY;Rn7}TVC#J^7>SK{EM1`!B*2;1!nnOfr9ko~Pt@bp(^5t)Q>kt0++=*qw zM4>KKO0K1J(EjksC;!7g{}(GOH+D9*Foas!?dhPVTwzPcAh6WT?2`ac3LV=DbYMb~ zN`_hsA&l0Z9|oc6boJXGe>zraeD$keBCsel29S(4hRKjICNlL9Q6lIWS;W%-fLJs^ z3iz{V4h7(sM|a6k!gP%1@z}7B2Baav6Q(Z81k6zK;K=@M><^rhm1R6aY(HkQkoz$C zi-YfmN=@WeY(Gfn1elx%7A=j9)*&M_00N|YY(~&FOv&faXve=Q&H##kvd>Z%S;T?X z#9WfJ$&;;UsqbxWk8g}Njv*!U*3JDppcRIg43Fv9ymCt>Te-ZFwomq@CJda{<&1zr zh$xl~d0vM}f9aJM+d=T@jkWIn5kyWeK%I~~+wCaVP%{B4;Ejj-p66X!K6By3>CMun z@AY=Jb{_8SojZU2%$ald?r*o&9vA>2MW@>f0#mGRwx>K2)3HM~$0IgL#|T6W(cv-_ zF>MrEl%pM`L=bK72VxKaX`~^Hb4EzcqZfe0)a{4e{^8!VXq*T&U zU`xkB4s2gT^QhNvwN_UiZf@*8`|=mQ`a6Gk_KBx#%hft07D~v__ikUi{XhQm|L1@F z#m}o!wcBCC6|xr~U^@&giMA?L9OaQm#^?}?!-g4ADjA*Dg8gn_l>`z^Rx54KdvO2o zm#_Wi>1QrA#%f*aGl15l4KW)|lsy9=#f%g`h&Hcd2CcFI#3>F+#&U|lQdGhDo0MsX zM`0QPBpr-clpiUtXQ(r$f-wE(7{NV4c4j|^gAx~w`$KZ1C=8EP6^Z9aT9tH@MBxio zm_x?d4%KAbCiO}qs{lY6g(WwE0?17p(zf|r7Pg@|T~^ZPSxd=v1Y&-clb}+>e2p^9 zp4z+8)*co2v_OBJD{@*i{+l%3v0ak!;*e??o>XKsrRXFdQ;K7(6M42EM~5k)F^14s z$OgiaYa=GM=*00$3dzh$O05keAWD?h#@6BC(Pxtr)6%IP9(L?z_u<~wSHJVkFTC`^ z-3Qy-J9|fc-w*}94zs{k$tpA^&6#md5;-9buE}X&DT-$;ad?I34MtUq#5{on#>lh< zh|H85wF1z@YCup@cqcUL54N^<4}>KgTUyfe`m;KypkmMOR?Bv+GobJvX&5GdVjpyWb05 z`}xoQ>W#O3FTC>MmC5PG#j~fs@$Ij?`lVMMuHEl@{Yy_hWh;8~tv9Z`|KXL-u3x=< z8_{xHOUlaLes^hh;oQQ>x8M1A>)vKJ@b?dou3r6cc4i7KiH@_^@jMMD&z?Jd;S#d9 zzqcd6)GDQ^xfy}nY4t-xHh_hWEV-5qpIy1xY94*~@s*n^4`;@wpZ?O$g#v(yq{RwU)p5Ka0At!-CGh{3#t}f1F~%?hCGkU($zvKLF_Qa~1M)-gc|@!l%#Cj> z+~wnz4Gq$PTzKS|PpQbBCfuA7Hd@plkAp{o-l2!X**x+}Td62MM}LkgR{&;$ZNw}I z(ioO`wUUe2P_UZ826D=$2>&EW%5S1Sq5g5K_|N{>I|$;uFhfR`;#| z0C0ThcC^XKkO5#6A~Xg9-vG2czrDHPAlhZcLhT)OkDB`8gJ@@O<@Wjm%d$uZQ;o6HCr>DZW)GZtdwh~m234yuH9u9W)(uN$_3ZP{)hEZB zhez+cdqtA^H~;Iux^rjs=AApcyDbDuNF_mrpncyE=qFB`bZr@Uv>+=pGxJYBdtrKN z${5yRH_+e(JtgJWzVf9%`rU6m*xC5u4}Ws!>fI}MR#xt=yTbV||I0sFUtPO(>(1=L z!c)&)ZcI&Y@9v+za9$w&#~=OVhd=y_Yq#$190nTT$ukqb`@OFSRCjLP+TK{NSL-Dq zws$&TnPrme}+4&OyQiqyY+qT{8AAWq}YR7MW?aN7jSgyM7a0M=`k348`u%r5RO{6SktQ827e@y~M_&GMZ^!(^(UBF=R5CA?2E;<%{*Yqn;sDGBTDqz^TDFY% zHXDX%n!GfNAXqG83dOU zhmZsM@w1q=92C!}DN52Il^qwt#V?O*yo|`-;u=st19OVp{{I0_-XX0pimL4Kqi7!D zj^ewVG%tQI$Z3#qM_%dzKzhs=qZAd#^7>r|-3#Y0Tspu0_9s`5v_>F_f&qX`)Qn~%;BRSW84=#+<1K^C~PEUNWUStvP~V z;B+FB;iuTdA5B#wRuai<0@HmZk)sa8^NHN#4H$tEV-dtQB)u^u^F+0_cd)5LQjR@0HTL~)fAb&z*Z-)}sBP~Y`mJ5#d(HMyr{8gf zd$7|jDVxZA^v;L(9v(FTe(>t~|MtKAKW*H5@ZbH@e_E|pO696@?D6rjPRslF!w>)M zzx(s6pWXBsG{9V=`a9qG?%(;-KQcjhvXZp-l@x{Pd;_} z;6Q%wZ~y*t&%XpWW}|#rr6fc1T3{Ct*PW##t<=Sz^;Li&CyXW@L}G9uYBc;lT-Ch>mV?i$gnXG zh4%&q6p>jFxo~t##$m}#Za+*K1R=c!As!Blr2G!oM06MY?MDyd%5kM4ok#dzZz|kR1(S6mnOb{Nn`wZ~eyC3g8*qWGZ zw3_{$z5ReSB#1jg*@S=`Z|>)Wnh3j#XhM>)4FCdRHkRX&iV!7^ZU_JoFxgzsX&*5_ zbnIZ15yl@zN5)cOmK9mk#m*!MD1bG?ezVU2?be;Got>4nJstEGW)_x~7npn7I~#t0 zwR%+t!KF*ju>&1#!cYe$K*V~bbn)UPr{?zheGMR4oL*ko-Q9TbuvI4Rh=Zg3O~)?J z%*~g^r>HmGZ#ED1*Kgf9T)n@xy>$;=YiDySl*%gGOI7y|{`B|eXXfkG`swq_Ug&vY zNGR=6t`$wxm=%JF*vfc*AZ2u7D4HZ(cFzlYUQdUB2xreu{M|qO+s{7vWVhS) zd=FTUFun?ebQLIJn?x+dCzdc2#C49B@^a{rqBq7GDPBEpx-c-z2PNX*N9hP3&Ne4P zih&YR*b~d}JX$J<+JWgoKI>F4Ji=Cf+>0bn6%m7Z5Imek1l(Yt1`I`vpQ}QlbBpS1 zu#keJ942wFb04o;)4YbF2IiI7W7W?ndWR{@YwldMz}y!(?ijd^Q&x{SF(~1V9IwW^ zf>9s}Bx4Mlaxq<`4<@t4WUS{<7^k(*IdZ2) z$7swGBsw7OOF%#Z;7k@o-y;*{*3CGHE*$MoMoPG+8)|Ro@czz$1h{i+eSD&Z>~;Nq zrx#AmOr1MGw%)&~z) z*L$A+`Rl)Y`iIZ`>HqHU3D;`1cJ_BR?%la@^Ul4ipI&q9l4IF-R<;gW;nYO=cmC-6 zll9Wa@4kK5*M?zZYinzB_r$^}ZP>AG=~xR()0^wNO$}8EQ!^DyQP?>+Xtq{Y?;q{% zKHPjbu3)k*Po7;2bYGybq_9gihcGrVcIx62!l?s*rD}c%w&QmD-NU29ZtuYJJC+S6 z=jH>iwZ68YW$9Z#_&d+M@D*jd@(i+4nn4;00{{HUrJ1=|z>)xiK%JxRkN(|{|Ih#3 z|FzrP6HAQ6oHor9*=+c@Sxv zJa8RS2=wkK;n;(gXxd_yJ1B!e5HhpDuA!sUZ>&7=#oINBhl>Klq??#KLYgYK?pr^K&OIJ^7?C`Ws*Q z(igw{;@sktr4*voZ}lu8yM6!Dm93R~5C79&{Mq`Qt6sks8bV+TgaHBog=jcyI!p#r zbOKYf1%MOn8(A3#dW_SGVf-~dtm-9P=4pa1M9x9_a1ZS?->fB!%196WsarI%ONZtd>xZf)*;{K>VoyPFf^ zW5%c5eQ)XH@;~?|-+$`N!ri;;S3dmg@SyYA&3k)0+wZ>r=D9Pcd%ccpSzmkk73qi9 zu3q2S+uPe~t=zo(>tFqB?cUkD_g6mt^wT@HuL7HIfB*6mXU?%?C5<-54+EFS-CAX8 zaiKmn10Vs|80c$bJ2g#4gV@^Gda!Zt)QR~MwR*49y>;W(si$9EIRBJmHJHFeyP%nL z7}&O$t<5n=Aj52Qr+fYNkN(#``;Y6}yAHsZEzyWh+pE=GPnn8S>IH! z2gKk9J^~9V8HHif52@$#WL+%J&$*7;J31oMXErDV7>>^G!Fbpp08`ElzrflU`~T-W zemLQe#Mfo?pc-YzP8nrzfMpNzvO7I>2nOCo4s5xsFqg~FV8)b%A9G<2w_*Va4$eu2 z%g$#qP?2N7W)ck)<2prYF=r{s(U8o<5{e32A#x#=01|sZrYT2OwNSg`Me#A8{WUL4 zdny(_8Hpp*JP*KynC%L57f2ea!=o#ea>#J#3mow?n`!19lVh%9LLr1P#&K)qTBF_T z2wh${b#h{C?4a2MfK!WS{^39QM^iKPiPFSZzww3oL{%GY3<)qeQSEfP?fcEAFE1?4 zO$V**PwVRX&6^wBI|jf2M^ZS~v#t ztX!*&jn&E@UHSOlgSF)o^REGZ?7qLYdVhDX^Q*sl zqgEcT)+()b^WnYNwWCD<@9v?`#|#w2+;(yFt0s+$isP z9cmu67SEiXoS6m$GDb6^358UQAcO+2L}a-mLWW-7?{*OYDi+o%HU(M(b^SnUu9V6p zr^G<6r9cR!hzw{lVF;EDN?;foDFw6XY3OKQAlu5-fv?bJFvvoK0c1v`$iX-6Voq0w zVi}*9e2M`oBVm&vpdt7aXOd0bgXF5H1D7Llo6 zUy4I>V!W`*Tp+7R)!^Uber2BzKSKaeh2}f1ynMF98zKrwJ2%@ORD{PtTF6!9^XP!T z*(;OgklWaRX>95=O)BpPdEl``$)uD;X&`9 zxi@oax-v0y=7~!O@4O8FUw-9FfB*0Ook~R+3atSE0RR9=L_t)MhEmBo+&%o@qYrj> zwma>^xw+}SF(17D32M_Ao9Z4Ojn&8M_3_QUBQ}8mP$-BAlVw{-kdBPbXXSXeVNRPe z2o$3tu5dn_NDg&nhJn*z3IU>vvY~t~ScG?e3m#w=SGH|ARmJlcm|ko;EA1TMusC+qr*W+wjDx z`ZJfGo|~VUofy{|iFm3}N8tuuSgVa)ynMM-w*7WTO*mw9ukW8abI}p7Rc-XTw7a?g zDb4M4iKi7&r_)+p;ZNF=%EMXi$JGt5fG^Ery@BfozHNR5DTtYxyDXK@s*00BY%zM;9yv4Uk7^%q|hhTNdgN@p*C@eCj->T!Z> z2qouHK4c>k@|7EC`s@)875FzQ{WH{@-11O@A;p^Wx`N!#g2eu75s^Je?B2sEQ}u!= zx&??wLqY8435E=$AR;rHkO;X{o%r~(wcW5ffAZvoOHXWV?~PaMfBFyqj_o*i*Y9s` z9k^(&-CTX|qxZaSx4pM@Vrf>owQE;zY~J5IduqY4WYF_1VU}hl_I3_?#!n}_kZ@HB zqGdcwXB2V!MSgs_;~f&%mJtoHSekBHOxbfJrb_cP0Lc!t__7d6<&tgN zzUPO&A0!cKM6B+S0Sq$&5V8P4Od;!=_gB||Uu*i*yt`?^rU5uP>3;KDUp;sB?9Rg-f%xsOzS4gB zQpL6yX>xL+>^jPhg1-i6SXs6~l+u}=ojZT&iT&N}-R<4V_;~2G1>)kVQ-aA7R{N-X zbaYT3AM;G_%G;^O*KW4&7IYEWX)1(U(}Ap z>J=;rzK$#o21_UcGbsXnXtp z_g0bU)h}H(=G^png;DJ9?QU&65X!vrwO5`vb!KDd;oI+g_};sp(4jF*VNM4K00M|2 z^)P~n2#=9l4tu4|im97u+7Jv86pi!*W|AKB=pb?oMCR1hhat8`0#M`#gh283XpX!> zC4fMzR4WYRdw$>ZLW=Q@6w+`UbtaM=6dh8IAcY8t2q5%K>%m@BTv>r-+iM%^i+pmT zI`*ZPUjE>dk2a6==1~)&d3w6>g{RNiCHo7{J^ku8UVieaC#t0~qv$ku^~PZr@$7|j z-}&9|kJl>)&7>5SXo_xqz%hTojJMi5B{q^{?7Nl+&bD^x${Zc7L#Y^lw7uz zBx8&w0v-5X;0K1ZKsGuE(K2kRl{$#(-uBh)hr2Tiv+edlV{$^eRi>ca7@wYBJR7vv zSFN_+6ZV+j*;_tycJajNxYYz8bJ?|pqY%vD?t^xF)$_edWo&Y~N`7$f#@)`|X4Mts zBN{fKZ3`7!Iv@lQc%jkSDk*^+Xl+Z!NDhM_42?j6#t2(mwpyC858FYdS{A^zZ8N(; z5E5$wHWV%QM_s@Xzo#z$#0(h4=T5|xz}#dq!`__dn9)}r3J*fBLC0{;1OHeOj)L0x z1>NJ&cyWR-db$wF*g-vzzZso-)(9iMh1`q6O(uquHALn#7EmH^GRMt)rURmM1h9p) z&9cG@l#FboztL;Bgn~FfjzusPMTLi{%pQt0^q4|Na9KjiaHkAzE=&k2_;_XS6E-UD zB}*BJ8OV05PT=>o`s(j|r!hH6WPRbq=fC;#(d!?7^3IzdQAs}W#Dx>TdunfE=fe5D zOBc_cU!Gy1U8S|@&Cgd#(l-=dz4GBl@4sscYjbB$8*N+4*MTsgbHt~7ARsaL57rMM znbAi|Oe9Nq7}q^rD@y8v(T=b*)O6Y)$v+8qMXVahXv3*i5D0_-N-5WMq$R_UJl_uq z1b~dPAi|6yfXK%*2A(++R$}bxYq)Xu;rhl_tx{QDUYeVm|HJQm`_9_E?FU=UUQbE- z;;YYo>nmS8cj3(R>=YnSU;s?HR-KrnO1Wa$Zs606>v!%x-1zf9|I1IW+}dt+06+mO z&eUFb?wN0W<<(cd_}t<4?)7U|n1e=r%J)4|rr8cq2xLvs8n@9BPy_2Q?CZeu$aY)+ zbNBY$?X9hoXU;gTtc;B_vC%A~)tH)^_7@0v?cqj!Y-)V^{<$YFPfW}uj+XJM(uOop ze{JRJ_U_G@*+;kj>Mwr%*~d2^B*zia0<9%1!|1xU=LaE>WzbkcDqxL< z*+NMukwGw&9NU(NLYzB)s?%yuG#Y{DX&o?=QqmAJnP{;d0fC}O-M~o3MCZOpCICzW z4zNgek3;JIfQXDa?#~$?3v+|wAk3I4Rvts}f5ahN1!R_{$O(m^8AP6m@=&jMMMM@! z9d?>X6-SB}iz6RlIOoA@2ykaY2eUPR{1R@QE)_I`vN4H@k*@TmZ;~={m_JD~lFUd% z4D4k{)K9c7lvQy!L=Wcv8&U6KXCAMDavMwl0MZF6jHrAeqdXSR$G#b@7BZQbA>`3c zQkb^fBd)Zu0Z|Ye1fe9d5SyC^V<#?*Pfso_E>1Kiv<`3X-F)NC-@NV zaPH#Svr8vldQrPhNf3cB3_kes(lbwnBu&5fVD4pYMnu(Y-P_$g( zI5snRyKDHC zjju@w+&9hE5eDAF)%$`)ui5dmzw>Y#f%=A8ZNJ;=kCp4aez3l>vik5rb8oNixN1V3 zI=!&CxcKa|Prmr#v(t?l8*lC5Dh2(i$q67W85qctXvoB;ED$3C0SS~Oj1K%>)1!a@ z%+B`V*6z;U?%w%J7p1UB8x!il7^hOI&rbA=SNA-tQm@Z0o;Z0{NQVpv0SK(51Tuy> z@WQ6o+3j^UKiq!z@U#B@*2nMNy>o57-w)ifr4WPANF@v#Vg^enqe87ssKZcOQVBtT zj7&gU6G7mUa!obSaM44?BZ+~cz~=BL&E}v0Adu(gotRNKp~|JgCL&I5t0x> z2quj&E=^bh06}oNK$jbB1+hOU5(>g4)fxk9m)YPOw9qE*Ed#rAcyxH3!Qq(*>A`KZ z2_p`EoDn|+Nr!~lakGzOu1o}_f?Ey7&MZizq>=+(LAjtbqojJyeRjAWgK3j=N#a!S zaU#Jv(IMHoLa{cFs4iqZdu&362ySFfO~tf%jemS+!6@jE7JzATOjGis$uC;GM+uYCE%OHZ7+ zwQ~FFjhpYh{b6H#tU6f|=z2Qr^}L%mR*=o?%uK7@L88WF?d4aV?KZvH`RT=_h07N& z)*IEW?FTEnE4^N~-)WV~wlEZuAPzYYOe7G2gpgp!NEE<8$N~{j_ z*K?G^Oh5>TLMlMf7@zdDe{gVU!oaPMO-#>5_%%|p0x<9mDpbOH@wqRRuUS9-PrrKq zXYW2-UGIAVC~%chQV`fLe$C)YSNF zbb?P~9N0*S#3;xh0tg`y1S)|>hlYrlSqf1pmxK^O$eyo_4v9cHl8k1GkL!d810-@Y z>s7$$Xc$NZSR!cMP zZr+4>FCa`X|416J&@?cL@O00{;9j=D>Ku0^hQCbYCbY%Pb&Pa9zK~3}J+288IKjvD zN)C(uw%6z{IM+D;eqC8e9SH>C>(|)L1&4b&wZ>-$; ztX@`M{NmTX`L$Q)W@k9m#u(CufWuH*j?}~--BAGb=HR;tqs@14g_qkq}6R0U{45 z03d+EzPVv@O*}^YFqs6p9>apEiF!DJ*V%T`|B*NmZN*G3^h zAxOarl_P|&y;9kknVV>gRRkCS!-Da@AzoT#k&;K}o+p_H{*8Z+ke-EkLi`6uYMRd}`j73aw8TvR56rf*4|DX#?gEJ( zO9&qBVP;|m0=w)sYISXh4D9Y4{@I`Xr#IewV}14h4}S3due|!rr=NY6SQ|}1Mhdho z%W-VdTBCD*`D_rt2k(7&<=wZhefr^1tKaiNLx47yl*PuNKud~f`83-iBT&Q=wn(Fi zj`+aj#F)tQJ2Ltwk0R=k1xK-dKyVafB4)?@B!H3@iqU%x{sFK6R7%*E#RNu&eqc1m zQHex6smolz5kMr%eK}(#=Z}_%l@kC&(T$QdOF{rb4SduNKmKg>_UiWZ)cE8~qv}>` zwmR5rhk9dXVysrGoOpV=RxjJOoStmds#QyZ4nq?Lz20GSf4h6sX?8kc(35t_R+cS< z))Wu{2mvB8NC^~?HC!M>F6tM%|+I9DbVP!)oSkVZX5K=mMx_a($Y}Yw$%o(04z%dY_v8Zi(1J6 zA(RjTfEkGi1qvwuP)aF;U^2=P62Vb+;D^G(iK)rP_~cllanxzGTSrRT04$Z|I0}Wa zEXicR*wxyYRjD)a=3)E8n=30TcMiJU<(b8&&s}Vc&3L`0F+PAqBoqLdA3Y2hgA-{T zNww5Wf$5|#8$@~Mos1nIVd=t9&AF{*Gu7-_Rz7AtG^k5rHjO_`eccAUphsOrNpcJ@ zFWhHNBdMm$6_NR(WVKHYgn9gIV~|{g0UJg1G&i{!(zH36lJQmeuqX`Sak6yy?cn#1 zy?CG-qF&<9pTUSMlZdI2#2XF^g#&Cm@TyRylwCNHd=bV6#H^I~J0>QI;j-WN#un;I zSo^!1AARuAn{U7V;^n8m{q z_5R*QXvhTGFi3$;$u?dH2)2}A7yxjzmM8%LqJzDXsb7LDVmCe!+o!;QfCzUZ#j8un zIqe7{*+m#Bg4kO+X}qW%DM}iF@-+Ni(r-$j>$<>X!oc@KVo(sRIWy)#%80))DvO3L zD7C0fB5me)s2JwBQKzO z`TgJh&e#5nAN(!14Bhqt3ZT$Sw)t`9@tOKB#&S0u%9tJ)pPAfaUW3$-m~lj$Fq1%- zM72uAWHz(F)G0gjcFeODK+)in%Qi_ggx5!kIUXfn2c=1V1Qd5sM+6UQjXY$JJ@!;e zYD8GtjL8aI0azyvrH~qn9w{kvNP4h}X}b(ghlZ1l&N}&%wLvkvftF3_&g;cgai{La zF=F6sBkN#}>67B^;6#O?@cHLbD7mC*XXaHxf^)E-7!oLp$c#dYZnxKFzBo16>2%i~ zJX~45b8>0!`#<>Jg{Ph_*Q)Ji+v|61X*=Z#X+~s321BlGRh0YbXCJ=*`r9{GZ!tg_ z1u`pu=)hJ3pg?FtjL13pt0Ny30SXY2lNCBZiI9vtVgO_j+lWvk;eXOyKb-4^)NqvS z%R`BRfCNW}8!+YIMU>LAgr#f%4#Ln6bfg|+vGa;!wE#^D>;Djk7maQx`cg!*H5R$> z7K}*DQb<9j&k%Hi{_Xp=g{^=Ev{u&Ej}DG*+`RdnuYdLAsT1Xj%^(6lC^^-h-w%Qy z&_G}WDk6iNi_go30VK!qyAcsMI$}Lh{vbk4PO0QpO8`)<)y5_#JMGrt!QSNLqAb}2 z+V^@!_gY5>>+9>+Z(cJ}oPFY)bR7a-E|o5h&y+&=g~8u82D_?b_V0{E8l6vhfh2;S*zyj2R-<%X}ac?T@(um~juL#g2x+ zMKoE!;i<;pMAYWcT|S50KLsX!L}@AMIJ~{S;AuLjdsHTDs4yrXKPX~pngR2o_fLVQ zM1U1%LYOvwz9Ary%#ZPRdBlZr$pIx$#e>K7R~cG+VFMB>QC6Pvc;@rbch<|MF0>|}vR4AIPn66_C=Z7Kc%mL;8% z3q(QS`2nTz=@66sX)!5jze1`x;+D+8oQx#_AYOXJY-Aua14ZzRBVt$x6vQRRv4Fxb zj3_+n!J8kieSCH8<15!*e*Wo~UwrY@`K8+AY^U4NUF!QLGUyXAiii-2LZXQyEpfD7 z5;-FQ5+DK@Vg_VFVo@qp>-9Q>p^$2BZsGdj!Qs)72?JSDItX|7_Ke>?*gv>_(~`%Y5COb!U+)2@%?hCTvo0jEp4Y-t4X_x zXaxxGe{ka`zkdDt&4-;jEV=7nkM zQT6_uxVc#H=()zIC!^|_2Z_Zj2WZTaCaN{pv&tPlVI{4msrhSEZjfO;WZxxRIKb^Gqh=HLH& ze|-A%N#$@rheCj1vZOG;%w&iWQ4jz~jt^T-3QO|?L;*}phLO4CltWJkzVDPvCl*iK zTe-8hzenT?SvEQ_;2$3CZf$OD?%qFh`t+B-@zq9Sfq=CkL>87HgNB7<5Ul-Pdw1jh z`@i|+FMs`4H*Rc{-7?8gN+^}2U{IDs(T4>q?s>Mwyr;2F&TT89!r zGrafFXW#zH&NI)R3Rat8h!Pbsp%8JTkJQlw6Oo%RW9H70ZokaHF(i;FfesY%dvs!kYksT049{sOfkt2y2MBQPPI%9 zNdf|}ibu%6xq}D;5_|{>b1n=-Za5X^4!IAa;E*tIr4nvHp$%5#VGOTs#PSmp7MY+@Z8f;%CgJg+33x$06cR(O_(Y0uvMHK~30S8o z1z4z<3^5<|`L(w`lNSBa@BQJ~bEl`K=Z=mJ$q%(Q2+Wa>DI#Z_6O(R`;s%P`o)DRd z5K#!Floy03gix|JR-c*}JJ>sTxcy)r^}~&=y@TE6?*7KsgV~AcFTe8TQ)e$BB9Q?m z!$iP>l|nFKZ)aom?YH0f#jk(<$p;_ZzP_eNPK=iw%k~042tv!U>a|J`20);Rv;j-R z&OoS;K@d?G7zD5!B7$nYdglC@si|3ETiR#KE}>8;oKm$e%Qa&0(bZ4>!;fCSdh_n~ zejfmAp@7*CL3GqJfB;ZJ7^AoL_V2E(Jp1fLAuR+!CWuUj*(4xp>2y;7Btjgr6-ADF zJ_kAT-q$IZPkl%WVm`?wNIzS`SmZHA01JifIAN$Q6Bw&GP)7lSv-Glu@H0IQqGbc}7kkW}x1VTiG5(Sa=4iB2Q zuigI9FMjf?U;kofb+vie>Gx=&UKRw1B#>Diz^E%9U;9`8{wJT^xMx@hKmaB%9BumG zNY$}G85#qCJ;PUT-S~s>+m7w_g^)s;xXU8rNwUz3keF<810vy@Ja=L7PvI`-_m|A8 z6JL;cM`BJwW@E8b}qh6?4J^aiF=v%ced76?>$((Z+ug) z)KDmGf*|x;-DbI7tyN2;eNCZa&|zp>btb*Lx%r>|@<;Ey^P0yj0f~Wu9VLi>nMLfG z$t)110K)(zGI?GARRqioiemXIBjCmi(T*^P_gza6$;bs@1g2zI#4w5xqjd#}tl&w_ z1)`MFEjvb25cpbChW!BmQAB~sV$9DFIsT_@%*onHBJJ~7jpKa@*C5&PtgHp*}nw{36?>deU%mF5)mvL9#;i%F+OL5FK+KF#bu4K~V9gpC zSSd?M4g;+%?N~M<5^HHm6KH`FrDcemio0;~TAP5nJW_^2Qb#?Xr^5Xc>(RR|BX{d%|?#Nky z@(hL{L}5oWB*+OWtMSK z;N`7*3GIIa*IbbN6%U%}|OTLflsUDfjR&gRbA%F5-ZE-o%Fiw)Il9dJJgbr40h z#>jhx5fB7LQ7)K(bz90F^mEQ3LxG0+c#J4{NiVSb@l4o57%$^_O>hn_Cuk34(KrKR7uK`>qzBk z)@+d2v8=M~0*SWiX&nX{9b0H0l@ijn!jOGm+par3HGSdyrK$N7o*^d$1Qvea*yUPd z^6hs%{NMilkM7*rjt=1w3K)nbf*}MJfQV6NF;LWT2mqVAn=7lUPd@o|YsU@)&BQ1$ zTIx(ftB}RW z2usK0KBxnaYoZ}xeLTI#N#PNXvDj$?DT=qLt{SB@Mx@6)UOx81Vv_t6q}coEFo=49 z2!Ms9RKI_Ccx0-z@o#_U+^st|y4_~;s97r8OpK@$+J=>KEH>uajobhB-~Ic&y(1HZ z@4ffI+RfFF$pxF)KmytY#DS5dKp~KbB4c&z0D~w15rG)erBROO0U#KRVHv?@1QAK( zm}o|hCxs&3#}5>RVTkwnB8xap6ud1G^p=vAZ3BYW>uD2F2rBXq7a$pl;`QQ`=kl}E zJlrdES?&Sm_v#h8k@MUXRTCKufHok2D3&NTdjj_ zMz>UUeb2%`QvgIjWQ2%fv>_7%f?#IkG|B-}9$oQ4PJpoXXveP%8-MsnT-}$Or zsu24~Xh_7tkuo>v#EUHRCQJ?@jeV$MN9n|llg$M($Dw4Vkb2%`{hiD)VjTcUuS0JA zFJf0L@JV4|I{AY0!+1b6#qLRoRLO03NMv1VLdmmbnk={aJwnDLOq*xxXbk{TFO1Y; z^(YyY>7z$T-~wrbi3TBm@mpitJMGd@P67Ou1tqjDbkLAJc` z_*@4>669Q0GAG5@I}QLqfB?Y+A(>XYUvHc`d;09ciTR$_xxaqDRNFd#_KZ|gDMwkB z?~|~s-HolE{_yAj`d|Fp_EFy$6X>o)sQ?Hx1F2XPL*z{<08s!T60;`5iKN2_wk8}U z01d>V93XZH1p)!A5D7sdNP$d@C?d@z5Tf{N{qCYK!M1Sxa0xONQW>K*&Ii3Nb)AJHzygSCr!#k)j=`=ill#Ji?akcw$uP& zXb{QMu)HvS`SSVecUJEGv;XOdQ%`*9m1pN>=N<&xVc-KP03(EuLL_#PIA%352?iEI zA`l=8v~7ufK58Dl`{COY<8#%CFv1`tbkx_Vpgigr*|Lt*H_P;IX5viUO_kL1=aG{Z{B$4Pxs%0LVt6(At7L?UJ)4gqei+}_(goSKK zmK4N@?P3p45n&MlA`JtZjx&srJ|b}9(;Tx*92z2TDvoy&k(;0`xMZ^Z7%s)IYrLt#v_&5pz=bQ=Ez{}ilJ62M0j;aBbP)t^!YD6}pu7dRc zTo(@Aa*m=x?;U?7J4AAHk;y$a za8T?d&q6Q&6B$OzO*T0hixLqKi9i6GWSdy@|HyO`GE0HPKp;~eP>46CCZ06Rz-SAB1>7VQk6%avVL=Y6?ApnkoC}ixOHYp{eF$D*a9!pFC zS(nG6Ac;?%c7IemN(2U`vkhRCs5fmWWY$EA!L~$wth~Cixxcq_*zJ5cd%NFlf8oWK zCa0!4-In7Zvk-`ulw{Z#qqQc3#stWQj3EOkfFL?gSKGF`f3$b~`jzFG)6cy0QrRup zcImLwtJkU)+CG`N`K3ywu8pw(Ko}zOy3MtlHwkh1%+iUa)4JQfef7q*Pu^*^kA#L^ zKdiV`-L(l3!SD9^63{KVCEFGNV3>4hD-j6c8#2sNNXD?IO`}$xnwz}8-MqH`vzG7s zeY$kv{O|w%_s%SzsMZ<;;`Y6jgM%gjpkOj20XXtLW{^?{N=)?}>1-rsAy9xsqqp{s z?yPK_IQgPm*?_kBHc}!k| zD479OA;ITBr-ejAMPcy`7oHtQ&0x+$FCL{7MjGOi`h9-s8ygHT{}FSs4lx86B5ZIn zk!6t6<~Z=Wzz~BkW9XeOaAl32NTHl36vivGk)sFOPHAd-QX&F_>$(EP_TKiH-kI@< zFVIJMyAEs#MZ3ndacZByoi4ob->fRYFQ7n7|nFL#>nN zwURZ_sQbNsx7%xVp>yxSpa1NyKsaCj)~keyS(nOA*>;5xNJzwFj4=U`3BthWATWl> zFdL%-t%)db9rynF`aAFcMwZJ3MJ5?m=zS|ad_ zPf!xF&&Kn7uOj}xwEbtWW!IG+2!3nrbIvu-o6LM^kp_u`CqaS)NPq+g&=y(663Hr= zk}auAQjNMhLNPNjJrn(_e|2bPB6?;tikX&1tyW0URbn|7y)A+y3_-X=CKBoW%jeDY z=bXLQnjibPd*4ftRL>kFGVeY2m~Gbn*4oQ*DsNx7y4oH@K_J$xuWmQSo2w6=dh*E+ zS=IH8%{W$Hso8ld)l8OR^)65l$zlmb#XEb7I0m*`-Nie%CMG_0;>4+~_0@PVur`SY ziF1iMCz7a=c(Gr_^AG0)3Q`5LPci6g24%V&QZM~yvq?fsB1#}*m=pvW(Y5*aZDL!tn4oy%%44uZF(YHfH2n9m435X&Pmm*zLC}JJ2Ds z_paB|@Lwa>6x)F6ZbEaa9creRLsUgo;D`{`#+u{Sx`55ts8BRWbh1W;CZAfJw`FL|ejuQ!Y!2n;g-Q57%e7LO(@-dY(92CFS; z)XX4p7vH`0E%T$vnW;t;%+F6xj5nM0W}_a3K^-J;LXaf2DlWB2Y9&s(aoq34UE12( z>Th-1n{m&byKrvb{zHv=P>TYay497H`N{FU2M>0;+m3=`jVKHQ>-tHz)9Uq)o;<#= z?+~lpxq0KOfBf&i{oQZhS?P_3f#F~fC-r8t?>#dW%|_G+Lnk7V5}DK{sRkwt$Z+Do zNgO1B0NXtqbGLnabG;i25Jiy&s;WPG@#WU$#_ZhO`yP6v-5JC{1Z3rZbGl_vA)GUj zWJ!?7dn_r`0M_F5*H52*{p{ET(!@?oPBrQj4ia%m((kKHoJg8FsKCcbLy4_Af%+WM zMm;I#@rep=ombA4Y|c4PaKc~^mNL(nOs(WRW zI{qQtA9_Y%OQ>F?L<+$-Im2#VifW?o?uK^&O>Pm=nT?0w?>m@~I-e@6y_xtUTW^7Iqp> zOj>druZ|~W;(pv0XO+3ptRFje&*s)fYGZ*T5DW%`{yP`0Ubt{AlUh`j1gZjsDl@!1 z%?f0&?~`XLah72L0Ojl`qiKOJk|6>!M7**{fLyHe>rVV90Z=BuryTopKOqpx9HVz34AorGPo;=A ztFuj7w6~qFE6hy zulHwWr)|tRlFx-RZ2XF831i_L(z{#`wWw z2lvfRw%eU#(7$;4w2kPI_dijq*Tp3p%j-$p+qZvzyxKRt7NP7Sk3796rh#^71sUrj=ia1FcK^TTn7{%6MvmKK$eWBJ?&zD^=M4%94 z>y4?U!9$sJF;-N+p`(XYk~eCpU*=*Tkt_(@YGU_tv~z5ne+esfB&y0r|Ln& z9Jy!T!r=o477o-KQ9Wulf@V-dt!bD*Dx?BZbOo>zVQhd&LsW0aRy9L9HjRVl?Qa!yk|srql_(qU0GS5zqztB;OiChtfH zxFk*EG)+A7mAA>f&Uq-Xx&2z7cmj03rkgSRY5FdE6FdiA4<)AdJkT zn!J#nWyUAuYuI;~Gpa5Uk}w%1@g6PN!j`gY>J+RDuS*dyXZjfstj`a@>I7jxCSWkx zI1wPok`#G{2d9}9z7lLuvS`UTrB|lu==fE9B8nwl)*-A;lb?ZMPrKq?W-xJJ0)jf{ ztaGVkfoYr@hr?Q+O8q1y!Q@mUFdT-)xHJJST)c7p>SEZ4UVH70_Ml&DMy>UJ>IMu} ziNUF}wpMS<@0mS%}m)|{q_3}IC)Ve3>BZv0x-5#&6 zEiG-VFCV=3-U9~@88$YxVckqj&)1?cn%v*lxArFbKM_3LHQI5y7}51?l!yCkQAR z=qoS1e(LD`oo>$)h=RS*gi0d!10^MGBO?jVvl(dh2X9?^hrkZfd^Ly~^&`iQjg2>I z_4?F!v(bpg8qKkKqfra%wWu*xs|CT-L}PqnJRGNbpmnh}jcwA8lSFJxtWYaLDjI|l z6EjDu1Tt)xAT@>xM8u_H3^YH ze<@(^2JyvGt73K5_2FmGj=O$^gR0H0a^<@pS^Uy_vALZ+s*V{|&goDSM%1#_mdPTtWPXN3J|OJBq>$_TE1M@!YeG`dHFS|QT+vmUW&F{YQ^S3*xPS!{* zsoJq1uyHDh8*heLcVxykebdV(dIBxfPX|mZH zq~b(jYEh$JuhpWcQE!-lBNK)-ChuC1riP7ygdkO`3WbGJ0i1Jclt@4ZnG1qXlR}v% z5@m}=%l^?Y#$+RqhbdInxR=FBU2?YOXb8k}>18BR#mhKDX9(p}O5=4ff;J`JstTP{ zFq+}ZaMzb)ecM~DMi{AeEN&2Y21%Sh zl~hHusHJ?OHH!cs_3PQYY*N98G&l3|2s>i9j5&%h8}dIB30WD!P*I435QTtx)syc7 zk&0S@2~53SBh@4xq^g0U(G2UgdbisnQesvoCa*@|a&g<_&eHjqj0#2`{flb~mvP@C zLhe>o5V=y7TWBu85+MqVVM7e(oK3~~R2<&ooxh8L&~Oxnur5_si;T0?uw#3Jq(443uIgIrn=ifi;V_AzJ-Q~l^cOc#npmZqaLsV;;gEOK-CzSfTJL+*J{e4Q>2Q-sRbkp!XsiIx96ZF z0)?`W5+{j$=iIq^*a(cV&e71G){hSnyz!~z(SBx(ClX}i>CbxwpoKbX6^N~9KV=M% zPm0eEI59R=kHRnr$0zHvbF&Kv_8dC6e_`*`!k&eR>E>j>VLTWYw$9qrw%VE=s@5`*Pg)`nG6W^3 zl0}}WDtrV>CM|lMZ7IZ7guuMaK?(E)epW!Zaw!!wo2|_JLLaY!q34iL|}5>DA-c*$uq+lZKvJX;29k zce{A!mBTpzD_-Um4w?HVR+^OGLzTyQO)3D=zz`GqgMP2ypUq=Kf*^ot*6T^LULS0A z(l|}~19bv`80t!@%n~*z02nCyz+A627cjGMR=2SrRV~`%&B(ri>{)^+!+?d z*6Oep8lU_$Djg}+(-mji%;Zv~Aa4=~7{+iA1PXN`iSxcE#S{Fr2?3!ojamaF)>&e8 zinQ+r17`sMcGzdbLzn}4gQV9_iZ&7x5q#qAjShbJlXtfJ|MI{5gFpDtV^18t=lI0< z%$B|0y|H=a*5>5o*$+MTz*oNfThmkfRYL+d>f=F;`rY<7zw?dn{pd$$-afy*xt&4; z=p|{bZYG*hGvrhd2BEc99IS{}aaiZlzHnq}VQqS1G9|ON-D~yIUg9kr*@!x?M+dnK zuPL=&3_zMXoA&Z6OMEJ*zPgAi-nqzJn=A1zGJFdSZ?lloRbpL#d&9f8n>$pi-5$Fz zcKE>I{R{KQ4!7@r;P|QgPaZ$D-vlN}oU}tzYDaEG(bFn}z2Hy^g# zT_Ve4z)C_I7{ek~iPcG_99IF-Jd6QQ1EdOOj7^L+YV}Tk5IaY}WWy}X?>lkNk)_o& zB{tc+3W;iT*tI%9xwpPw3Z&(VEEt&P3_##rl8Ahv`P}o0Dt|(zuoeOe5^G(ON?sF< zxSTRyTMWjqz}a}ZT)y4wry5&CFky|<62&(buijd}dGyG^`;R=ZwtD;Wh3jYD zeS2kTJsAw7*+>m0CZZ&jfB;YwgrXu!1EDl^{eHrR_s&diw+F4>V7rqH$}Ou;)33;* z_PByr?7g`l)!C`6;a$b1%CfKI;6v^nhAf^OBTG;7LH9~Wmz`9^aX0R7Z?rC7ZoE5n z{l=|3w{CBI@X5zcJ^bMK-pN`Jq=NxL4jc(c@V*Z|_R)_$|I*K2`TEzt@zWpu_|3C7 z&YZnbubcTjb5rAuJ$vTnW+(RV-*?ZU!*jFK6B84Wp`h;4cwp@yjr*jI$tO{C&N?C( zVkrcxvgZWynXvK!p=v)0vPI>BZ24z?%{j7`_@A@XG8nBQF;;*l$K$*uLFHG!rl>ka zRYc1_Yw^V0B44S%0V<@g>dzjOM#P@-vWkL?My?q8Orz&_`Sq7T_znfnFgcDqd}miM z0>n8S>*(!e2Y2JCyPx#GRHmvxmSQ&t&+CXtNtwOxGD#3nuhZ`LJugl!bmN7YBSdM3evnB4!2*GnmQRtgG41c9cuy1gHYQ0Y;H$ zeDLXooKTUc%P$TGWgsoHD-whxm44h)U@XMGeR~ef&(~`vU}DuEFg}=w09LZ7?Ub&ClO^>>d{527}c*Ti^Keum8*c*Z;de=s9b-9>ggH zqD~cX4yG9yz$j7Di@QA+gl4lh*zOIs`bnxlB{{2iAIqSkh?68hv)XEu5o)<(7{UD# z@G7%YoFC}?n~AmY zpx=zb+5I!0`t-B=_b=?5Kk(H*{n~1KqdRb0H&;R+ymT`NFgZPbm3k&xgI&@%R z?}3H+>4|22Y)sQQi93>7Yh!Xm24bBGvIO2)T|8otQz7C!^|>SOT2!!u+=)=Bko!?t zViiSF8GBq(cRq|dvU{jrRN57EhZj)h!dHY+Rp89eb~!VchUI*E7nft_pV|Lg$8S_ z&330Fs_blr zV8BGgWFg)y)Q9_KqgQc7_07vn$Hh!JWG>!Dl{qv-%IW|o014E9tlz>qfDtkR6UJ%M z?{`z@8Z{g}y!Xg~17ys`_Ij_~B2njj^pA&wD*Ah1^)5e@e+6X`K^aVYHpdx*9MbT( z{FY+uH9u1iO&A415IV6gN#jIPEq*N{1N?^~KZJG808uTh)guTET!ISTaUOJyT>LL% z(3BJ~%)Yp>Rc92|X0sj<5{HY|Zx@jkfEq9$;`C=fdv$K|tN-Ai{1eyj{_Mx!Z`AZd zANtVzzQe#^dud~BZFzBN#Y~2eKmPEIn~Q0;-M2}1drPb^5QapczEBXFMm>y^nste@ zZf$LQr8U^@Ih*x&1jcm;#2{pcs2 z-sq%1`N>a~R&HCk1hA>N6kGk)oja|7&rOau=k`pWJaP2cu><$sb9B$_)Wp~%ht|YB zxP+~-8Y>G^=&WOASW$qOGwT{dT^0-nVge~i=9^i{u0?Ok@yNU&D5sTTkjq6^N_FWQkB8)NMx|{C|1^x_=R1B=nC@PmGM-5rJ)lv z{CR|l=;+P6d@O;Ze7f%5sb3A!ce(Vvc32{$1ZN5a@(iOWKZ(#F zWYcKWor-m7oY>Tg)v6qt5i{koL%vB@0s^L57>RXk3>mIk3p_WXLeeAn(rLxOs=6?U ztWB~6L<$8QAuz^SR|Q=KECfI|aXKb@r`yZ{57L zw77KR#?@OlZmhMtOzP6O)oTYPutMxKh{Dur7zGMW5{byvY7qu@5U1M%yVZ6*6j|Fc ztQwNiDiDy9L3O?CB313A`n#RUWHrsg1_`-0TILMqox*aDH2{ z1_~85hAqIvf~=O3s56|$(x{H)n*$Zw?tDbNsE}W=Bit(^@rr0#Si1m#=sn^9^0^zD zq--j*dco-Dp&NE`{pwvMry73o?q>@&xU-+5_vIa~sM#t^aOb_%Ra{{=gv!tjLH4hL z{yVRs;-6hc2(+Vd!!51!B5#&=*YTOHJeE;CY{G8$`+X;BmUSt z?T7;xqZWHD~ejMK03kY`pMwC>NahFC4;6xN%Kjn(y~TX$L;aS)-#2!XkJ zEifjrmIGL)LV#$a(d;LwP1AUY5*4}lu~Sm3$b%(~i~z=N2aQ}-UFlt&KwK<)_CxFC`93>x0$xGq1gI=I4jreC&e{K63KjlP8W%P0o); zq-=CCeigXzZB_yiu|OD1 zOrcREHW~C)e4-t4PLjB@w0v7(A9?>{$BrKf1ji2@9v`1_TkE76kWmBig?9xod0u`4 zQK+gi3?#McL}Hi4@)V3cA5TIibmtII;qTs5Eecq5tcF3%p<#%M!g)&r$UzJ#!>C#a znV=?)6Nf}muh;g?O&a1PN&4OXo;|Z-aXVhKl2!lmYF58cIG-24Qhc)gd<036Ns)fW zDbFIQ0OzhO0BWFmqaFr^loCk?gJh6O5z96*#Z)rza(WC9hQ=5Y5ff07x-_*?xy26- z=c7j>@CKhq74NO6- zPD-ZV^A7%U}JoKRbW^;>m~afArx;KmOd43dAe2wYh%o()B^NoA#2~*{Qk7 z`ObD*)aJ?)coCwoQ47$Caq;rf;_BwR=Wagm!1YHTc<{uL19NlxqFTShn~kV0Ngo1G zAmYMWg9+B!yfT_b#B7+Lsk5R^q$mU7BmR|h`B#dn@)_^VTaimHnfC`3%p)I^iq+W5 zjzr!Kw75Qll%dNM9;A zc_J480B4S3D8dVhgqk9N!iaKU$Ou_ts6Z833)m13Y)Xo5FCHI@*Ecul7Um}>=l0BV z(CGGV8}Q`h_`ZEJQ_*xM8R+JwiYAf;1QY@!XHpcPN(=~?6{?c^2o(eBYYsEm*UR-t zQ44~4Eo#(jiA~~U(2o=AvdpHH@{pO!e^%e7fd5Jy85<>|0D>qO^wL3+-o?zIIm5~z z#xHVJ4MUL8h)D&8SyOcol48$OvLEtkx1p?9TD)_0a^kT^PaZjRcz(~m)2Cnm#$SG~ zwH+V2=kSL=@)R^$x^?H)t(C#R9z1$m-egXJ|eTDc6F)1T1A) zo?Sv@w9=gsYOi8IMTjm(p!#7%6wJTM@K1ivTHsC=V?5HB9WqMEp93ZqHQ;_PdF{2= zFJ3u+?yc9(zWr+K(%zuo@5Y*%&E+*1?#I1;(h35K)4Uf12D~qX*Wei@2ngD1#c#iT z@#^JkXI?*d>b~P2eE<9IzyIDn`|j%`?cVm9A(H+eQD>rvgqsb{3L-;Qg&;PK14GV| z31F>bFoj1JG(S*$Im;b|L$*k4;m5Jp@YnK&(VfXi&9EIr|6bgzn%X04 z4OJ&9_XzeX4OM~~G9DvLzzXZc`W#$Ink=uZY_G5F-7~*;VIiuA#B|@O;}1M^|GV#= zUFmm>Ll_!@G7xg+silB=+nUeHDOt=HfrtX)KwYeru-FW<2&kX&_Ud`sC+6`^C>3KC+(z)NAyK zXIejb@#Qyv^2);D`G-$FDEQIs8%yKOdMD}k28kqAnE?{#Oc1gl0MZ?6aAcjlw~Qne zLf%RJJ2wqG1FWtC)^VW^)i%+e8_{k4_`0$baV^K4zh08auUp@a$ zzuyk(&6z!W8&NH))ta@?aM-8?VGt>tsuLAw?O>2F5Y!@TQwd%m&qki)G zOt}#u`>l#pl!dmFfPf$yLmiQUcjeIjQA5msIG|y4wnp!+UPO02GqiOXafQr8O+ulz z%Kq6^RrO2XT3)-O!t>n^+WBpmWtE@q&aigXZ+rXDeJ3X;CgL>J*d0A_{NqnO@#gDquDQo7EgqlH(IZh?D0&xHmbpQfz4Pc_! zrYuST8ie*@I&q0a{}7{vYlAhud4ZHn>tk7TIvK`abWWo9Q@m~a`W zMJyn(ssX1-k|u71i&T&?W0@WxdB_!&02OfrHB1_?RTHTUDz(piqDleO=jH*{wmM5| z8|_Z-_Ugu8e(ie`6Epwlzy8DLo_}t3eos0Wkl|*tIS2k*zjJij)c&9U=l>y1yX$wh zQ|k^yV`L%|idaVg89>$AL;(X<3@HGADT(eB%lsK09#5^@^4{X2?)FW0X;S%<7f1-m zoVAGah(&_JK|_;C;xUj)CIl$pO-m-{F`jG!A_wnol*c3ZU8YZZ<)ih>w%jji@nV={G^nwe#Tv9R9lbOwX=!u*sWzP+-#+3uwU4<$g!+eAzr0|B8HhP9|+MS874oTh0Juuu`zz4F0i_H`zxNY#3qK{f*>2%;!t z=44>g#1(F%RbtAPClmnt0&BTU=Xsc6qkwbHC8^Ka#6+g5SImqqLu)N@c>VM{W8?MN zh3Vt>ANyzj^*?|7BhQ9ZPvUs1-L2Ik6NWY7tyZ_!?oLkB-hBO1tD7bcE~LOPhM1NOOPozKZ!q*~rhGTi;SL-xGc7(USGOVLa5vhm|R$LDq;};39z=&-PpK# z`PR*cPW|HJPe1wi2R?M)$@|tn@rmz$`>)QOxf)&B-~bcjjXiTy)3X!J`q=!!{Go+~ zg9{4>5AL6z+owXRu0GKpbUU5yc03q}I1U1cL#BTMWv+Zw0U|B8Mg@lCdt&v3PfSB@ zpw-bTN1cX$+d1Vsr+&nD^p}bYqu1^l=9_n+3WvKr{=LX2>&4yCe;1Bb_S_5FyS$^o zaSR!chb2aoLs_+z?>>A5q7JvDi0G&?jQk9fsu01cnyA(sn+S~Gu4%iq?QC4HhZEyt z&1RETt+V}P&>U;*JFsVbs@d&!ee&mk*@;W@#BKgHA_zDOJ~3?SQPijh6r@B}U<(lm z`S4_EaMYu1=AGdgi7^~7b$iJmNi8rxGyTNl@BfX@e5TWBf9u;ndi%^f?anp;HXy6; zIpPVV=ynI^&tG0yTnp>Lp4o}oR-=A{o$QN{kgy}M2Ltu6Q`(%d&+l{L|`IG z1p(q-((9*1iqK--DQ80YXlv%o2zbMcZyhnK^GTHzY$9S&uoF8(1*Is&3=v&hZ@+Qo z-Dmbc{dfQ1pFRH6vk^DrUYuw$Hc@AUOvWb3t!sDQxx9XJv)4}@t8vz?uMcXqlv00hJ8ZAU?6ezjue$>xX%s`>2u^~)v?)yl+zQUE0q z&(Fx@xfbG%{rPL>-#K@2&&;3x#&7<{^Upm$KDno5|McR!my#5loBgHDen?9If{-Q~ zwSx!t-E-u?;UfpbAaJCOfaWF|M~)ntnVufRJ<&8C^sRGL2JVtVm^hQV3J@+M1Twu> zuIk7%L6uYx73p#pR2_n>-JE3d`7WMO`8sq>W%_n|{#_BAcK$fZv35h#%D)9}j)phn zFY@eR2)PTp915#@@!QCIXvf*?x1sixEvXLVPWD=fFQv?;Gt`M9PoOW1!bD1}V#P@i zHX6-F?hz)PZoA!T)oQh!(r%nEaB~0NFMRQHfBmn2B{F*H z!lkD^^8WGh#@VxHR+m-=ed_=NC1W@=E|J8#was>`)vJXjq=R#FQ-_Zpny80yx7$w! zy^hQ;%%>vm&eCQt&KksIK*9s{JLga&>y@;2&oft;5UJt?`v9>>md#S6=Y*m^f zWL43K;8Wmu4j=@t;`Wjl0mhJFLx!D|)M{=(rpjnlsW0tl^5Fr3)I)OhgVi6fu=^rudoI5yFo3c`TM4F;Wd zryVC2;zZSu@iLAMfdvB~Dw3^u(9ryU4RV3qdmRrC?Z{jp-%J!Pox@CG#Luyuo4kzR zjvt4oYuDp$m_EW>X!nQbxJt!TjXria#*??a+Okphvpd=o%KPrxjp~~!3_#0MnZhy~ zG(WB-%hJ;O*OyeuQ9}WccQR`Y7|%}17|_PV9JWAAX6)5$wAd61DD2~_BN66?(Btz)MHjY;Jz+E=0Ri(v0>-5 zpGZ7NKzQ`Qd;Zx!{l_2w_|t>__RTAo0~$Q>*vaF^7ET>I^6G1Eo<99f-zLNqJLesQ zKy1_0S?f~XZgrEyPEXJ8*)wHKw6wf*^~z$cE+liQOX6GWeVYg%0)Ye!16Iwd&PZkV z=kdY-^&qT|H2@^>pgS1Y68tmAN(LGDc(|O$<$A4voDg}EeEWC3BW`U7d!DLK{vW9R#tLO7!1fDkwI$f^>F~5 ze#e+F3PV*DabgoIIz2ye?CAdKeJ8l3{mwR-s5#!~b~|b6;xy3|%uBezCSHo}U^U0H%8RV7U&A;4+2lc_GvoZuCeigLS2j^*{7&sRZ{Y={76 zV<@ZX2qh=t@ml~^b)w9MRK4SXiaPip7NJa#&O}1Z4aYf1ic~?ti-?6^29x&&aGHg= zq!0rH1O_&@+<*Go_g;GS?N5E`(?A z1<{8GyRv?ehg0Tfw7NI&7gUj0EB{v~^*`%)578hO=CfBD*E zN5mNkd9hzfA*2k-Yy83`y?y|kI=1h>`9J*gk3aL|#_HOoi)YhbuU?ND_2B5?y$9y^ zEzHeLjE}wb`rFH$mH~V|1R_{V1SHO_u5VtxaqHBL#iIxAIsT!;7cX40vD=baQd3lg7E-4@6K$LV_&h7Fhu*)c~l~YRy^$%&ATK{Uj}GlVrW)JYO;A5}t3A z12NRcNmSiM{Ea?JS(!S$ejF!N|IzFk%Hy}a@6b*`i2NP}P9Q2oT#F(n&IBCCsj3<# zC#6umW>uj+@sB9n# zr>3EMQ5odwK{-##6gxiE0;%!wCY}{ZZe}Qo{R#+xamCjfcx`)&RfV%0b{P;C{sIn2 z3H{hzx_lERg~U-UT-dw!_|YTxo;W@~J2yVo==R#ZUe{Umf#ggik};wj6pY4wLC!pHlvqtGx2&?$rPMGLx|G()i(H zm-E%(E*ao^aD*MVQ}rPgw~#zj6ny>$RaI8Qtg0f?jR)h+=J>=U0R(la?ezMCI9^*> zyM61{)YL>2hPQ4nE!|mK+E|N|d;~;F1AU8=%F`K;Z-? zfFWZ=Oke`TF1AH`DzrrkpUhMZvlDmm!n@b6Ts^S=K)?nBfL$s!P2xBMBIPjg_l;B)(G6|45)6HvJ?@-#D=-ju)q)qCYO&1%1{vOaC)WDwM8VN z#uxHb7y<_@qM{|@Q?B-`E|XkjD;rS!Y5*oOL~O_qnGCI!nAz)OoLCjVhA5NX6$E3l zM2Oj@m$Rrq%A;C5tMeN^KTo_%kFq710d2Wt3(si)P|7^(Y6jMkI^F6d{UiyaU}~Zs z#xh7PiPbWfF5rE8RQiHD>n)o|trm?p4H;fqUfbT-ymjryJ%!)DTsK{H#c7CawpStw9O-yXb5x5^Hr*%Lrc@M%s#;t(DvFCQ9p$zpF2= zG=he1D_en50vZ;_Mx0=WUs!$AaLb1J{cGTUr2#{~4v!;Mdb<0=@5&p7$AVOu*&-ED zVw0qZQ@d|sW^8;?72+2 zX;-?-{?;sl+RH3XM3q9rhRBK<20K{aV4sIRpAT<`@NjeM#`V*uPe1^B;NNk%gbX`U|u>^W(KY{o}9Olxjg32FALCp+Q83C>SBi3_G(J zIKK%1$Yd!whZ2Mpof1`ViZ#s62{St=2)_uO9tF!$cG?5qm9} z4`LAkL42MRCe6-dIw650WlyQxKdZsIuUSdzkSNnuWiyPX&Q8a4hSTX7svq z%qwDd737OMvlBz8TN$xk)Jm0Wav3HcsonC;ljTQTg+cMGzYY!5t%NUiJ>Y^5=$20^vrC%-thN06%N>h z(Sd`9jvPKRJ~fdHl0;>*)r#Z(q5b>rf8dc5_a04BTW_$!I)L+#UCp*kzRoE);4lb5 z07ONdQ&fpS$tjq`Lr>(83IY~u(G>`AV&9R^eDc#@{u^JckB6sUIkUa8qy_?L;@XlJ zW`=_a+O3rUa?kPE-yVNvW_tQtKYZcF&D+j83#8%<0`IfzR2Ofo{piJ)Me*DxKDqzM zp~sVt++4ho*z-{kKKj6^IF7I1TK46Iohs+sYTw{yz|HY-<{*yygF!zX9(Mr7$J?+# zeAR?3IhQXJUv-77-sRDX+0<%vKnJ~n&z{UV;(OHa_C(E$Z^aI;oLVa8SOEqx2gU$U zXB{yUIVtrF3K#`5!)pSIpjnlGO~2iH@#R-O_1VwdbL0N#g6GKkdXMWXiXD&0B~lk`pm=Ik%-V76JpJA+9%ffNHZ4PQ!-ZXhLY5I$>wk1P(o?2x{SWcXeWN_Q1l-Gar3aH2vWZ zesJrh5S8t}Qlk;=G{pBydZ*r0iwKm&VuU=-2P98h9-D+=c_0mki zLPZK|28BW7ob=<~U@%DYS*bW^=37M}Rj_wz&1NeTma_Fp#9FQm1p=VnXn;(o+lymc zVHG2prwZ}elW+Ers&r8j4P~w;3P`HT!p7&cb>DONW#j8I*9jDTWYH?!6B2$YZv6ew(I7{^H zSxyEC3e9STdUc_?j7{ne$e_G~PMj(;F&jfl0U3ca!#?;_3A`whXH@w?jRTN+rbDby zb>1;wiH!HkBA6_jRaTcqeLC|j2tYIEc?I%_a6h45=AlvqreX<~W<9O0b}FU`#S~{k zLpFPPrRh9O0np4bOccGu#jZbAizX(f*vGGk8#v8JBm3ZYdz}?F@RWYu&B(z~!b+&rfq?_X(rLL7a0w>`7#lO>5>=sUk%n7{ys5YoB`lQ@{PC zFCBUC_||6o^6O{2gYBr^a1MYn5i6WJnB;A%Tj+tD@WiP!Z!sc{CX_>h+p99SjB)fN&WJ)KqBz!ovco~DwD~Fog;=C)2mMyFF;R~~mxk8a1cD;FY<{}| zrJ@@>*X^~so$kKr$@!VdW}`Mp)76d5es8e3y?XM*i6cjk&Q8y5wYN!yvMoImoDw*f z?3spY0vEo>Lvl(%oTXsD^T!IoRq1%w>)sQQe+9Uv;WblPE2CcZ)tf5Q^UF3AyFO!- zsqAX3_dx#XB_S2c$=?*l}oV|3OV zk<_C%N|vC=Eb7FWb560b;~kCOa7e+2_k z5Q)Pe8Kh2KX&la7lJd1xNU|d|Ps88+W!Axvc%&o4fyWP0&WD|e0%jEudEZb!BR={m z==6FozWmasPJiZuAO2uq02LJ)bO*-h_GbK(@4x(S{`J3Ky?t?QW98OXG8SNBZVa&{ zN#X(OVWZIq6D!O?6bAJ$?7CD-K`WC+oXL)SxU^z@5r+= z&NE@0QFV9@Hk?Gp=OES>#$WiIPW|wD8lgwt1)QR-s#EPg%op4o$ zUC<0MF$F;CYyxcb+#ucB?!|MH6Z6we#2WY8{kXrm*=n`B4?TSU+~jP#+cqR|()ZgD z!^M_0ivy^Nk|p6$-qaCV90~o|Nx4H$+3n(CQrP*1^7F2XAx9_Vs{Rt#sRT>fao13q z+0i}2j$_zZQM@s`VaH2~&Q@+Jx=!V#LvL5?{-Ep}p-ztYioORyWj37UhA92)sKoSKilL(36XoGlQrR>pkmRHO)KgFW?r(nT!_Pex1ZL&j#pN59opuStWSmW* zq7X-_qG1p@af8?qNk1Mmt#;~bQ_blE2c|yx@uz~I_VpkB)uroq2oOb_Bv5$iYS15C zK6jy}JiB-H{SQBU;PAnPTL-Vcdp=ZmXwP)NKk#u_0ZzQ%_N}|IoobbNhL-^=E(lAN#GYI1%Sa;cQwDj3MP*7m-0DvS@7|7gDs}+XTFu zYaS<&19KjL?R@qer^E(4@ zVa}P43wcA8`Y1r-jp>E`1>R#-J-=dx%cCxe?i3sjS+y}mf!&ll%@mjAiFS&4F1=%l zE2%*YfWRUSV|JZ{a|f*?asC3FbovB-D-hME6#$FB7*y{-ZB``kBu>U7xJqI&LBY>h;Nq@m9ark5ij>N3&6cs*)&a z7IRyWisp-3GTv4)X0O4oN)Ob(P``rKl$a) zeCT6OJ#^oxiEwHrtVhw<m?%=0My6&Ar)m{oL#Y#@OocVss0D%P^m;)+47+D)@}5UeF0L$H zyLoGMX)Q^d;li7deBdDw@){~xa7MN)eb%AEJyGGZ^dF>9mEGdrQTQXS<6E z$QNrS=NtJ7$!0v;E#$DToL8kNop0Ew8mKrmfe8((73YegZ=QXKFV5%0tM83CZ)?M5 zs{OT2rxzcv)6-*3Hdwr~At?rNdg|U&d-lzZPfT`uoh0com<=;~2dUwTV5KaLqEo|w zspYOFW94}l0p$A39WF4%28b%BMlY$pOh>QrE2WB*LznDy#3`6l<)U3*TsH7mJ3On? z%4>JsL7*7TN*v+HPeYF!`mrK@?ACySkCJyI_x0d;5W6(p`1Uuy>LfV-_Ssi{{_4Az z7d;}+)$3%?Pc()tUT)QweFnMN$LSi)~5gNm;c(Qe(MV} zd#BsWTQ|<0YqeIGLqaH&8i8n<`s%_8urL`m?4aT(3L6mZcL%PnOk0C)f6x4Z-+2Dx zfr+}``tH@6%LIs1aV|2NUvPD{vX!?`JG$Wmz=1{X;eX?U?Lyy2Z&W=&0$`YgQC{C zIu!$W>EF*^rUR7Tt&8dQom(}l7irT$_l^e28xYtnz*(7ZffuJbU?h>>gsK46L++C=+NOq zjd~Ldn+}-aoDdj>O9qfh3#uh@mRo@;7F7C}?K6i_xeT)+4E^w4$M6L^;5Zxi_qt@~ z4HY-ty9ocNaJ&)jH`J^hVRS(5P4&xKLc1;SyEDSd>8j+Nx29k`3a^(WBI}$8n&VAz z`1UuxVWY{!KmU8b^~ukCbn@{0+FEDv-Rn1(ud;znfWZ2g7$Oj{ zILGRp3B@ZgnAk6kD2&8Pzu#Ba1<}4ehn{=(LxZ&Ym*0Ki((N?>HA4YW)Qng|Yi(+E zb*=TIpS|$#eGfkN*aueEmKSedIka#3{s$j^@WBUvarV;scGp*AG)39~~&s{XN53RA_CtCCWwC+2+dr`D%6 zVv}VKC3ucb*>q^05}5J?-9)TJEYxXj|MbNdKKbmYAN%lQV2%3;3(ribCoFtd5*`uY3j2Zg&qJKFpvS{X1PNH}7n1x85AYy~Br3 zOf{!g!;L|b_-x)xn!QG|mZ-vHig`6`d_pLgEMY6Nfp~8r52IC4vDg6Qi!I*(RJI1g zD>V~LeL!@@?p;D-Ar=?jmK92(5m^eVNUbC9pGzde9?V(-6&a?;1ger)>sfLNv<7O| zw;j>k*o3pzS=(vfX!pCRwa1Ph9d9=KiqsAalQHaE668A*9U{GvM*UhxIdZwO>{mN> z!tZX+{x#cD2+KRATG^%1|J1YK;HzK%-tFa0b=rr6xG;bT1F*vz^!lwIe(!64_1*7nZLPm`=3;BTGqHCv6u-AqW2hE#Jus0m zWE}veEE1WSkR|+puS^Y9rpybU2|@@NK90hVq=pobfr@izG$JR~TImBM8UiV>)#}yO z*T+S+OZn&j4dr_ihzi>J>_al=djv8pmi#IdqcX0?EV znXLF|-`tfpgT7*+<@lH3`_MY9e8>|36?~!sq*`!-@*IlSmGfSCI1!v8PF+AkAyG=9 zVNoQ`jUb2<(Lly(Q7sKSabI#>ZZFYmOPlSn?!Kw?hcG?7CaMznuXK2(JBqp$ zL3Tt8C*%r0WWmye$_9P3vBf>VPJ@2cqp+Y@$ zr>BW&Vr=Hf(ZffNA3uE0zFSvrMT{pu^8Uv^^3l(J_P6&>&3*Oj-?)6~3V>AHSSQ9J0j z7FVvmdv>d}D&h+Ot11LudF)6@po}7eZMH}iYy$P58yI7qYj-+5?pw&-`GcQ%=A+$i z`#ax!;YO?LfJj+v+H5ouaFWJroBcof)4y0;y7lER{I$RNJAY^X;KHjf|KgQbPA}hC zs}6Ex42id0dZh$0Wt`XM-b}dxKuZyEH*=FAa1ba{chE0A|Fg?Hr_R|x)w{m}GWod@ zEUHT{lm1krz$8wclfGK-bMtR#SzNb&bd&t%YnR$84N(r=KWlQK0I^Cz^9J z6Ww0i?)C@y_^fTTyPdvsPIAfFZx|@&)h-vwGc*q^^l<(3!=wv*}ztF$QsbdgRy=I(Mh%cI52G(VE zZYRuqU}0vn-QI4stQ7}XzzNp7iFMm?jES*Yx;X&W*<6fjwZr!uYBn25OduO52f3J% zk$2WWzZ@$)9Tu7^s9(YD9Qbz=;)kHJ8e@?S+XxyLqyL|=13|&Oc6nfd<5fnUpR8_I zMpZX=jqR=Q%S3sWou6;+Ik5NnPd@j=laF0^{oJMNXIj1W6bOKBEXGL8DI@d0GX!EEX_@6xiMmf2r)TvfFU+D4iu84ajUhFrpes=!N2yoPpPB7_~s8+x`Ti@b+(_x zP-=v=P8#=nT4SA%=Bb4ih8}IJxDs;&fMhG+}!M*eS3cK`dhtz zKL9Kc1Pq`(u!XCFH-Px=7i?EFQ;jl{s5+M#^5xc*3^`|s*k#sKs3Ol52g-rF>P?=L zCvvdTiU^tiOT%gde~!vo%qV9!9X25g7DHvmDfc>Jg4fl=E_Kj6+pb@uARuwl8+4sa z9$HwahtbAn%OwL}zBCrB^qg~@L}hxc-tNYCmR3T3Ck*-U(Su<*)sg4GnOc9c21*V})EW9RL|+~Y2fF94w0 zncS&a^D)XUpq#5|v8~J#j1ZZAKMw1`ShIQG!aavh9(RZhLs>Ulop!6WwYnjxOpJwL zGuVG*VPk#euU`7;={MfqSlvXPqsA&ERRMgdDgQT-V+a#MVse_mLO^0c#wcn;Tn|!U zFc4z35+q1YPLKV;-~9Z8AA3ydjn>+o^B2yw+O0us0|RhCWQinmH1l4Bg&>p*%ig_0 zp(3iHY}6|mL_r)R*1CSjuH4?Y=iqOB{&~3m*T3_VrLJYbrcQv62*ANT_51HT{(%pF zaA{@fYk&65AN}|ztE=0FVFe+uXLhbJR%>mywzpcT^=n@}*1HT1P+EkC=dij0{K98~ z2|^L1x$W2g$`$gGtRew2Rq>G250sQ$ikZ~~CqRubF+LUs949d=I6yxYy%LN^)Aq^=e=W~Qds*192J0c(YsG*`Zb#8MQ(1T^OX zp4a*UsRSJxZ-#*x^!iyg1Y#u^ur0DPDZv*mEg^XbB61GkXRkW@B{Y?~f1tW-k*lSu zlbX+%Z>Lu;4RQT!bvqTf%=BzP77R3MH7kNNDUz2stL;u}dTKT@w0~}HWoxtB@5i~Q z+lmu4U=D&XXtm<&ZrOxEquHE4Fj=qHY+9`dRuFlG7DwrHEbVSbG6TdI~RjF3{lRy?_k$n*@Y2;Qu^1ju>y_AHFn!67kFZ}x>#L7zY&8lgc#0^32tpuhJwzVi5!AF7Ryuisg^edXe6 zdqu^-7-gTuK?u%gRse&mcv+Q}G$SS^hEHh+6(=SL!YJ(Z0P#Q$zX!2)w_B^tskyIw z`M1Vr=KuW9zjI@~RR;~Asiw2z;YUCI^xyowf3R==!V5om;pe}2<;JZWF#ti6&Cz>~ zJoDVg&Rw{)cKWp6hIlOSVy5PQ3MZ&)egce6L{|3^fK3MCGza}r|FA+Ls3g1`U0hWj zQ$>FdZH-1SH$Tmy8(X3>(A*(ORSmL4KupY{j!l1+2D zQF9JdLR(%pn4o|mh(MfI|6y{HA9>{dhaPlB)3P3 z3djU(h#V7-k2l5|W80nf)^=M}d{}j>)#=S_*K1+7*FAaY(9*`*+Sc|Uw;8nhNjg|J zG&wU?-`?t8zkX|Kdg6iL`2609FboR@P$9??d$Q(KPK+Kqu&J^*Dw6l`43$R->b|?X z@sJ_zx|=NaUPo!T_fnlV%l{f|AdhqSm2WBBXLL9iq|#CB#x)By9CBKz7+6ZxRV6u9 z7M{p3K@@hkx`-N6d!`rm9h{llOCToQ+FH4FhfYTa5WPI6cDVB;T5v1@EIDj#l}8`1TsEdB^pxkzTQp-TMdHLGXVw^Yv4(y-*J`>SpZ39t^V zYK#kmC}iVQ17;KQ!rpm9w7Ioq6$VHhuHL+P|M8*yERFUk z4;g;^@XC2_=pT~QXy^<5`kR1i>vn0_Zg-%Fk=$(?Fw~;L7l5h*mW^*E{J8L@%3U2Q z^u>liu*|03n4Fm-iqb@a$WRb099}qb-_eK1#@_$e3^7!n`?7)Vqj zbs&ubj)>V?LYb7v$DxR57GOlgfT$WGN0i~FYGPdgeDu_VfB)}%<-~*ccGf%Bu3lMM zxsxW{z-Oun0jQD!mQW==ilcurXU>l-Tsi*-0RA-|E7gTWBH<3W(z1Pz$x`Hz?F>7)e{Zl-JvJ#%i zZF(abp<N9$K z#i0-qXTvb)w)@}y*0(2sUy^xBOMr7&>}<=Kfk z!HBS`*6UF{aZwmh-sLRIf}i0kd{Bn_;-I27bMHidFt~pG#=!#zXQszz=Ek?W+eOYx zpM2kde2o|bn1E-dCi=bZ-r0%%?STb?FtAP~^L?)X3*{N8G(&%%o_c*_yEo{EfdR;R z=OqSU1Y)w-56z7V-V4Ah<+F8}VYgxrHfZ58X-%$0~m(29k^A1S(&}cpVD$TDg=NLk$D8(%irD;jw{1a zGRa|9@?OUfCn)fC=L;}|J>}P2H;ngq-|lT0Mt?$u05Tb~pxSb5MhzT=AVtGnA><`M z&CwS=HL8-;_EV@DChuh-oMo0LLZS%Shx=$iff%vQk!BiL13dH05F8W^srM&UNI(pz4=!TWti)m^pg*IdOc<&JS}H_^ktI*-c6v-EY}BWxr&8Nz z)rCWQ8)47~9y)sHi@*6B`ws7W{guV zzj*8C&wS!z6Jzymr?<7WIXg2&Z0@`7zCZZGe|q1;k9_~z-+kfxKNdxj_S*wnt4#or zcMSS;gA4dU6jsArQY5CYv;&R)8bsy_3PC+|IW^49HNgbu`P zIJD4#P1Ag|6JWEodg{b}J3qCuvT^dBeeHfSHZd-srIpQ%b~_Kv@(M4M3LJol3=vcl z)wr9OJW|gDWU?56B9Pd}vJ?=b#mwb&=@m4&BS5}#ha_W^?- zZe2{B6xHau)~$9r%u|MRWoi3DaHV0!f{O56s7rn+ycR<-EV=)Rvh~h45DFVi*7bbh zSFRWue#&LD;qfn9^eZ)^dS8_Xl-;>&AVc}moK=+f7mB80!$BiA-u)OMfuROeBumd^ z80sJpf!6BvvB|0NiK!?wF^j4T19RZep{GCk^z>A1YrXUHmwxeboUYwjd-v?w&CM+U ziY&FgDEW+Bp`p+i1zcKM{Fo^5VTvjYh9b3AnK^Tp1b};v-Sg4k{Dee}TW8;0+E{Y7 zuOvb+P=!?$pUGGlVRm_S#?k#kYU<${TmK1_V6$;U_--TVMIy7d~Y;SzBH)ff=8i zYA&yJB?;NPECLzBsZN9zRa}q>m0A9{6ifi6KKnwE>7f);sJt=jf-go^l1v8Eq!sip zMx@wq0ARx8)KplDR@YW~gM^qH_4-(I%tF>SH@baifY`>N8dC9bxlS{09QMgIiAB|W zybv+q(m{V|X~j7kH7676CZ{Kq$)=7F?OizZ?9VUA%hh_Knq==}Ka! zC&!(p3P(`y2&9_VvCY6E$3}&NI#D4q?A?VB0Ri9~27P;H@z(h(mlyW#+c!72va${l z6Os_IC0Ajw-MDAf9$wgMh|(n8AJiMou{g18Qhcwwkrr6qeh&V)5s2U;I*i%+94=7#*OQ5-Mlcieel* zD_0e9#0HnHUi$bGpE!QcJ)4`Gw{Nfcyj$Htk_^)E8rRr`b#rjf{>?*M>+7wxP7eT> zlT_9_gCv#XduOf6?VB65`jwzcxY+_MkZ}k04a=y-qRq+tS3Gt?VCA{Pd|+639%eHo zdncSS&o8QEi!>=wYGloi#Kmxy&`Hix7zFLE4@}{b7}MXwUyYafv;L6h7ddNDo!B> z%n-?_kOeRx!x1qHEW}#J3{rI>MdKOx!t>7^z5iJI&U$-uOI!>EQ%Ib*k}_ADEbuZb zt*TmyAj`sQ2_xD=e}Beb)u%*OFw!`7&NarHVOX<{mX?;ff=3U`{N|@Wy}jP~Pyg{R ze)Q9qH#a*Byzl-K&pi9_=bnFdY--}hyKlDoy$A0-uB5$I=jNSTBFjZ?wBXz}^YcItLLZc1p;yAxpk<$;_0*oL3P50h7&WY-Up7;y8}uv^iF5PS#Z= zH16c7vBUf4o_y$m^XE>#_*Xyr-ry&z%N;vm>ti)dG#*GT3W6Ywt$?yL7{1Jx7IZBc z5JKSc@iByYGt|UQHNvI!{wqI!{kdm8@%~32_}R~1?k9F?YNFNc#(61VpI55gb&Ge_ zrj8#~vew2F5OaNVdlP9|i%dT$xi0}e_d_|5h_@EB`pMFEYyb3Q zityI8<)GU9AzY%uTYqOa^IxhM_RBcHt~-ko?g}niEFr2aqT%q0;X`+U*^1S^+Rpci zRQS(0syha)HcX3EH{8;lci#0Fl|@Tr$$!e~c9JncDx^fS^Lxg|CcOGaRQjF%jVsr` z`DcGdEY@jjtJUemy>{Fgq!tJPs6-+463tWD_!6iJ?^~{H&^kOZh6I5&lMg#b@b_HKY#M*eK&62 z_=~Uo+2Z20!gE7uCl4s&gDT#=1vr#JJvmDsns@(!fh3V`x3jVlwcGLD**V9YByl%Q zX6I%m*QPew1Ib*rsL(ANzdZzmL?m}KR22~p4S;=96Tk7L&o?4781&-aK%qq1YHbBf zs0XQ25bim3^2mup2lvlhS-!Kf@@8sjv(=vnBOzg;fQ)yx3=FwKXHL1IL?M#7So%r~ z3R&0T-?%?#hZ#{h9W7E^K@zzGI5ovoHP%m{jC&r6eX>4ixORZ;SREncW5LjW6tN)cm1#kpOF*LXfF8BQ1H zG#5|G=&7v0m=A0$Sp$`ZX3f?^F8&XBJZ5j?{0o~b;LRzl#r9Uey?tY9ZeeC}?#Mld z7ME7Gdofcm(6rT$d)MRf$;|^tj@0XcO1gi3^2Ta=kk3M_Snu>g!(-8OW2!!C1l}R{ z7T>k{J)7(u*Y8C6o$~r!(QnuD6&9?z>or5~EM8IGH_F6+4fHRUaa9zoG-HS%?aJb^ zt7ylW>X#Auq4K!g5K!nAnO_B`dZ*IW;{!0}&@8Rz)T54AyRMo`2_tO)+o@ zRZ?|^Il~$_b(E*V_x3tg0BitJuj6MR3WCI?Mq!{+1}6{9&oAsDNx>6i(|e!(_%rkO z99+G#y}i9AcA!v@<05~A3c>kBN$_Rm)rS}R4j0?WatB;xp1EXD47`VGW7vd&O;fVU zpbvfU{ZBmo@uxoW%;L4RAHV#{(&B1Vi~57)iH|(_nNNP^z=4CEwe{7FmFe-Z`Kg($ ztaNzaOZ;;Pan-?hpUV|LOxDda|kfpT7E?Z-4V! zo-Jg7xOt1Yfc)xoRtW|u^ud&Gdv+e2d$f+L}IyIGL#2^dZY$fepZ*p>P9H&N^3^$sMFzBSNXYvJ3 zT5wbH0bK;mv$s(}M9f*BA$d3z@hL==2r6DY&v#8jj*z>}PcGbN_2zQn9>^nHkgwm; zSGC{)sNCycR~3I0q&~P#vmsSgrc5SxfUi@ubm!Kw11I)Q&9AO*1c(Qc5>Ts!=^%{< zn)Z6f4OT+BX`0>xksGd#iTgU8;AxxIC!^iD)t8)#L<1#HwUnIx#iX zsE-jyMNAMxk=a<=xPI+soF)U8`B!*K%`&LuFY&UiArdDkh&h*%3_>-Il!=@ZRkb4H zWAx=Oe)^ebJ~}l&KQ}$zoZ1(T&GiR^&6QhreFNwNDU-qwXMtQ!j6l8k!VF)w!%Lh) zvU1j((*K6azdTHO;fw*06=yiG)}@`cIz4#!#Jvxn9G_Zf)~EmUPyXz+w_a7i*H=J(`t8ZUX)5IbKx=+)(FvOKJ(oF{=fY{ zKK_BnL#3sgx8Ho{^`+&@Ud%@)_(wiAyRcA;#(JHtH(q(=`n6iG*Av*KTh|w_-?mB8>$S(m#@pR3pUNW&O%jAr z7?O<%5Y;SKD&<6}-oFbB5~yL+>$O@Kq-knFPz``6WM`3D_traaJ@?$F=EtWOSJn)q zZa8sjp(YP1iv=s&+s*MY14KsmFYH}h-MG56ITZ#IV~zE0*D%CUrf5>1YMYcm>_u=L z^2I{#>w|1#>Al(fKky-Yxx-SnNUPo$zz#Son1<);xnE2+twnm7a!pqkc==O#O~%wf znRPnTj>2zY;O%fWm8Hd%cB>Nw5d+2qiL(SO%+79XZVmeJ^5V*&y+;=I?7envB`KGC zHYvSC7FX9B;Y^Tm@2mm4fY}Jj?>I&U?8+GB&d>k9K>yugcDGj-|4`)=-SztN+^^fr z(XB`RW<{y~8*Ug?zr6RMl`antea@yyLB6;X9P7mN?D*s~2%=JJG$bCp_R23#pFZR3 zk`O3`!du~TFKJKjSt&%KR7A)cVPXvp6M+L`2(Zos=OMZ=XL`lQ>|FMbum0;8aE7im_#Ama(NmG)34=zRf8)9x~F&?x%8C)fgrq zbtxfGsKa1ueZ4ugu(`SM_B-d+RyJoF_5Q#DIDhl@^=mhdA3s)W)DP_6ySBO{*2QtJ zRtsllCil$k-8(gX!*I_@z(fS!UiBPN4Z$_S+EX9?_&@pI{8t}-;t6uPy}tg|>9=3} z$xqt-IPl7f+;4<{A{4f=DsuG6x|9D{Q9EFWR<%0&-c^x-Znxj-#cLbuqN;*hi>vXB zj8BZSAy_CN;xbX(k&)h1Tgu(@eyi^HMp9z9cM)FWr zdtCsSfTLPS%xN4a)kXJK)x8|EPJ~`H?*VemTV@Q$LpUXyBIdey18XkAb-A9~=FL{Vg(S;aC6rDcAS!jf-iNtR{b)hy1-<8w$wGY!8!=Uud`TX;T#?l+<^X{S zoJ$71wBO%WgOEcn8Pxy>Y1A9-eth%x(nF69TJ0W6A;hnE4FCbQ`#p>KkyH?O+m9BG zsv|>E&}tQ?sC-bdy8qWPfn7LKg?+v^U;5?fpFgeW`p%0+@VuN^#g5azQg>GMO+&)`Tyy`z{NeparkgWK+D}a*iE-=N)y~QqCoLtbP6SR> zJYxbW8TQ&~&Imo1TQ--Fx`{_IhV? zYl94kOwSH#weZHx>uN?~gpe*RO>|DAvE`_Dc5@c>x4bNi)Ne)_Ne)&J++bMMs1jEyy1lBUi&=ip1@ zX7<*c{BjvEbC*P3YZg8fwVc@;C5EFObD7$2O;p9XOfi)TI_=i%{Os(^jI6JxA{MAI zH$rxbGXk(1kquL5EvF`ZK5KM zax4^KQLTrZq;mG`+s{Ayxr2KTT)cKYPMssE2PU?zAojk)#^(0)_}GDkg{6(ndygIa z;G;9IoPGD*D@%ebj+ea3&gY@?r5`C@FootcTVR~Ieu^SXCs8O^vrBv^Kw%0RMwn7d z>9^*&UAJ&59U|NOpQ373=3bl$Glaskp1p53vSdm=y#|+SLD`4%i6)X5f+#x`wMf`P zjeqaf=GNZ5dk2GdyJO!uf1$t8PQ?;nDz!SuCksk-X=ObqQV~&Q6024ajD9NCD^Tu^ zvZ1YBTD_ObSMP$#?|tkpEa&THBv|Nf7Y;vc_f5ciw21EVRd;>oU3)k5!!Wza+2zg$ zW}MX9l{6;@(kwSHrOpNQXnbNS2y4!YF~%n8>u;WZ?d>;} zX^DDHpiE?Knm7dzF!s$g?m4mlk@r0?HeGx3&DZ08=is6J^ZSmZV!B(K^~fZ>ZkncI z1!Bu?3HfBgnYVo*(&WQY<(frUlt1m^k;)KLDjZGx7iTTANv!Q`tv`6+U{s5?TdiKN zPrzEQYd|InH`dlSx7yArz(I3ta(ed8;w?6)*Bf)w)Ni-n_ksJ{N$15EUvtnfG->J# z&}=l5K}nosI}T1 zmpTE2$U0#HD@7&%t3Xs>6+|4?>PS1A%bP#`@e7ZC@MD91e=KU)IGLTEpWk~hG&(j` z|Ii2D|JWlRICb)sH(o!JYHwq4ZGCg|`r=X;j@P5WV@kl}@sudftm#82NC^l6BUTc% z&RS7rhG9}sA{D?W2wsr@DZkohSoKu&{H$)^J6863BC#PZY zs4Df3%9*=JD_;EPynI=w-@R}8)ZFCE)^;}l_U@gV9dBB(ahfD443UTmP%~gdA`}=E zW`&4qyE|x@V5?`>H{0z&9Mu|g`j73lEoqyor{dh5=uTNf_= z$zS~N%7shKdLTjpGvJ&kd73FfQ$WbewX0LrGzH+@Z+!Vk1tKP93OR@qdvo#niTm$A zvT*QX_i_+$Keh}K&HU5qhGM7d?RKZ%-!ng_k#>7qjT#}(8&S(VbcMm>edalj-OV-v zTCU~{{&Oi_)G#aZItEhe?W?OaqreIfRM<*xIWD+NImN~74XyZWE1XMx07`%0(oXD0 zP<)3>4g};22m_?b2JFC$EZ)M&ShF!P-t?xSxR(r&465|zIVBMjF-fY#Ib~)Y%>Q_b zrOZ{f_#2e_WP8;?Owq4G>|n6G|D);Do_OEWq(FrPP;q?!w(zkaOFiKjUBmfw3{V0sS<&iiP))3%*@rBjl3wg zT)cAe?4>hl3RH?o`FbmU8|X5x_DsfMq97;cth*p4*qkNQf#b)H+E~zWX1m?i#q)1}^?&-K7k~B= zsr$fV4?gwuJxjYkchIv5Z8=}Odw7gtTjUdtZ#1-1z~f-AruOe z6ln@Jb>b*aU3^sMOnkXggper zOkVfMfXNoQk|-H~)LN^AL7bj@=k)s@d3buN(dnmSjT#fx*m%@S6b{&GC)aMRwR&!S zd+XiH=ZI-0AOnQCa)SZN^O6>ZUs9z)Et4ZqhI&j{IRpPU`6SZ5kwnDR(N}_I>$u#m z<#45x?WU^`GP+_5*eTS!g*0AJe*wQ9HGQcC&Qtn`W_n)$h5?3CI3N`PD7H3a96fgM z@PUKPFj$zG4w!6Kuaxt2*;$x`6BU90K~+w{P-7~`&>GCy=O}0mbGy-lc9r3WA+a3U z>H|iRw$j!rOD*4!pLZkP+)`!Q zm8)|4Q8mO0F;O@%G1+W3nV8umap%o9-+2A?H=M6{1+KX2jdoa}L?#Lt1a?AB9Mou* z9oHxvFbTZ>;X@}+-a9clwX%G(y|#Sc1M>r{?wv3*)6I>wrEX{2xm49b0q0vNnOv)+ z>IFYy&As7A8$p%+4i8R7oTQc6AoxHsg@T#c5Nl0szu#$3OitIrrT|S~qEYV;;sCgD z4k}sP^;|ANgCq z_qPu2-@CQE`tHTozV;{o>F2M$VQu>OhaUd$6Yslx>Bi!X#W)_cx_t*V#^ftIlMeC~ zqC?Z>EyYsw%daL-kxQXEyBWXB$u%D#|Ir(VZDNz8ABHAmSi!BOrR{p%upvSiaAHLq zh{-t-Wsown_gSh3!B{=&_hSHOUU{p%u~KU^9Fb9t2Ln|BMcbR3V!JnPUi#?|zrVG- za%j)~>6tyMGBG)EXL)51yCP~zvqCgJ*x1X4YT*4XRYjSgJ~tf+09H6Ah58b{QA9S; zrCYc0$YX~Vj;w9G+l>=ZVMV~1J1hgK#ntOe0d!&E;Z}cpdU|?#dTMiR%MYh1bu&uH zv+tq!CntALf#el&N|fck0;!4*ZwE8^`bR#Urr*+db8@kc3q+udN{g}Z1=b>z zwJO^b(>uiHweo1q6F6lQXOaYov23l?cI0we81m~ zBaqF*>pXYyVHP2qb~oN(vCzurA*2}kv-|mqoTH<+WKuMCIjRV{%O5KLl)QD6`*_xn ze^-ot&0_8jy4!1q@h{&_WfYM8lZ#L)a3Ufc)f$cF z7(faUYj5AW`RW_5F5Xs`oZl-Jqu~flEo1;GhB@BI>ssd3a2o%^~lp zR$EuJ%?o1HQ5h1GsA5dZbWMslNv+ehm8Dv(@$kbBO-+~};C38u_j?xD+TQy4Yp*O` zxKX2Eb#?pfyKgVAu5Yw@WX$aROucTJ&DucvlJo#r(a;1BK78u;|LNa3_29|vt<7s! zFa6~o|M_42_-E@Iy;Jv|`0VGNotvN7SY5kubEO-nJ{uE3tz@+mxiCQz@&I8fJCfDC zR4;@Qkjbl5a)si^XrwYc1#CE|0IAp;H*YyhCJa)b(@R!1THBqjwZdS)M<@UUD^68d zl~o8@4=4f!%n@*Naruw_=#SkX9czq{f{8;D8D*Ea7k~2VPk;34**7k{@PjwM`-2x= z`su5S*Y1op$L40|LELCWApoC3oWR*?&8;9rAkY3G4te1&7?8JZ5}+z!5ClOO1RN*s z%-Pe&j@<)5Q^yJ=Ow>attf+z<&`xxDW%c%rMW+-5G(FyIlVA9mqn-fuOvKEaQ;w0|A{PIh$y!6r_cJSGr zLB+gOo69BbiCC99n>ee4Fds7mq`>%ibm;JbQ}>@ba%lfxbGfy>ZfrVUZ#HYuJ;x5j zgMPQO<T(r+y6+4JVl z&t1KCr_<}FsU;Et5+|bSoNAWhG)H@{9VoU2g#<+9NNCwJr5pl~Yvd}Zf_%`l$ZwOT zxN`mK`u0|6f+l4V9s}#*R0hsD^8APi#0sb|)QP0dibz+i8j8Z&W~==l{^Ni6=?}lz z+uBId*q9&;gEa11Nt{j2o_^D4&&KVuXRm(q`!Brk%1ixD9}tL(!XPwUuO9YJvi7_M&SFc_b;MB3hU@{EDTn_?YU!Djd8vxsFx4gcQ#8#OO z9^5-KR`cGdRjYC z4*;@&30R>15BZT%HB9OdGI52*swgoEn>37wlrPF$e4!F%%BKt~{tH;8@;fSzelH8~ z&SQ7{$56W}jj!NywP{qgW+!_n2j=d)V`sYx==T2)zXijs80ttdMEQIVw-|?eQe&osh3kRC@#-6FUz4LS3?$+|+&7|K>`dydCAeVW-sbr-%a!Dy~bOru% z2rqz-@}E#yGDCeI84E&Qc^pJwV+;q*(IAP}mT%s3^x(&zdTMgA#=z{<^jN(%RS%Z$ z+URfIV`B&Q&DR13z>H5k|Lj-(`j5uldyX{tNlX!BfP6Vqud3#_C3AV6oJ(D{IM_ zD_53Q*EwJ|#@nKuPxzP9Khyu0wf~B;ExQgwu{r13`{YwO*Uho}c5a{p8t6tMK?G6+ zAu3bkBPDCR=OO7?w)N~`d-&61_`@Iec=qtKcQb@JI^&FPP|)(+>Ks&0^Pqfz&qefC~)u9-uU&jv6Nxf5%k6%PnZon&D}5QZ8R z1QERd;rlPY^x3J2@rc3qsjJyTV_w0SwFc-i+OeQbFSz}iS1ZneP( zl&)TK2ots^kyjk*N6Sf@U@HL-;G|k3rhDKHr?mBp#!(w)fT(1Y8|w}c~FNryN1Y5B0-~32Vl`)Ql=>K3nfpH?)N`>^Q||3^pi%jUn>_CCXnMBQY=NW?stQ+iFzCbaS$jZ5VAN%(AmpH z#2TE%x#|j_Bxz|9J;~uTYIoO=^a2zXt#p&RqD# zU;4$9XHK-YH?Ds0;UE0RKfe3m!T8kNZ~a%l`Nglk{@}r*JGbwL{dT=vs`y^4jrgBh zlq~LZ!=@onNIxgrpPU0U_0vwLx2iz!BB$n>SAHKJf!W;~P8 z93}GtSqLK#1h$ZR01Zw-Iz!&m*=KPIWp*61Dxc)oC$T<>B#dU14Y`}S3|97} zr}8djet{e_m-){sK`n(#S2e%ZIn@xR4$o65C@^+!FO|AL6%nJHZ1>NGN8fU zNAz~!fJVNZ-c0q$>7JNlWB1i$3}IG8{YLA`rHiYp4;a8x1jKO|>6po-`bjQvs8upP z=HL{929gv)sjL>~CTFK>{pQ~0+N0KfqaOr1jFg8#&<}f|snMFifssog3p@@i1i-l< zA(ByzxLPv_TSQhzIyrg-d>|vEf%W`FZ zXqFV5ouiXym#2&O1iSqJHyCyX%m$(>hhXp(ArTpE3fWzAv<(D-5yfPzGc(khnOTY@Uo-s0kN;wRerjs6CIG@5 z3n(NML1!%q0J?G9?RC*trAlFbx{fa0e|msTo^7<`*#L=H2StlmO$eABoEa}7A}T_% zaRE*_pE){%hz_%8%sC3BP!5oDVQ{;i!#WwUFk?T+14$ZJobm)NQh@CVB7;A}HG)J0E;zzbH2?Ea9%xUv8miNIZ2?yztI6`NzUh)O)qq!Zx>_#x42*+`| zx%+7C)~RF1|I6R{&1arGU-mEx0|40D>wfop|Cy-r`l~Nh#>SeBJl2( z0;yN49;svr1%!oT=7>39CPjY1_dG&`Fcu*0_I0G;!uh3t`akuW$YvZH$-~JE(?t9JV{@iS}P*7tPRj+tsRlneS3L(a`1o+ zeg;B|h8^XT1Vf0?VhFHiv}!8Y+G?$CtRFve%qP%nkgygIU_rEDCL25L_by)D+}S&I z=E$)l^HUWIu_^etx?bAq;jHYz3D&j%WCpY0HKPSZM1l;y4BEMj)&VpzM&E*tU=6V9quRkiOn<<2$TK+j?eJ%l!F(DTFm%b_ ze=yA%MmHLw-G( zSvwqt!z+e%b_vc*mt(}@m~)z8lLZiv5Is=^uTUGSHFwu(2e#ckTpX=y}TYOm5K`AQm7ZpS&Vb z!B>@1!6%495P+wSP5sI*|I(L#;Ttc0?zOq4D6 zMOw2`$N)EQ-t_(ASiKgqlzh)nO;cA+gLsI&7#=;`*xzfMI(}klZl+$Vs1&MEz$Ww& zK@n%qH5Y&hh;jdch%w+ZGm9A0nxzr~kjNEjbW_61!w@770JYO(W@4dIpw1i%8sW3G)ZQ{Q?PqE`hgIH^=qc}EUlL?oU6!1tu z&2(WLdWfJ@ESAbOBaQ%yKlaG_wJ@<8Jnm9NvL%c#~Y1i!AAk;c00YGhuUSB z5kLVCtyi&05vth$h_Hwa6hH*B)ZSoTqqf%!B2p-L#e!cfP}GTccDAb38Ug6UO~w?l z01%M^VH9c+uGOovv(w89(+aH_z#bzsa3lbnilRo&G{Tk(CoEW{R_!>!E!(dAZZ0o*QyYrN2meT zHg>z6s0{G@v(Jpx#}#6!=!w(+cs|X}P0USAjMr*003djF0LeMb#Z4u+Ct*y{v0$J2 z8iIKoc{{sypVZPPq2tWRQ+n~2!~V9xG>P|c51)7?ohLbPvQ+64`_6noKm(v6D4i7r7$hsbf46XUgs zv9a;`m`{Ej_DM7_N*3sxOOGVsX^E$qy^9X`?E_9mJZLj4S2ZM~Wf6Xcl!)adOvpR} zLM$=I#ZuwSg|lI2XL54tD?k6njjIR1=^y=*e_pH=fB5~M{QiIZqsDIgSAX?a|Hj|>^~ssJjmMjJZ(MHc#;G%> zo;>%&-J5s&o$hqVj~?yC(lTQaG$jF2#lP7ro35?GX4NFn0RSRr*lH9ICcgzaGdpc z#7t4oRM^YyvKY;+F2sAY!Tz0z^eh09m-8s8TB5 zy><2c)32OAed@WVFYIi*)$T_o>mdRvf}Rc|&FqQ+xM>-l#^gUwEUy3nEKn{NCMIg* z^?DQpao9)0GKoujlCYsE&!5l{J7`W2AwWVHG7CDmK>2@$7bo|)J0N1^Q4vA#$kRF^ zDp#uYX0IJRURzw6|MC~#xO8jvy{iuZ;LfAF?|*RliL+;;{`TJ9?%d+it-JTih5Fz5 zjo&(Q{P^0<+yB@9?*Dx6?wyxjeEBzi^Y6?~FSI-Doy|v$&i3bCeX#@u-z&^7%+Jow zUb%j!P$)RuZc(*4liHR)%zAsGix|qqdgXWuN$+L&17}XiaAKzB7H14>1}Ex>8?Aj7 zHUz+o%|v7n*y_z;1T#f^>A5Ffe&vNXzVd}PY@B= z?Gyk4nrtB^uF7CX&43_b6d9KxLg==7z*O{o5%9GNSZe?eV1CRm6#T|+mt(kdXJxG9 zk5A92g6Df)D~wDP0ZwY^2zUexVgjd8NPvy{#1I}~Hr12SRCh-76k4e+wdvR`Fr*CA z%5jo}=U8N(i~B`K&)u030O!TvHZvpqCBeiA(J|Cg+`faQBVZ0T0HQeiuI0isYo938 zFgaCSSe(9n%Zos&ip!|9XaUf`y{NlXnyFPiMIa1=6~QbwIP$U*$fOWO6W~>k)5BiZ*k-9nk)#M&-5@ac!l?GNlXy0}>f}HggRjy6kvx@L2>%IS<2I zTO6p6s+D@9-T2_$pFDZ`*=L@7=A+9u!biJ|s5KXqigg^jp=6oLOowQcvmg+IFhG?+ z5mw5j@v&NCXE%yNv`oBlv`ZpdQg#)L5DRHZ7jWK;I0Q8bmvg{!q_59c9!dRMK zMZgqLVqm36>!{V}dX@5fKluLV-}vSWpLzbpcQ0PL`k)7}(`f(h@BQBY^tXQP{^qSK zH*RV2H?}vxS1aT?@6I7$2WsT)cMa^7Sj% zZ(P0kaBX{{RvfDrJ&_>P;Q2NMBK^@&UB~6ak*Uu=wJWr#13l{P?4l_3p-c=W6Nh zDWPV&?fa?#Q3McYRu94O_rS*em{@_W{DJ_`Krg>qjQI-8kH!@TjeXvT5tya22|OqI zKFN5jxG5X>w2X<{c}x&^at_dO^I7gND-8@FQs-K(F*D)M@trbxo4mIowwfK zX|3NIEBvKA|-Rgl;$NmpX5oC>B*P} z7yyL`Kp8K4L=<6H3iSBQ*tfs_b6@<@YfnA@)cEAs{?1;n-#v14K9KO%#akCY{OIj> zKH7M=-RX47Wp84tR`8T)E+U0m46`W&%s?LafLN)NDwQ|_r4)cRXC-mZocs-H5Dt+cubUugFax^C=DLOZ=9= z5~93#Yj%0ID~{u_pi7ktUONlgYSuWu&~} z_tS;S_)6tnqDW3H6c z?DTl0TvCvW{5IM{5+)E~Hby%Spsa9WtUNzAGd?yJYwq^CBH+xuj{Q$0p=8jhaAd@R zjMon2S8MdVQ;a`&f-*ogbhrdk*FHd0VHgQ>9C6sg_1*UG|Ji##`I8^d&o3W6b=17D zwtoN8t;`}c1gSvs<~wDhAt`{8f@>wmrZVB>H7@;AQp^FLScN>Qv)6=o)< zYxS`(f-uyquZkzWn#QmuawE?X+S^`ki@KG4m3w`90F?=_B>TC78rp6jmia# z-zTCLiJ}Mq$YOQJ?c4BG2C)HK&I#Xe-k69FVXPyqK>-7YQKUs{03n$umrtHNdG7St zdZ|zXC@FaA$%XOpYNcAJk5`EZodG;{5|W`l046p8QGurtbOl7>DNxK&&!Yft?%AD(rtxGa^G=~t=&CY&KIHg2KB*11F0eqlt zkAL#cJF`=B-}uJYdQn`j)oRreB1AE0;c}&dK21;7i;BthX%A!`k2x16ckuG3HA4$B z-awf-WL#rGh_RuU9Kxr`LM+sb^n$@wp?%X2&We1yCTb zR4$TIh%RYjrUw&-t!t^`<{EOfIH(MK9Uw`AP%ZqaWu-Axx z^yZsgk3#$g;s z!Pdss%Ibr1r8+h~RV>#$fM1v-dpiU8x`I}4jlkj+eHob*i3gfrV zlB%-@q=XCxNEgwR$5IHMLS;lY00Hm-zWBzMzxhjled*YRDE8wx))a4Vt$+Of`_z5B=&t&D87fq0+maiSMUnOqVE@Cty{gW z$09uk^K*HXvGA_Tlv8nJ#3h~B-+%}9xl!U zDCaJeS9>@Z$Y4hEtFRTQ%9Vm<=yxN(R2-|-iatHuS@+9@O2rEV8oLc2v0krEPSuLY zUWRou@=XF?!v{GN2QhRdn>)xFrcaD~Z`9?;p*sy3$jP-nG)f#m7(>0{0iQ=-IJ^iW zg!F^Ojg)Mo!3)`84RxOgcW6J4LYC?561$LzUo=sdg3#LAX7P_7TfXqbIh6aw#{T$t zEz;nDh*&j+IL=W6C_x4R(TIQo<#M6Z35%Xrt5&9GrVSbbuyxN^GB;fOG`^1{^+9zkJf{3{M7l=&prFu0#K+~2SFHgS)y8H zs^C+*7jCcb1fh7I-|Mv3AFj{LOa>dVaMv6io0rQl`e1-oSU{!v8%dt9>t_t(8L3{J zLzX1^V#&=qzc>h)5Ig5pY;xHMAdnyu#>|uD@>9>f^yCYl8LQVwf}p$K>viwkzWe^$ zKfQeE#>(9XKH}6=bz-v8ZuH_fM#PvS4mF`yD*6Z*d$EX=s^wat)C}WZFNlDGK$^{< zAJ~yHA}S?X+o5X#51B>TT>C(XoZ2tasUV^W$O1%h<%v85W8ySLmMeuqI}HE)t;_2h z|Lw~!Jn@;Qo*=LCpWpoG&dLU1F^afcF2_ujeyF>lwgsrIo}OIF2|^$d078@gjX@C- z5{sCs0NSQ=Fs3zR>#tqEIUQ<3r;-U65YOZ8!O4%jhWYP-&l&i^5fA0R9f+SZ?a0W%Bs4h3 zXC=Q3G<*OKbIUi-kZoY(@G*%h&C!C48WL=V6>wl6%vwk6dA{#cquF`%XqDsMvBlY? znejrcytCVgb+lt0rL#fdMm3EZSOL^a-gu>2io>P3nc1o7`q)_5ZE9d`Dw8M7O2$P| zEGiyYY;m7I4cQ;Lx(Rw1crf8s%+W%_Jd0=m1SBK|rcT_ehMh0H^4Y65Z~fry%kTX3 zrT)ueq(v{2m`};9Sqt%Q-0{|)Idn(egDSVUQbYtX9{U0IYE|^LQ zsU2A|Ck%!FGyeheG{WqrZCGot_6HFUpjIDWI(~9&d?M_&_I4lLzWUL_2Y23o@4bf) z9<4uKR|r#6S-V#6f6B{QVUx)LCw0#68l$BKSCh_2pR4?3;Y zmHWP5&@8v^K6tpk>7nN-RjyR$rY3~6yw0EQ$mpt3Fr4ta>6ctoOr83DjV z2Aik?r2qw)IayA0764AT610h~0Ubx0dO;Y_G;_lYPoJp?kqQguFOoY_md{THnms7) z3|Ni>!LVZn09eQ6LUBI`dfk4pT8{!90o1F7`SSGU!^aZy&d%1;7tWUaLP4PiDXAKb z1zmTT9g!UJ@F8q&24xSiGxlco*F(lK?2RT$s_uay&BArdi>z<(`F0UInyDFaX(ZDf}-bUC(fQacIW1u?d|Q^rA1O$t5mkJ z>6`q?mSZp$OaUMTf&f0i((J5{GF6_Lo12}VofXafegJIp;u^3QU~zH%Zgo@e#4HPw z(5qxgK8YUWf#M*N?8t;bLV9dYBmqWY!$0pgw@QBfzxwsRx4!;=Tv^+H`>l7jcK6x~+Bxg^PYcO_cWcy?V96 z97jRF9|Xlx5m*;}zgY0+7N@UWza0i~4B!C@a}cvV6;``pR0K(35OBXF7Ho7fw?#;t z3I*wG2bmKz8=rm|paEbL?^|h8A&GFYR62k56zF(=Z}-RF|G~R&{djx#@!I`W-}7cB zC!qjEpP{)WUjGbQGXDd)rGAw2QQHp@j zuq7tLkpLU@j+nG`D2O7QWFa&T_%1DpAsWWvOauWGLCg|Fan+}8#A_R!o&7$5#G2ay z6dQ4&h^2y8jWmF&mP-P{8luQX0*I}?fMnuj#X%0Cuy~$zfkQx6$PpXGkOB~epiNO; z(W!TSlETLBEahM}IShvEV*(I4RjxZI*(+%y$Bn1IrX(O`x6&M1fC5NJD1;Qokpcjc ze!E#H7REh@dY#F|<s*VIa9McF!93TMEQ3%YU<ah0!=y+X0F=EHSKt-Yy_B!nz1QXNq|J#4^PyW?+|A>Rm!tCtV|Jv7|eClL(fB){C zm4YJj_$TlE%UnP9QY3U=WP2IwCMzx=09C|1D@ZZZMoL7;|mnXhA4i z000aNPDCtRA^?JJpkr+ZAOIlP>O|dsLn-oJQ26s?P5`8rYECbV{5B<bFPls<7c@+N7wLj44;XL7}&T^mgG{CXhnb15dvZTwG8&rRtNtPk4dV<3QnHBbu(cmy7iFq0&yMFda?2?>~)5IJ>@LULaAHVV-p zf5SJM=yY?S5rG*P#3K@*h}k$FTLv3JBeeP~04fGVRvsgerwA1&K|#1F=HvAZ5}BEvD*Cj) zw^OeJ3uYsM9W3Spv_@VT+uUdzo<(|xwlpBrjBMdBq?y4M83k*m39D zai%~Q8k1cxOn?}{kt0WVGeINijt=|jj*5)3zepA`Gs~D^oW$zUje3?46?udZhCzWa z3ftAH|HP?fC_tytFZ=%a3m1O%Z~l$@s}K8;9xqj+PFSB%uYdLPZ@>G&#>2;Zo4eCT z79ZYUn_rxdBoZW2SS$H*f2NQ?blLYN>y?%DU5?{OfCwWN z5zq_pa*~ig5WC>7Ks@|l){3EiUVY1aFuY;La znIIAS7Moxz0RW{)gb~3*6ck}b7q(7_p28?*VPj?iQ}%`Y)Fwp zv@E@VXwfkXS*1Q82r>f38hnom#iFp*teGX$0sy8^unDgx0@ikGP%_MTa>7x7gv4Th z02E_J1E+dUX}JRhORpUSfVG?;W+D;XN~PR(M&;lL5D-D7TI{qt`}@1qa<%Art$w$$ z*Eo0j_{!bJv(G%ex&CNleZ5*O8Q%~KGzl{O6rAt?_RL|g!%=>At%mrW!N(3m{V}oeg_=umb1S9k9j2wZjL^T=qJIbR@h48VIA8b0AlizArZ$q(qR;aQp|H1n9_V&)s!$%vvPJef&+3AI09Cu=<0F2eWrMbx`&K-O1xeL=XK7aqg+Krnx z9;`hWpPgS?oBcelyCJwLt%>d>i=;6J?Wqi! zrHPRFoSbAgQ83HwG=1(*9^^6Cnq{)JMJ6bSC=|13(Fh=+ZtOG@{0<D~O73l>Sb zHBdkzBBT_6h?qi;*8fTXMKq$ZO_>)liB&ecgTi1;R<2P2hZNH@no)O%prCT5V?YEC zl^F^HA{IOXLao^YjI=04jKHx*C9IiEgAe$Y~twXAN&b!IDolm@H zWY9eaQp@K6Sp=J1yjhDtINBU!p+90HQ{c=HHJ+U;G{?@mtCKmUangI>I`wX?Ok zwcl**?>3vw?)L6Zzt<_33e(dQCypOIb>hUr@|9)dtpS8|8y15{C%bYqJbPkQ> zfi?LvNUHNVe{d~wgfPEcNt2m*C+lGPF{~A%kn)sLpkrU5D)3r`+Daq>8M(B5j? zzq|7P{O|rR|Ky+lH_tqG;iqrE{X5_NUKB=aKYjPv7vDc|=E>SvJq~&vd7e^n6h{4M ztTw@My#Dyw&FeRJ_jWto9uaxK0f6O;jXA|CVMgp`Qj|3rclH6yY-<9d=_X5#-N~*; z7XDlTU2(FPXcOZK1~GvKA%sYBn?_*WRS7)=od|F2=)EFT$_QB^8i;i)APfos5emx0 zNQo!{WMaGDN!X!rwM2&zB~jl95TZtB6HPR?;v8!%WkH)`)zDf5%#Icqz=(P5${fUXO@slU!k1Wk}JN=*+w%YA>w-ZM} zr`MgCoSvANn4FpfktmLJ6tZZgP+YBTacCvo$2^oAIOufbhy%coQjC<4BvgIG6!T3E zFPbDRijWWyvewLkggOd14r)~o!fx16>${I`-&w8skMG~S{Y$_2*P89t-uA|$jopn_ zc=ht7W@E25R#slgBVgtzjDZ1te{*YVdwZ*~zvuad#%`k@#*p~bax(a=3;+qsmz>pu zaCd%Z-J+z^M>O7ti5?}>TKcb;RA&fi4Z<3L(W-Y0CS}Wv8ow?fFr|Y{^8OeI$e=Mm z5+M*IlRyCgKo~_N)*yy#C^SZ3!vzB(lCeahh?qLPWYM=6cYCp%np-8~fih_NwEjPa zWSGw^V)3i1TrC2q0gw@iOnfhahp4rwoGMYQm8nq!A{tnP0D(x63!qV0AQdrltQi@(VbQg$bmmmSbJ{BGfDz>b93XC(t_fS?7YrzU%Gb9Z-VabbRHVw|J?Zlihr)X8?U zJysu|nx2fBk!KpiRqd1Phnteq$*?rVGh%l+2~cqd#N0zMh=Rx?1eRDl-}ho&uhq6TcQ0T6c&pLd=iZ|>qL5M^3Nt7&IiMH;V&{R100`hIPzo(lWQIgS$@n-T z0t15xYY}Hkb^DW2E=h8%nPF!jgPlDCU5ykiz#53aW-=!vyYEKo5h5_r{DUt ziqcRn79uX(zIFF&U;Fax?Ci~(x3{-P-G7AB}gNC_Ori=RR*R$vqM+v4KajuMl*;w@`FPa!^6n;mi(NT8*=A7yH2@h za?{S9`3!qFJk)`4h0AbJ<;V6!bVNxNOLzJmqn2KEK{L)e7Ml@;;gDaBu7B{(hus(e;L62I+v_XOzVN(Og z=Vh9bRP(;p?lcn;h@nkNq4H2bgc+3`B@rN?ue^vu0`@$Q$ctm$kK=wAAq1j3r_L8V89WFjLjy4jD`@Tm495YXbNZ<>2~1cW^bkEBcbq#{d@R8 zeab7r<*5bc6EIKKdYPQc>@$P!k8TeSerDLonwEO}-JcRw5t* zN)eH#S;w)~5(jb6?(QkC(C_yALIDJ#Fm|5W$U2R16v$9{+mBn95$lne#_**63YP(G zNqTmwWK0<1>~aAJ04Xx+2O`yM^*X&?r`4REn?A94ssxw&0Q;@|%kRDO!c)(kKEC+c zt1sQX_eWv7RjC)1Pu*5O4kIdxu&Jdby-t5}W;SBDbLT;$+3t0_lmx7bWPRlG%QT4n z4~E^;j+Ic61Z8BICeE+|?xtg?K@b?7#+@iF)F3iwhe**U066n+tc5xD6tFO8NdyrE zs0frI6d?~4xpQr_JeKsaAt5On&u)pV4Z(2^POoiVw^KI8O=k~C6yI!^5wq_MX|^yk zTM%%%I3f~B(?6gB`?Mk@z$k+dNCaAIr4%YE_{AvVX1m*uKnr*T)oS6$@nf&P z{GyIwYklMX>e|Zv`&--F{eIkoh&=HWmV65OIsym}J%##JG)Xb~41 zXNKp*7K>*jVPzcJv|l9QcLui1J!NQ$^@KAEy1Tpgl{Y^3gCBlB2*a7F@lwgxLEP{6 zo2{0opf+9s5ibQccal>QFo4gKuZZbi`)h`!&pqkB=ONIA3YBL@xr;L*5o{GF|MKf!`#XRC@7}p{>z()R>}+*Dy!i32c3O+e z^XH#FH^1;sCkTB)Ld7QX2SMvdkV#>+R;{;dH+F8U-e29`ZEBWCYXF-nHEZ~l{AbEc zk2AXsLnHw*((M2&WVe^ngCI#4NI)6oCsE=ogIYvbk_2hPdy!<06UXDl8cY^w6d*)J zLXb#B+zPC!G3k-URTW$!Nt0m9VQd8WyXrB z)*67oIr#$!3L%p5^+XXCrA&k@BD(bVh{iZ90tl>-N`+FXTxxYf7GMNH2nD9A#f7=) zS6_K`dUo=`%Kf`{SMJ@MTYIo_``*g-#(rZjL=TE3s!S9+{Wu79%%Edt2G2tg1QTWq zU`h{YV2{Ws48b`vm~~4LT#9WRpPO+D!z7=ldui0t!!mu({>vfwth|1+c#^Wmo6zK3HW{&jeEB9QI#&hr~$-jZ0(DER&X@N77 zF7J~Dl>KT2$IQX|6jUR56?2dc4$uXL29e#I!y3&ZfPul-MI3=eCBtev?3^r!lhMSA z$qAsaqvs4Rj77*uz8-mq6i3Wj5Q$^$6vtrK*lB4U#mcNn^?&ofI(_~KF|I${`tZ^R zTRY7s&Yphd)n~ii{gsvbt=%2bq33zRIt+s-47G5nTtr12iw<;SzvX$J2sr*2#HCsq z7&K(=$k5+ppB;$X?}u;})}4_6Fhv1`Km=rR8d$Fsb|_Sk5J;2)&!#=dQg1|(`!a9nP83g@; zA8Abr8375EM}2{2x3|8#d+*-;Rxg~HpS|$h6R&;#bFY2z3txHT_0PZd!ttZy1%!5s zo9zHmPt^RWnqMFwfGAE)?F<0S5;KZMVWm(3Ads?0N>FSBgTtJdIV*Oh4VE(Wq@@3(T&(>w5^ElS9WehX>nbX_e+J&dfnSE{k#jpe7%R!p2m2m4>V4Q- zsXagY6S@{MBh8G!%_+l2<@O`X1Liw*n9h-wWDo4Ri#bIo)?tHSR)xSq2p)h_ToFndH1+qxy3@uSZV5JwI^%QFwG!vG=4oj|7@ zHb0P?Gi0?d2*wU>k|UYyfua!Eqz=yM+Xt4|#D956zDLIK22I5{6vJ&>8O$-`M!l02 z&Yd>QSVWbWpkFYFK@%UJ#97|V#%kv?4LYlUT9 zBV|^{ShtCR5sSX(DMG}46boXv7Xl&>g_;SV7sPM9_tE}-`-K~qpMUnk6Q_=yc;?)* z7fwGs`|#1DtqT`cuU@~qv9;L?`av9Nt%FWPs^4q`p{Yo$LA0O(-zSb(8Osa-l46ip zlL!MLkqZX2XDSU7NIktkoU?l16 z;ZZvie9oO|ctZJKF#Z1_B;Y^Gz4h_iZ~f69e0P4K*zI)6wbItcdb8685F`kK zzOV@DIMzWJ_WD6DW)|#(Q3yb+8Ip`PmaR^dJd}$|Y6fxy^j5XCr2|_>s zq)hOZC4$C7hmc~6A4MqzgkcnO9QPyL3v{Hx^N3jkg6H`=8{N0JFJ8ZK^S!s;d-91B zU;e^tr%s(bcj5fx;_~9LBd5=uYqr|WPHTI6x6x>}o83;g*KKthjrQjD-hQLi3pv&x z!l;0V!NkmoBU2`@0ka88-F8?6@4zDyB@9Nv1u6alFkvW0gO4E24;A71-IWu^kGIEA z`A{j>5Y+x&Qvj>Ay6;h?T=eqndIr7ap>yEO@k|)WM`JR71xsOA`al=KM$kqy) zDf{KLV`(obZOft5MB6`l=|@t~%o^n*#zwu9xtHg?uosyEImKe36NJ7Z(2M{jLSfJ#F#tOE8cw$%T~9m!K89!Jb_BBT0y-0@fx?Vh z*wI07#ym_ZhZvmbeAJO5$0kDtR?Ouj7%@Km#!jhRs3{01rZ6@EQfR$8#k%oW#XUIU zG(16eJsaC*MnfoxozGAOn-I>_>_VID6aj^8fEXYk+n6%Pz%Xbaj{uB$f>D53YY`8K z1$+V`DtbO3#td30W^Q(LY(n`wD3%LB823U3#BMB|t$uUw&W*eGS68;4dFsp;KKJtM z%xt;lof$u&l!{pzjYg~0Y_)o=PPg9;yRGi-&hF~kqboOVZ*A|kd#nIL1_CJ->_H`E z10=vAZE!*ky2F-J@h9Yz(&OrY!m@s7=_b0eXffQqyZQ@X`O4aAytew7HO$Y=DUS=D zQeKfL?)94)FCdE)GRPodu72h#MPEZ+rg<#jns-EgR7+U~X{eXM--cTsAVdx~4c^OR z+ff~1{$m2c2M-Ff1CVStX&VFYXGfckW%K}tNpUVcgJ~-n1}08r4wsu^*pzCe9P+Sn z>|oCq*aMlOnu8W9ot%T>9OI4&%X+|iW$xt{HuptFe8GW@7I&;HEfWw$2&e$T*WzjZ z>6<_L<;63FQnga7oj!GTYh(NF%}4EC@WQiCKl9`{zv#7^`>Lc$#ZtS`@H|y6m3!Sl zDW51ZITz^I!=Sj3ofO{B3aijo3SQsmt!^qn@x zGEIix=8V*t`WTpA1uU+1Zi5IeWXxbf6a*wwY}t`TW2r&_u(5BJ@R+~=YYQ@I54Ct6 zc%%eHBnF~F!Bfg-&HY};ApJ-i*+!INF_i=`inN&nA%r50ef{Q}7jNIczqPsf%BwG) zee&#Ny+#T>#IfnIiJ2N}==VY$#!(nG_u9uFZJaoM?9#2o%ruWJTqf-2?wpOl+|RTpmCIPBAChZ9x;SrKkT=A{eHXAI(hc| z3okr(^~y&#uHIN)UY?p;T)A~W>jr8@A&%P|MBGC#Ir18Tzz#C~3r$4_*WrWd|Rr?Kos15Bg~ov6Dj<*&TjI4YF;clWH(?KLN0e2<12{ z%)XsPx|p$63?l1{G;1F)bWu_QX$SL3fO5!X5hS|RPkR#EIcZ^!6bLJTu}U@2y?(zv zHZealzjXBU8AkQfH-9n{X#weU`;BI|J|0Y<@(Ri;6{Db6WWQ7?G76xqudg$}SgC-7 zll9ut+)Sxb^nHJ0eWTUs!yZ!zp=O;~qhVa1(1Y|o4uYe5(bNgCdB=`AZ3jBf~Ad!+- zgF9RaC?jR(o@0%(|Ds!I^Z$g*8`S8NNrR4%Eex|jzA4dH6(WcfK2oMcd8Sv-N=lIjmd}zVl zL@_fm_$BfYV~(|EUDOL)>FDC}yO*x4t!!xxy`C@$0DH!} z$-urgBsIYR4ip@eqg_3rEZ94B5r84{ZojrHv;l2C)Zf|OGVrF`7bMsNJ z(*+Gv^Yfz#fU}|w17r5aFi$h^tfau3hpmBgKg@)WXm12U90J;u2ExGD9EHq1Y?d_7 z)qc`7;;i8Cz2O#R;C5o|8nHqLwlsQ_1HTU%MGc%J8mJ6_q0{VODg?Mi!OWMG?&KNO z{M3@^U`l5Y+`40C{|=k-!E`;>ZOWO9kgPD{GGR3VkjCAE5GW*t8gAXZ{M7R=mx^Px zN_lR6_QdIv6a^mf>e_==v(aoeIEsq}Kj`+m{eIN%D%8pYk?8z|)2+t7#PY-w$Dg`z zy5A4>cD6JGmp21fx*aJvObO4%N}-68;B0*?uS2nA6~%(1O9 zUnzUDQE%m5GqfCrUYRgl6s z;8^>`V$myfyZso&FI7CGW~+bw`n^`Gv$fk2MYVEu`RLNwwA2OvBA%zHALAsUHmlV?)SHW^ZG zD472y`Qd%4D@*$zIaVXy9$1$V1IPU5(Ld)g#>im~wC>Ds`2nO$oEUwbjwdg*SUAg5 z|AC>x&_ELOZuSk+Z-*1NQPjX8z1#zKXafUF$c$JP)ggYjDe0=1GPB0xLZN0|Ql8fF zhwr`p+E>0=8>=g&PMthi@JKkUj@MW2-HyVr-)%=>-%}EFBi}2a;-g2G_nWP?wTB$T z^1{NIv&R+k&gS~w{@&u!v?BHJ;p5HiM%?du$OY?|M`HX_03_!mnjG`2u_%T6bnwQ_ z-=J0^ry)sDwiw3Pu110!#ca0uYS}~qBosk0{^*($-!W@QNVXTPb_FcAga{z)!cHJb zbe~3U+5BhDgCJ2+I5h5r0!SS{#blEpZ1=XUb}Vc{^LjM{a6By zJr9eX3L-A~6vd*5gn`J@S{IN4;n|t#YN_V?Wdc8-V6V~GSby|rbv@Qtua5^|)ND2$ zKi&#Ly|vv57zA1mAFtoMe*JT=e(u#5Ua60bU%Gg$vDXp}5r~+=X9Awl+*w}LE~~Sm zSxGFd2kI77%#n3QVzf?QC?Xo5ABBzmrV^T(8uNXO!=PNQD$l=l?e+_=d`8FGgH))` zb1Dv7kL30ax(?y$28qK+zBY#k2A+0I$0v;;Lk4nKDvz=(T<3Ahr@lT3Cl5RbBL+S6 z<^ZEO;!66H!M?Mo0+Q9rahcZM_GvWjS+r{J47nf;3@gzW4HAYt#vUXj1D>?Q^!R}8 z(taVqEy>^XA&Y^WUx{;tQl>C1ijVSO^#(*=tyC)~PMz4^*{W75!a=!S(Hw7WZrr=` zpxf;)E-wcC*4}n&dU|GIVP?O%^x*dN!`X==OOq4zQe$u5Q}X#&pPHVT4&!+J@lFuy zW~W^!C?O1cF#>~-02v!4=7yLqN>(@HQUoAJ>P#4fA^;#FVvb1w7>Yhr6dqfgIl4Su zDU}PA;>lCXPnFD*nj!)nr#v=PY==Qol{PABr zeeS7K$4}QwrEAx2tUcV+T4De}D0r4Fv)Q|yhZmX%Z^M>lSXOk0+Wrr7m=Rqvm`+DFY0RFY)q9nAGg}Qsyan zdjwyc?R7|tlxP&p&)N1<_n<-cGHVt{`x+3xGF)jENel}=gFN~$bDy2!p_B+mk_Q=R zHD{K{55RHM12aLbV?-s)9?@=V@A2A$lTSP~Ge1|Y)wD1~J>cmvkKlQE43k;L=MeMXZf zB;%etK=G3WGyuYaCXIn13dVYDxYT4<6VKAb5@0tHK?GQ=637xF1OzJq7$hVDL}JmG zYZcvh5N6}|0#2SuC=CM{YlRj@>tf`Yz&{O|p;Cs0>9HeoGbfKNPEL%)5>L)f&Cktt zgAOVG$dUQ!`ROyKPJVd#$~*6TaR2^;ei(y>cB~12i9DqUvHiinV&X)mvX% zfA{^5Z(O^2`O>v+H*V~=6=I=S>PKNisRsA}0RR9=L_t&>u#bqSN(F@ojb0D|Z0tnM zcRp%$+poR++T6_ayYF3ES$)v#1uPK9A^?gKKUaf=g&7E0tjo^;B&U#L1zfXr0;!4& zAc{44MFDI#_D>!^#mq+*mYVzf-~WR@dHT6m5)}|SoRWMW#6T9fvWG8!Wx?nW4sP(3 zL9XzCuQK|90d$|?fCvAk5bkI|9>-;$9!-=o<2ZPngHOuH#}d&aM|UK%ga`C9YGji8 zko}gr3=a{t%)$-h@GSp4IR0eZ1KkZYftfB0+mO1Y0Ay4&IP{+TawvH)O(l|QBI;!L z%xrrJnMOcBkA;P`@0Ci0!u`8fkDNH;6}*C9isLwhAk!G_G zu|rmvs&WU9Ny2NT&XLxik;rgliDd?2w%O+0CTENsk^+@;sRWQLm;nL+r^zxfzYB&o z0D_2U7DAJYO(2Ok61P1FVjO$ey#i_UDj420DPfTKF(q|?(dCXYI1B;OvhWBXf?|u8 zSq)msJQ#m<^*?)gXvi}OpRO10nX z0(q6PREnhwPo7#@nmv8;=!YL)eE;K1j~{PGJpq8CLao_XO0;NT1Q@H=wf45wcR%|0 z<_~`G?!$+x57xF>gYvK+OQ911f=5uP6ooMgBQ4+oL;wuX)^PFW?UGmg>}Nmwi{JXn z$M0Rfc=N`_`cC8!0xKj0js*#rL9E-BNg-sFa>nJ=?5uUAvRs9^E!u1rLM+hh1w^V+ zt8>4l3RJI_=VoUfZ%wbwu^)+};enWcc=yG*K4)3ZgxnzH7tdl=5CkM3 zPmxFXaP98a=KAFH3=6Q15sCcr)bwn*SUI|MtlMaWabJ@vmHhiFs|CNXq>n11RaYV%aZxYU$YW(y`+~zw0Z1Zq6%=SG6d=RJ?WPo@fDKL{f@Gv{+#?_1Xr*J0}97 zT^fV*Sy?rJDXMO;r{%I)GNmYOJ~W3Hz~zU?EP>g$>BRE6`n3)mL7K#yrY7Fr* zK0HSEgXDZn9p`RR`?CloL1=)$&KJl!u1aFduo#{#(J;v(&=#Qv$Gs4<5V-m>);meG zk(&`gBnGx&2O1OsB9Op%)mxmNIdNiXX<>eDcHA$LQmRs^m#eif41y>u`lSG&-|Zk` zZEWn7S6(=J?8vE;r{DkRvi7h!hHUdhqVWE8y`LUi-r5zx28B>G4a~Z{EGT z+76;fgMfenh3=4W;?9tPW1|uTcNirR`yJPV*18^xtZ(lGK{PfozV&do*Kdbio|u_> z`spXa*7kevy*0`UDAg9Er#$UBrSFO3spGjEeRgRnvTxaqc5Ir3OdO?C8tO5D63FCL z%;MR@S;bGFN9g!%hv5Z>Ul|~7Lkly2{fBAcr{HFj=MJPAhrM{fFLtrA%Dqk; zw)S_Qdh%Svyf8n{4E1Wo_td%C2@<7sxVN+4ZS_Scj2MZm62tk+WcwiJwIOEf?yf-ARfF3rxp{-rNH^UV2z?^O%l%{yy5?G6B-23164 z1U3;5z?hWhw3}u3-pO!c#HGxMHenMQpw({oTEW8dd}I6Z_SROtQZIXzTDgjTsj<83 zeHzr10nH%}JIly9&0WTJ4LOvCDYSvZq65S&fAAC3l;KYD{3qB0lQi=QB0}0;_G{+d z5igIpHIlVHtY1vWdHBfOvxj$>+lTza>0V@z9}fL>R=dp0hm1{fi!?As#|RuSA@g%a z<(AnftNBi$#bNK1J5F%R0joDaVeI3>d{fpIML^6T5=&9}yZv^n*^ncI3J^Gs;~?ml zD-F{<``52uyZq6`Kl$DdKl|!aN_nd*_wL=h8#6?`{>JX!*5m!n_1#`K{=(?#=lc|gPJf&eFn#c@`4c@mM{oM$k3Y>WW_ zW46xVhRs(d*M|chMQGhGZG)H;Ei>5P7E>{ZBjcEqXW9@QXDQ&SIVP^8&g05PrCAS9 z06-#e#7C0JS=W97SE9nytut?kY1f2-fpg_FFDgY0fFenBlmQ$~5J&7;0|ElDr+@)W z;Igk^W~^{*arWftgk6Oj@lXO3ZQDD?}8DuvWq% zEI=SS(ux3uV$kf6GXrRVon3wH?wxZ_K6zwm{^@6*tQCtB6H_02e05{Lp#fAV%F;Pg zPr#b}?fPYm!E6;lnd60q^ok-9&3oPEUUUE46U$>0ldQQ^t{`He8CM?VzIu zBLWHsJ5EtY0&Usyr$p5FkQf)S!(Irt`FMRnDF9fJMkz z8W5AjJCHI9f()WL3mA#vS-{2#+eJ%j+oFrb#Z+laQf27kxw8@-bN3wVIB2#a_Ks8GiYO30M8WGIxO?ECZc6AQCb^K(;2 zj~|_xnXT5!6O$845fO#`Kr@@V?yMt1(qSl|5ml!X1F0bF0V*LHADevk*)!9#^`(XR zpS=6to!fUG?RH}TWa!0QLKdYoi-*8b+>P5Tz`%?k!bpg0l_>&3Knk=GoRkOvL;$z$ zKl<+X|MOR0`NFf$KU1%j$ET+zC&oVf=*qp7wNQXH142=$Kx>=DN#)@L5*7i?mKlW@ zi}9ZVV=M1jBGEobtu|IJR^lM`+&N7s3S_>daFb;b53D(ODcj z(0YzOdb4(@!6otUz zD@0Frch))9%2P-b=>Eh+-Sgnu)oWKiy0rFir5gmNPMug>TDW=r=G7Z_cDCA`AnFIP z2IxX80JHOjqsz{x$D{uRjDgh8Bt4*(cF2O=V~c#4t`1Y_`sO<70+U##5% zP2%fVK!8}3wYz!?^HWoklS|99b8}Pkb8}0_mdm9w0+3Q+*zbn@C<>VcP5ESlPy`Sa z0RjW-Ck!{rBE^`-7GBy(k6`fCb`Mmpv4QFl0r{ z0vbTblvS3PL6I01U5h2FU`oS)Xn_4LfB50upw(^kTCaTer4y%))yJz7wW?C;#@&?& zKne6&vw%tjF+gHl)(w>LYc>h~Tux~bLewIJC@da87|G_|j%FI0m;zwm^TIIl2qtG{ zjw~;DqnPrM*D%sN{K_Mf%!eG;cyKER{2~d7%CeI(WR}e~pYJ#8YBT!D;cFO69Zq!) zZXwIKAM_Xw3|RmM9g|Y_?m*I#QL7w)LM8Kk2r=g$O}>A+6-sX4;H^(G*o_W< z4|gfx>|(cxwx3&PNUadZQ z@c8oOt2gdEYIK59vD_D8kD{0bV5WrU&YxdeJ~lo+8AqXCtJKHq{Z7zsw$~r+20^Gi z1ppo*L!$FC{F&j+1(Vfse7!|XEGGWTq<=6jA>8e5hUv->AY|d z#pLdBEevlvqAhd-siQDu38}RXSdEPxwgp%LGVw@cvs1Y243KOkI`>up5D{f-yn|09 zAcRCFfWia^xP#9kCWW1+6akZ`qFAE_0+^gAF3il%FHD^}b>j4?qYFz*W0PZoyt};@ z1p$#_kSGkqdWtfL7=aAI)K4YWT3ARChfzCj77E2SLa7wa%}h^?KRq`)b7W!uhd+Mn z=Jk7l762$JAkSkKLrIZMb!hMav`fE%2H_JCAhTHA7XULbKmc&*_PVB@R?A~goIg{k zR6hUu=LMnU``2&Z>1h!SK^{r;3IXN-e zYV5M+aMob5sHTk?^j%|i*;p(7bQc=^F(S@wZp!pNl>`9Q|=8}s9a)sQ?e!oAD|pbR{knZZy;l36l`@y#8?;iWX7oEoGYfw0j-2qLj? zxm4)~oo;8pUL9x6q%5vAg!@VXM^^00AJRn3)I=3D`z@qCE}P z)GHQk3kVn!EC`T?VsrUZ))^d9Q?j7Vt&rswL;;w}ST0*Ln7l{`l=y&VHpK2Xnh*ht zS!~XIWMhOyQpx@qwLFUr!g41Bti+IYb0Pwp{@(6~AfOEn6G*&VQP8=*Gb5mo1_sTj z5CF85P9SDrtvv<8x>i!-wbEpL?DU!A3-fbJi}PonIy+Xc1H@4f>^GaeP8SIQA&z3! z+W003vpE2UtR%igKsMG)$58|z%wf<4f=ao5;>6<2^u+SQ;-CHS&9~qAu-WYcQ@bDe z9wAb!SphOLnxu6JREiLQBIEfA41#9s5sLtUNDOfI=K4=dZx%e9m>8R=*S`AY*T?E( z)oS_Ut2g)hffs=w1jr)dk@4`c6#*D6;zuNKLLq{%AvTB%5CJ^e+}PdPId<%s!s-KH z#sXE!#X`}qSF4_N%?0p23!1Aue18piPlcb~L#Sg-EsEC$UOjIvE-{^mBy z!oaAlI_%0Y3OSlJf@#1U)*os&w^5myn_-C~9SOV(j+#z-%ViHkYms!QQcM^WDZg0Q zZ#4Gyw-%O<_yuU}ZN2-GAHDsPpDZ1lpO~EZ_~zwXckbR;+3NH|O{%S9=!F7M1emF+ zb4QPT<&D=~e(CwCiSd5e*I{t$)~*iXSo7x2>is)wkGFOk&AtF=5oI!fxsY}n)P!US zwN(m{Aq!@J07!%)pa_`_`-sZs{4&wMKp;lDkaB3w3CApfPSgX576JhfbcUD=ZnXe9 z6SBkIfC8=_jM!rH;6jc>#MGi<=e8u)h22Uf?l>65v{7oOX$@>k3PBi2jCcZwqT^Ud zfLVl~=%EIPLWmiP9+Z756}^SUnfaONbLY>VJbvu-`E%8JHR!jS&HZkBPip~07Oh0F z)<%JjV%18S^WeB8=YYmB6A?#oKaR-vcyF`UYme2ZC&z0qyl`Q9s(xf~_Q!9&yY}#L z9D~x#zycT>4%}H*jHZqV2*EQ6N)bSS6YnTOpS(!NF~ElxZz&JYojDiwIxoHW;>(|T zjzlY^Ke}?O*^RV-i1;4qn89X(MFeECO5kqTL=gxghC~>da(BPEviA777oRIvDq+8) zW3E)otaYheN+N;nE+m$jWM>k*kO35TZvc6_gPA&#VzyEDauzLOrjY?$iK!Ea4J982 z)!a1-MGf$zgVZKbbLY9&Pq;Ee%uR3T85#WeiLHaaY zKJ9zn{gnq>8=K8mdwqSIJhi{OfA7xP)=p!6W2f7XNRekfwE+dQ)!9viETNGLK#RrY zMxUcRlZy-hfDl71PTyjgOk*6dq|NGmTzWR=WrRqYZQ5Z5HreB2%{;ioP7X9kg_25> zfC^H*6KO@HMF5ig&q9dF>L(}FC2(ewpT?12AW9~Wsq3K02`4tp0R`gNiYx-62owQ` zD1dSai=HYK{IPm{X?ga{=@Z9}9XomI#Kh#JSA_Q7=3Zl0M==rVSSwNl3HX9Is7`A3J*Vt@q!%dg#4%#izhO~kLST|e+&~8VMHaB|xpja%i=!j#VN&uon zJWNpj2&>ZIK^$>P2QIU=S#bd!>Kdt|N#x!fdKm68Wn)L9tHDMcUX%Q77&)7P-t9jl zdyx^}QaA2H1~$rO{!Zj8!!3o-A9k_-&uQb4>%mFmEZaPdvCvU{r1Dn zR-ng9ejG`lxd<>`hBK#*e&MsvKl|AiC#qwcTRS`3``x&=y7G8;Zzl?)&CRXd-TmFI z{ry&7vqhW6ebbpeo#qGa$jw+S$ch*?Ink;c#?j10$1DI0pb(5?U{b5G(@8tdhsX z3xK%H&nOCvmc>pN9Xn{JV=K0ULKH+I&{_&UC_o~NV+IZ7GS#c4$?@^=@%ow5$4;L* zb?WrV$=RuXuiNi8J6nx74z<=Mip?X%EY=Y22yhD8=m5n!xTbt6IWpuRO08c%0?5m%D{npJJ7eDwwm5Lzz(Gi>KRw4=iV!V480kkPw1&RO(NI*>bGn1wV1P~}utfyi# zI)Q)%NGXamYm4FRf9Z1$kyyt~u{@>8`eWmM0mM||1vKnD3tA6+Vud6w)LDxd*B~c% z+8V-1I5gP&LZmgLK%8*rB1E7F;#fpLDe)Cf&D53_=VxapPnQ)8~9t0#UcU z-)uIKKu3{|wUK&2fXS9Ka|k1`cX37$={R6Ze+2=Pik?OqQs^l}&D;-qaTpeRt#YYe zt&W{Kb@a&6!iA?U+`GMc z6Q`H{=C{A|g)hE-<%$_V1+hGt@E0rh;mFFFp3Ig5f%DZ0-a+AZy6>^6% z`R8D)G6;PKJ)CFuY)`K7L(tbSl1Y%EZdXD54p3Y3~a z=%F3pz~_vD4s(BT;I)JLPr6OUp6Od$Z;*1I7Y zNLCa`=4$Z0*w82v6q5^+KrtJhi3*isuiw=gYPGR)sodUcuRnf#>*k#g-}$IWg?=x( zc6+tii8hDVU&ph+Qm)>~oi6>4%9ACM1^X~n%)vcZNt?iA6TaDdj9LGu( zdi~H0*XAV#VOw@f5{zmvHCp{ACQ)xj#}BT`qb(qghzJazwJ?hDqer7mK)1MP9CYjo zkeKLP)1l3@3?fLRlwyXMA?Cr;YnG5~x=pdtga{z8bsR;}fPhx}fF#BzluVikgSCyr zjx}+SB|QjYl8=(5Q`Q61cng7MG2|)MhU+KRpb!9|prBqUOpMnS7iNzhTRd_6*wJIh zmyazW0!zHRvx5@HTE|fcU=TZ@GU3Y3%PPnFTNH0+o$}!+m+6F0KsQhTV6BNzSYnR2 z$6*+DdYx*uUaO6rJ$-a}Zub27Qx8@j-oL+c_uk6->6?$51F^xmfTEYOfK; z&Wj;Va5TVV3C^B8GBZ&wDtP+2^I!Xguid=$-~aTZhqd~Tiq-m=Q)l0J{c}ZC>~%WV z?ybZutQi#wAZu0%k%SVCSjfa^o1(u#=%JcOdJjCS4N_*k>2 zJO*tG_aY?2L`ck|4hG0PAp}5#R=p#_3^6mHGE#w3q!coXCn&DGmyH21?n8hAHhmf* zAfW=(2yBRvppH`^I-6Vt5sbDS!K9c*RKSu@1z-Y`ub;@KV>5Zj*aiXsI)^W#byG(5 zBhK<}v{i--i`_wH8}tMWK0!f29B{RSND}v9d1310$>U2)v!~CTeDdihre|k^Zm-vC zcH6Be4ux5S<5<9Yz8ft$2(WRCasD_~DsmV&uklWRIww3@m^DGprVN83n|_X?s27B~ z-|KZ6rDC;Sn>c=AVQF#Z^qG?v9&fHaSiODc{@TO!cB>hqw7Z>tzzV@r$XYxA1<(gT zfW->E`k5zRx^SvogsrtZ({o2Y_xV@uKDzgN|Mt({dh<%HUO=YvPd)YW=RdRE+}>_A z*EV+%1Q}uxU)dz@wjeVD7^cD0YfI5FdLWHPc;oiXPV@C@eX7?F77*sh<l zO2T1F!u<}>q2Zo!LZMVDcz(CjSXo)CPfRHCAFZvguB=?ScH`2;n=232$0o;b zKX}XlF@OM+0Vb;6v7?J$|HhY|IDewCw}0c-{d;%U?%uuE?ef-kTLS<<3{XJ!3yMW+ zftW>k6tggZAV#c>EmNVf0j4V;i36VDOI=Jbn#d&Mf5Xg70uV(J0V-vj{(*>uMG1<{ z#OYckTd+}(2|$PlQ3D7IkrKgJbIi-sI9?aA%mBhlp>p2+-~lpd z79tylDvt3sabe)=c*k;8M9#nQ(!QJWg4?HVQ%Cxo&05oMb z-BxJ^L?Vbdih5DM-|KhVrE0xiuOB@!voKpfePaIn*%J@e*6yvWu04Ky<3=y;_qrkb zNHK^2Fn|XzS;7~eIs4p&(+kT}NV?J9^E`iMYWZ(``#Zf>^q>Cl$3OhhhtQsfTZ(5Dfn)U2C8{@{){#QB#$k&8TdI3ou*sBjn@>F8hblXqA*i;M<& zXLQh#ox?D?&SLdXcMUja4*fht3l3Dl9DZ~7wft`6d4rKJ*)30qKr($p%mgW|Leh>C1lbR-?egkG^&R-RWZm7*Zn+HK5E&rQ$GZf$K}zkcn5 z4=&%kzxm+Nj*jAu_D-?vMWOC$@c)n;x_cwNSwl?-#%@6^} zGx!q}gBA!vEnv&6N17##%>l7G6Ejx3c?2L9P+dS60RSk&i5sU&qcUMOs&Ga@5rs<3 ze9;{Dlxm`7TCEC32$g^q214a4VbHO}vFJ=BS!Tb*xY>9JicEqa>zL#oK@=n#kst!Z zASVAZBl*U!l*JTMC$c_>ghYfoiV;y*&_hHa08l1!3P8kHP$?IS1ezsmd`zPj^l7+b1e$`{az0sNeK#CMWxx2m-(^RrXOj~>0Zx?1t8A78%N z?zKZ;4G;m;0Tvb}p1*MJv(KJAdVHZ&Dg<#4SlZ3)T5bHysng&3YrnX%a{K1h^&kJ_ zt$L+euTC93cj~zd7apuVzPGv_0sylj)Ui>&86piXfvSLUDPypiApkVM{k4scu3diW zg=b5pVz(QLfL|(jDUgo3+$v_)?XZ+)gKVt(av3y^l&*0dyxN|hk zNNC!D?H~@^IBbY1@0acKfc5#5RPj(sG3wC)f}9~^*`ISXebk46&*+ME40P$vm1L10 zq-*acpMk=Gu}J#S4Oo)2p^%6dF5=7N30BIBS+g*C1y+SprLH{H+}Z8+`V-T$rCNDq zCO zLpI#3(Wn^z9d=d0OtDz!+-UslGwVmj3(3R;iAc;kVotbz$?+{>)D%jQBI_2(MgkC< z^bN=ZTYKH0NH!WOAYnwMY;`FjQUol5Y|1?%5@}|R1S3HJB+xO`N>Hx&zNhMALTcLSZy@X~ao@b}0ZLRrVkz zESgIrJ&GSqza(Dvw$0QU3PwP3CD}zpgg{Uch!Ws13ZngOMbz(i%9ZNWbbV@Oe0FZ~ z=<@QJGp9bjasBb*$L)5vR45!dviQXLGtWKs#QfYiDTt!J2$7Gzht0jmrE>N8r!V~C z&wur|w}0>9eYn20+i2}HI(7#Tw1|Ng;|GRpw#Osc5MqPZ7(knm8Wuuw`h)AdPDH6{o503?J!+ zuOU3++Bp0jN%)-v?~H8jz_4s~id$pg)p%F~Lj;p-jBS9j*tbo^a|1GQ1B)aSWbPP^?y}V^h=ZcIWPm z+hf!9g(LImtJVAWE`N08?f0+Tyt~^Dq2haE^-8!}TjKm-^;AqW5=35%^Wo~(<} z5SiFi0HsX*7h)5shNy+L2naBV4FfV*FB5z#77-GnxZFXet|EX~qiColiaAR7c}D=u zN)v(0)Mg!lSWE$SF-B&SFGmY#EhaXH&}!U;g+N#X04PL-Qt&(?@)RgivDRVCKA~5p za=BD2cpg!`R<2h{VR9Qu)a76GYJKH(QPUUeFWG2ICTu zux8_ClyeSG*o4F_+b)y4ZLoSa5Wv2hawYO#_spN_b03OcYgSzzwir{S6+Jcm6u;yeX!QQdR;Sz+U}zUK|ms8 z7uta+hRI;#jKo3!8sOTkdlxTXoLTykDi)>R1M}cV{_f%>R;o84n%7&yJf9yat;3E0LDGFffdsW%R;) zN>L-*l#C>|IZB@+N0=Nma2uY?G$(;Noojv}aNw_ilj;#MRX!nzFo}v;Yk_K^IySRd zDHa>Mt(BYi>ec$v(vdK1U%!0y(xn@hF5kLwXTPaox?a{AcAK4ks7nA(KY9F@fAK3{ z{Q0k*IdeiO*tFjd!7yr8y3QejJ8~6a>A3SD2idTAV$m)ajT31bV%0r`HU6?N|pMie`8f>FFOvjsti)?IZnRm>P_@EL4ns4pR*GKPGzqRM*HU%cy65*0E&v zIsKS$p`T`88PuHaoFvC=_>J5OI(8MaOh$IIMlc5X2EcWdI5xU|L;w{su&|DzIA*F= z>T@#-TG8t2T4$#{k$5*c0x_)nUt>qUyzZdtzFbX*kDFJ-(jn97h z%P)WVD_=VM?2{Y>D|hcS)*g4lcx!uuV^$_YltGggAf-?ncSAD5TO7>v1o=M7O`a-nKhEKZZ3}hw{cD^rjnGnaAH8f zP-{gPYGw_64LY-J314P_pjbfPLyu4)h?Xc425mSjkBo*-d!9mpSXhJj9s^<+Yhh3T z1rJIEuUIakmO{Z(3PI2(YlmbNSDFg^E8ahb;mNJ+LH<-dw8q{jpMH#899C#}W zg^9~h5`^e72O+q)0U-uv0EiWNNWv8emp3d0^L5+K%~3La|_(UA^&y^aT@ zkc|3@5W*;8jCZzH>-F06pMC1**T1&6-MW5z_2R{wlhc3x&C1woue{u9?{`~2*=%+I zAQBWU=-iWRdL{rwHU$@0AW69qX?XjCE3aI>Hof>cES7yF&#Y)dFRd*lId%hKLj&F! z1Dw74Arq^EsYqcFc6Kws5v^gwe$X}inMaLOXCFc$)dGC=_hN`XO9rVI!GXwJrV z0-!K}A{0|77F|>+n`CepGaFS03dEX~q9|q%h_pS829`Vk4PXe80w^gg`{WT7eNqS! zYKd8EPy|e1GH~h`R58{JM8E)1z`{TTIY$KzvZzkA6Z_Uom*U5 zm|vJ*TwWNP950oN#*t(9253tT%l!wdT8*H5ntVTI!Hc} z>^}peJ@on+HaFR-#Cz0blS#k`01$1cr;VKI_XG6(so9x@*@eB`=9SA=>hc?7ZK+h*(K?GkxQdl?98KWzFn4ln&2$LL+FiIUkKoMmS zy)Yt?0!0D>91HsrGsnU#pp@}$f;4L;xKJxGB^r%FNMc)b#OA<5LakXMh%@LuSzd$s z6#xJf5sCm1#WqoXtjk1*QX8vO>qV^v1i~olb%HRC&;&UbpjItRPfjc^&CkwGO-xNH z-)nWcjs2!C-u&F`!qSn&BMTD~b)`rHhe5xy+Y**oM_Ox^m}53hEVkwh3nE5Z>sTY1 z+5pU2i454FSoB9|+C>jfk;k zBt`)w8%d*EcG23&(!p z8$Y-HXzh=_|JLSq_lJM}qnX;&SHAYOZ+-o1G5GI(aIw|ym{2caA!R}?O$?-EGVo)v=&2!nKtxDfxNRVeSs(Y1QPSD9 zO`U8ruVZ#U%qPtKGU`g%V{7=%AwUNhI1qh%81s8@N24E15qO5b9b~Vwj}A97VigV= z!swq5Z}Pw&F()H`;%g%w_;lDma}CZv5dm=!#4;OZkf}X(=}$lkb!^<+naCfXoSK-J zT7U3xYh$-uDa|i0h5hi_)mtB5yn1hCYjty56Kw8uHGoIh3*%}LPfkyM ziDxhP1;4$&_4v`lJNNF~d9Zfl=AE7G#@=pg{qar^NjKC!0U5^^6d=;Lw=#kYtiU2Cm8e+|n$)%={2$++3BRlXC5kgxp-Y|SdSFK|~ z0@k7wus{G1Cy7yA(ntkh@&wcgW~VCEvKMu_lauv&wWe8*kJZbil2`DmwQ6;&7DjQa z)otvz0CYhSqVklQo}QYV7@J#|nVOuekBw=7ovm#Gs@Lk(`j}rTY8|!Pjc(9IL}tw# z6Ou49i%pJcz5*&l1_04);t5y)g_K!JN9zW(_bw37{c!}>K?r79!W@$|0)#R1+7LVC zG$R?m28Sh$@m&z?u*u}zrtY zxi)MXlm!1L+m%WM>4pq#Rc_Z(!ZS$Zvw}(5Rw8|5Fm(R)l#Gm=QSxm1d+zZ}x`ScW z$|3lDs5d-lO%owt$U2cY{~kK_1AoK8^KkIsKILz@D}&Pq-^?r71ah83MvBZyLymC< zG-?S&B*3IF2x3u%rRAlWsj0^gHrBUx78d6!djE(@`7*p{HPOVWyz4T=bth ze`0EK3{l3arMcM|Pbts$>h+puboq$2iSaOqf^NuKYaROqkCay`m5QaJuRO2d5lTM@ zd)@Zp@*)xGDC&jn{nnOd&01TYP)rUvlVZmx^i3)tKv(7^p=u8C+k|z_zyg-}b|3#9}h0BA|-`BgbW%IzZYo3J^qc`OeP6fAO!pVcu_a*sHkd=N`v| zbU3Hy48NXZ-ShE4S>)v!KM?I5cwzQKp48+xZrA#72Lse#)TU>zq4^JfvzQ=@(gxRU zn0(|JVjOy7XwV~heHq5^IkI+`kn<@8pugmm+j-la>ow;EFmgB0d2u_mXC34f5>Om# z&-X)#kcxBjOV!fkgFBC!t>&?l%bix|=G6x)D;qa%-@kJ6!Fr=pDf^vBg9koAyw{K;oTbM~sS?S%ig!nU(U)9RLw# zvgR8E0u<4)fM)VMLGE;$k00JURV=^$(hD2w8#;{MyL|u7{mt+G@gMr-@++^t9CyQi z{rkVWzOiE>4+)4ICMH+bMMMOJ0TqGqCq{%opw)`JK^m8_$PO-#z{uM$#NOuV!0;ov zW-z4ziH>GO`@_GCLW3?i1_ox4Q`hAOF)IEmi=_Wbm~m(sMszX)bN_7gF!ig?lDz}x zbWkIir#_uq(9e1$6b}ajMt<}{>yW6c!4AAXGU4U^^C(j;v?F+BI@x_-v^Xzlu z!@7ph>Dvf*P#{$SaB zgRg}_YYw#yQmR$dv8Bc1N9NC*K7Q=z(&F;s-0W;^yjCogSR-q#5Ol1gAoL3!>o5#^ z3_1+^`#Y^Tj#xO-F~=HA00E0IljpIHmGbOHp^_F@244i22|Wf8trbxmMa+x@z*cu} z5IYN}cu_KNk>%+V`6j`$DSM7?okuaGDd3LexGX!CVKWYZa@Tf_P0b%uJ6z06Bsaul zhJv7sUeNJv>VGk`h7P>pgyW=j7=pzWEEk5Nd8UTK698e01q9 zhyO#T)jI#og;!Q@|K}gS*=hwO#w28T5W|;%0FXkCMFB=&AqNqB0nK77f~B)bdHVcX zrozFX$~d>48FO>`)In%;SRSysI^4|+A|Ch(!(VgbNTFkZI1P&UpxQIx$T|Ct!p>0-(J0T^L`NUoz14n*b@SrSsFik^w{70dw=~) zZ@lVPD_iS(ckkR?U0J(y_41{UZme%^wc4$2H|Y0S5qQ30&4MHXN)a$Hvr$zWLS#zq z3WIUFK@i!1D-M3Z556aVVewDn1-toO$ZPna{lN%(*is=9lNnm7ItbQ}cKBfGm~g*0BD1=&*42@I-Ax=jcEr!Ll)BNRng)fvXV~mD z03po)H%j#T^a#xLgc|Km>97Md5(Ebgf(TgapFlt66dX8rCV`?Hfqmhq$mf8iZa}0; z@xO`Xv1?I@p-eLrY^vg2ot>t&NrcZaUYdbr)gu6!#+)2*J=tUOYy`7ze_ni-DyAy$L&0#-%lX3~Md^yx$`T-W+MT$xeX-Tt^0R;h!)p#;c zYbQ@$xpHM~b>;I`_ZR2?mSxG8tx665x`0%E7^PFjTe6Z z55M#6*IxVGKm5Io`w!pw(U0GG>sMdgy8iId*4_J$*Y7wFf9w1yX5{AZoNn z=SyK%?=(t{YOT!azGQZg*@GPfkTfUWX&O!%1UNh=UU}itD=$C)^*3I5`Q;ba4y~%m zU^v$z=0W=Gd02`&zPHzAJX=N%0*CU||(a?<=BsnG0N$e$hc}uq> z7J*?*T8>q{fC7g8OZX?OG(Hd(=VrM{DtC2v~Uf zDgxK35(PPwkC)4(*|^xY?}%U^KY~9w-mGO4LICN0uQ!^E1<0lr$4;Di?xm}1t84H7 z^4%L>-a2yP*xg(A-uvLg&#&G3=<_>bK@7&Qqu|&AUcPkh#Vc3-_y66$dhHvpPe%1S zKY8=bpa1IZw}1ZL`=4*^?KTst8x5LJ;#g77-5iKWS`!E}?P_jB1mRE>0uX4yx-qUR z00QkQAq3Exgap+905m2uqKP|(Qz+{V1*ocW$0;}1G)ilzl|zPR9|3{_k^+zb2^s=w zNCF&MgqN;f`sUYP{mys3@%#(VudXfb4R)Ta-yMziCc|Assg*M0&ju1|0&27nLJC2e zlrkHS&4uQI$aZW90L@hbcFq&D(xwk$mYzx>5Cxzh<3p^=@P~eQ46j+sGmmZrfC4i2 zvQZpl2r$s0OZ0ihE}|fn;RA88OGkD}!SqEvOfE+V?#sUMdz@lIY%E6v+LI|v0=Jw% zm@C}{APOX$j3x>|$?=1Y+j4&X@^feZ?4SJc<3~GhzWL6boyqMdgSjVzg?TB3B#?-@ z9uo=#($e&v8>D);Dn7nz#qRW=SHioZ4z1H!%o| zl{T4!^=T8O*_8|twSG)vrauk_pMO&!02}bi!SGraaog0s)IU7dFb(8zzW zD=N`x9x06iCu*XJ5X9;8moB~V!s`6OXCHt5czwOs6F0Aa`Tn~fe0c54&%b!Mtzkjq z_Joct&VBp0UjP1Y|JJv^`As=5fASAM{?QNL{_OLQZ{L0RXk&YOPa#0B5}*Zv0!2N5 zN(gh*j3xxqsD-&$7to?81CGs+{}SyL>(qb-kft+l*Ij@hr~y!c0*l`pf*PO!Fo(j| z3JCP#ya0km=~@9Ol0At8HR%cn1U4G9IfI_4ClHAGLXMTv0P_;AoICcdH(vSv@Bi-W zUw>t;KR4Oiet7%K$#}Ro902L2QJ~56O8`)yP|7U1L?UXGxoA=t1WH1fyWf>|6NPpV zP8)z@jtU;E}Of1znadhdsCZZ$Ln5M#BtP?1(r2vvb5RRJh7UMc{|-g>FQ4Ne*91vGO2 z!MP%FQWKULE}Mo9&n(g`cBU&1^UTT1qA8>HL@^MZ7O1_Ccc9SS>3D|0v;_l3DGl*c z3t5qf2Sm`#ing}m30wH!ygIryo#w59L^cY#qkT|QEci(^b@X5zFAJ+g1V0S`CB>d6$zxCbk{uUzs&42!1Kl%8J`}ZDx zdE?P=yay45PR8<6k#-3VZQ)}o+Kmn-jEgxn$ z9svZvN*@;I7uVJfoj!f4*XwO=ZV$IMkDpp=wEW_WFCT60HUL@+5}**FQT?720tF&e zLP&)GQo~r8n|XmW_4{%%Q37CX5ng-Y;vfFr@BG1k^}Vy_&klCCAKd+t)MPvw)LJ#Q zl88VRXhJj#k%Vd#k)5kB2m#T9EoVJ_d-%Ilf@D~{;l^i(z#Y6CH8TYiXv}@QkrQnLe^lkKrg%82Xvr{R;2)6Tg#3BSrO!vr4 zgK7XEB8h}jXibyxL=%nb`sR&m^Zmtdyz%02@F&f1{Ntbfa-g9hm`s!uNE)Q=NSe)I zhI3#Jtd@DP z-u1DD5r70(s$`GwwQsz#yteY6fB3^MZ{6S7-PwM!t29h%0)U9~cy(oAb#3Ly(L<+BoLpNyeEI5? zlc$gLd-K~*wjSKPb>Y$(*^~dnfB*me|NX}wf`aj+sRaU}L=f7X97g~eL709BA~uQy zVogM~k^rYpE&k#6zxzkO_q(sW^s*Fm|IV$+U~gw{he$W75g>?!0y~&&+?BHT(g0{g z(=Q|jI>$&gW6H9h@^%p zZk^aqw=*dIRx)$^u{9@dXp9iJd>AsIu0@H{TQc?2#&lssbjyn1X_*%iQTi3*-wCTY zh+(CLDgZ4((!TrSiyT1nLv7@vM#Xpi1ORpsNaQ?`VJqi6A)?7WqDSVDpW}70NCJ5r z1UD$);Q?PSMxjB>qHrQW5-2o6qclleSv+>^>}kT@xeJ#T=I8ExdHeJ0w?Fyf_LsLG zy#3yXx9@EXG&BGJurw!r`@3I1y1aJh-o5|wpMUmbdv`R_gjxgiDj_NW0!3PxOTz(r zh)M&ZB6pe(n!D%C(aivYuxT^^R00(cIVPG-N_~WtmARuw4jnsk=)|!jM-Cl2efs#( z!)r&69a&vlSz2D3UtBtU_EgnFJ)Q`0;h#H@t1I&lH%9n=NXj9^U)cbLQYP77>k(Aa@T_rAPRv1pcVA1N}=4{+q!+{i}M$* z{_bymee3bY_RjXl*Y0RPnT!V5NCiaNlun_oSryF1WaX-)j|t%GNCS~8?2MXjui#67 zOT{Mz1#^PghonRn!F5|>3)oF*LEw@!%$NbE$<2v{mZeOXD5uilQ7|gc5{Wn=^bs0W_KbpaNLw_t#eDj~zX9{P>YG z=T4nGaqQ^vBO}(S$`*ZVa z3ybqd4z1nY992Sql#^PS)q+ynhPDfhT$4+4@)5w&{K9jWu3Wru@!_32gTYok8fsme zb4d~Hu7%)F(acr^4S3}r+_L?=LrmxA4xO>%QDLfGG34T={8yu3V~9B z9#@E?y{$+0Z=E@N;Sc`syX#w<+q-{#>;4l0XtYM9k)$wZOA#SxcT3I^exrE>t@ zOQa!K4sO5LEHSHO%KK2uw7poJbKVj_my$WfKoBt!@z3a-2BE9ty=K`erF zd2`$v@`_{jHTMeaD>@0VmEjJ9N8`RTD+hps4=jFnWbmF}!uq^-A3jByc#X~@lma^U zVun$i5}89(002P4Q0t|`N7oLWId%T*a({k2R*OrkPadzo`|f8y{?S|4Z#;PO!!I^! zU72+|fSN!8Xh}D|y!H6;*4|*EL4wc%gtW`1p#Zz^CwOmId%N#nRBO3o;Z5?%*o>?jvhaGd}Vp1*Y5);H5rdb!+LL{9*}D4 zdQwkDqq&8J;b5S(T3uU_QYuCL{`}(n^6}%RP8>VgyYWD4(xgFvInqblK{K=TguGOe z9nl3@iRHPa`T2#WR>R$aKvGHxG`s(qNQKq*si0UXV_Fd_m`PJ?dhYh!#6hf#Oo7S< zJ^n!1LlzR)6xSt6Spqq+CrJEJi&NDo zNK@6Xu##Il8~sQ96DQC8i+}nDJKH<|^Z)X<_jd-0paPf^LMb572xh64wR6Us2s5P* zP*pNI49=N%?~tKI{}bO1MXt}tiF9!ldSU_Xu0bcCr9zy3a06%doftv$=SR81yyqut zHpr#6tK?djd*z!(7^ni)fRI(2;+Nh}MMcHc6oDND3!i%qR{NC3s8pYf(~R+#LX#9# zD=nqKxZqs_6&BMVxX!$99)U!{?5DyfgT2Ei&zyhx>x=zEM~)w=cL%!O{pf=aKm6dm zpZ)mFAHDVd#?D})RuzB{0zovS%yCz{yTk46T|m$cpcECzTGg_uNNYl^6_{CE(qJyP zHEZfg6B2;L#%z)SstA@P99msGdHl%96GzXSIeG5=!s)1%Zn%k>SjD1 zj`sF;o;;k?#h}blfL9c2iiV%fFKzZTZ`O9a|fAHxS>$`gb zP-!iMIn38h-WiB)#nql*jsUWfP2Du(x*3lUu~8FahQk^4Kz?0qh944u6UKJ@KCCvA zoQZ(z8OH72ruEFMl>I}T1I2>JW}SkK>18XM~@EukV1!W=(~*eIp+ll4cUs!kp~_2>WUpEVQucYpJ@>$^j0V1kM?Ry{l9 z58jNLC0fGJeMz#mNQT^ZzYdOp4Xu?XQK67qlkxJ&v(JC+cUF%aJ9_x=c(C`y=QlQX zcfR=iv;XpgzklbgcW>`C!l4)f0Meid1WJOs){R+Afe2a=kU4S%+*xeqI2uHf1bqRd z?KT+&AQbfhRu=L2;nlOJPh7fq`rO$w=gyrudFJHt6UUbitw|}Bs_W5cYioVDyHiib z&19?^JsFOK5OuB0RGSeCBC2}5dOXnx^L;rSjG9TkxVAVRje5P|=`+X9oI0_*ws?Dc zcMj|^7va2PBjM(_e?qW#d=n8229xnn0aT<338kB^wVpMx-{>_bx7B{?F-{W4VFU1l z=?;ga+8$-RmDZ@yd69|J3ozbMr!tN5A;#Pe1(VgU@f@`uW?x{P5lD zn~DHH0s`qYVY z=T4qId+O}jlc!D}Up=(epPLs*qtS40dvkAhdpsVFhl55zJsz3%(2c=Y+Dv9^&7*@0+5*o zkO);&SfLKH+y7$nB!qGz3&@(ALw^4m!#CHN0k@GTWb830fm8l2^7(2;Pa3i2=nxAR zh0+&!6#mf3OqQB4A;RGqZE^p{NO&Y|3AW3Cc|@`YAmnq71!Jn-mVzxO^m-yL7+gaH z+8!LB6pqIF#TQ;ZfBuS;^J={J^EcoA@lSsIlfVDvN7rvYTHhD}%%OlvfTl)~f(A*V z03-w<%$YW1R~#XLT?;7)G!Ozv01co3<^WcDaN_9N@uP=Moj7*pIneWlNyE8jXA{B+@ib}Y zsR^_KKrxxrTI;>Rc5iO!(Bb8kl_fBp4-lH1+qYwtep!v>p8-fad-b)O*GGG!wY9^0 zJKN?qG;2SM5cuWh=55K~a(Hh4$rco+))CVe?k6|B(}bjiv`QJKkJAH>Y%x+YCDoQ! zJ2B|2jfv+k9_G-_t$bivbkxr0TZ~%Z4gy;vK}6VyswW7VS|OnZJ+6oA8xH{S>T_rR z&Aoc_{#h zx;f~DFAXKInuGU5oXo~VdsLip?#>x7F8QeL%{07V9|F)yzVa6-Xr~-KN6~#QK7wa# zAe{{iO%<80iWIzr{mEC379*5Oc5UmkKOki;J=-2>S>pa@UL&B^3WU@I!{OH2>2uG& z_{Q?m;lbYCotvNk_$NR7%fI{&A76W@KxjY-fKqAzO&WzDG)p812+SeM1SC)>(gFYp z8dp962!J_&)%pI(6RXc%I(zo)sk3KJojQH;%;{6dPaKINYlz zW2I;^o)Cf3jl>?1ojs7GQAl%HB7)FbyB)x2PrP@VSqSXzVI;r`b*&qq(Qr^Nj@MRK z&Yd{5SbesX$UhUnlRMTiuWHt+1k#Y{i zp(F-ZyIP8@x8YLF&t?iO8VAfCX2j|Ne38>(KWmYgiRr!|?g4a~`~3xC#ao1hYzeFN zoRNE+&g=NQbKcB}rwG}dEk`Io)T%}RQAr`Osq1FkY|2L@#Fb0u{@Z`~XLY0g`mg?G zFxFaGl|Udwv)>&E{5BA%AfRe5B=)B}gfXHsm`(m~A~>G^CDY1GHLHG@e2r}>m)vOB z8(5z%W>oZ(`=oqzP)8eOt7a)`+R)%Ux6+YBK{?VEjb`XlbTy+xaN<5yKXSnDa!A*> zV)8GroH^QSBQN#bkQNZK_kMt6)l*v6nuzGi^Diwg9#W0g_4uP-y#EhB`q?k9JyZZa zG^eoXM%(MH%!*Mmw=dZ<7ftzEx=Rqj+5P2t@!W+o7fzkHbm`oM3#ZSVKY8rr$wP+@ z_viY$t_Op?M-MgzdpoM0G)+AjjfAY4xi9=MK;&;iNlAMb{_AM+4t|T6PS@Bhx-i}BhW$!)Nud7`ez?s z`^Fou3)xf6MCnFYREBQ$H^^;j{oC6vBHpRuY>*yjz`Pm4VxA7;*MO85IcJ=W&XJ}F4KyR<8bT2U1h7S*}joL;r8;|z(wkP9J(@d07K%^QaP$*p^N>Ca=NOKDeqE-q8k~Vh$ zXd-P-Omh__YYELrj;p#k^+K5bgBAjHt;Unl^2*V3=gyoue(d(+J*(R8bT9${(q-pul7LE)K>F(y&su-zzpHKJzpgX}6T)C2-alL8V7NY2ey3(KM> z_qMhMgCSMb-16!itZRTtGx177M8cg|AOVB`P#^`EOL~_D96hvp{?v){r%zwFboRp8 z)8{XqK6dQz^5GRJ#AH0)*?K%2?2bm`$#|kwT~Ew*TrDc8l>$N`gwje1v{$fzGFvju zl!ZML!pgrt?J~^WIJO|$$YmxugeFZ2sjlZHV_c-;$JS1tINJZ{%NoGdj;ysIkBkw4 zG*BglKq-Y7Pnzp@?q2`=%dfwFb$9nkBa~7#0SLQ`z*2+&?)DUhf5PW|+gR7)#h3}G zN-RE4)vnX*Pv<0FC#f8PwNTTpmmGY?qhB%GO!qDUeE|URg?}kbEGk|KIwMNMP>g9y zb1JRr5|GxU8!ao*G-_|KEk*y(+KHE*fBwp)iyIs7X`)I9lZDorNFaa|AOQM3zYoA} zflo0XMQlNDpF_1+1Xus~EYWFJ1_9h!w}cxWyBgMze_%0^1l@0vPZf!ci8B|z@y55Xp8M?6F9*#~o8^)wBZ21NTunp@2taB$w$Q(D_Qcia zE?l~F>GGxX7tWtKe){;*@&c)5G}znQULOv&cXxJ)bW_(_p;DSiBS0mEM$k4<>lgdVe9IP4~IEU=Z~IMCJ4`$EPbtu$8Eq?y!{;nAaqFP=SjXyt>)J7Wq9 zSImkc&n>$+PHBxG%(XK&A3XTv`n8u|damD}ua#12LIm15rMNlLr6p~$I2(+}y1wPq z94gM%pKzjDTK1PmEqyiIE`9OTP$?w_k>m-2)kCK!d_^tSyA&#Ub;&ddTDfQRDxFJU zwY7zqp+SM>gl|9;LJBFc(ONZnINI6U-Fp7{i{E(d>+gT`*?2JOEzXU{6Dh&oQKW%{ z9bBwZwm2m(^`j`IhHT6~TdAyMo`GgfOY=;dq1y!_k;z@A8%B|C>WA zFPu96-~Uhl{-aMn1F$=y%$BK|$Xtrs2ROXezjF4(>n}b3+N&>JdEvR!=gzJyuM+CX z-tLnp4~E-YqtT$L$MvMCCle{8!EZtctw6|1QR8IL&hxn&YZ1&)D}>%wSZUxVuIxAf z0yxlZ*+fjF0RT`S5^6=`;drtzURpkM@$8vXCy%c0+*Lr}&f4TtWe6moLL>p$=mr!B zf!jNi_dmb(o%`Q9ck;+!G>}*k)xyq02O$a#7mwZ+Teb8lLWFVScO>M(H{)nhNZpF$f(*iF8tVW8a`dB* zz+dIHApbE7iKQa%)}6+?4Y$UmCoa+IU^K_h_p~Q~D&is+y#s_9ZCPvL@JxkIGnvU) zwvn~Mv@%-(Q3!3VSfs2I|L@&;Uq)D;HM3|9jv5gYW&`#S52@96wS?YKDW2 zhqs1%yMxi*cwE<$5fPClAgE+zt}wCKSYV@+Q+9MGQ5&%&X6@ZUpr$r%mxjs38am$< zNZD@Vn&EtNDWFz*JRHm~9zJ*O?1eL@KfZQ%3?N8LAr*zitVo0imo8iy4t5`|KOg{6 zRT5y_G@sqLe*4ay7cO5EAk2ZJT5BO9JM9k|qqLpUCXNLNTVx>ZUGR)3B;#pQ!7Iy_ zw-3-Fk|C3J>u?XxR`MzjA zqwEYJx=r*zpgq^5lp3^dXm@X8I2v8Lc=5``OEsXSkTAJ3pJF)0M^(J1EkGenOV7`Qt_KC!DfIQ@}KAsB(S;%*TyB55E^l@wa*(PXTYURYc?bYyLA zLFl@kjFs#OXGk;xXl0hS0RbGF7r*$M^2ux%K6v2X~)r ztncpZPR3(%qZg8pLJ|ob%nT6_qIO7&tOG}~d#8-N+6}&lOn@OA2xHZUTi)>+8 z@X?d&Uw&Cn>V8!jVMOCc{Zw?REhE}mLt=-snq?VL{IfOFwg`qdIZD}gpyc1y5R5DW zV!T&B&XFk$#t+?jV{rwwL)c82GY`Y!5=Oj5LoQ&5PXItdfL2NnHjS$5$>T?Nj~rRM zdiheXf^ppli9LZD2!#NIN(zYx>`F-MP1*$|`qs%?cHWMQP0TcBeCW)r;6Yhygtm5G zU}}bOLRLud?tIVWETWjkVFxsHNql!+Gv3?T+H9IeV2@DG_2r|x_dmb+$^E-`G(Zo)=xbw^G6T#5eC^d2 zfBW0tJ$B^u`ooREa4;V1Oq#K3%#qI|92PWZDQL4@z%&jCJC)|Zm*0tQgwrohw766t zW^DB)%OBb8Dr@i03bKi|5zIlKN;OjSCr!P$x^VUK#j~eQtbcLe?sBpFfk6{#fFnl^ z|H(i9<5#X;egA`BUAul`G8uzHDXOiV=JQ)O)*r7gE-sHIdz#Q~ck_+y{&pHxW-?27 zfyGKJ1gm@W6IgXIi_jVNJAB$wF^r#s9y)UT5L0>(Rw17@visqv;C zqTt(kNih~MGXR7L0s#aFAP`arNko&n9_{XK*G;49Mh!<&tHrPHh5{`MOeFF&_88g6ZG?`&`H3-AS(d*S8zY7P_#6vjZ@xO@MLn|BtLR)sK|I?bUE7)auWt(Jgm449{5ryK$oH3wTh z&4kNiI6gzbj5I8K=P%JA>73~O2Ul=Q`T}b){=)b~6wQB7H(kC~f{27bAu1q&D2996 zlV*JB(&-E5&j7&Q?zqtaB&3kithyjj1i}`dOuD3aZCb$8P~;wA)_^Vlh5E)sX2Vux zr{LXti;!3qWgnrvwnyn&%2O=uNMda2vI-G0Vfw}60 zG?5m%-VR4zW&-P{ki_$ zU~4=Y)y>$+w7rd-+)5m~ncTn`%L9HqI5J&JxaVCZhim9sIj?*oUgW$07#BkT8mL!Q zO3`>Q(9PuVk;50ypIcq&0f1f8gror!kN`M-{ODX?t{ho><&{?tA3p}D`#p((6~Mjw z>!05Ed@^qORbQYx-Zsdy9li2uQffLrInXK$`_hGu2%TxY5o$x6`_)4Kz?g+TPkYd;atbm!6xipl%vOXc`SD1Yl1f z01=tRZIQW#P+G};Q}h|qN6K@_Xl@PER%rPpPRkGWAuyDB-m>__)T9+HN?ErHr0k(J z#i5?lJ$dx-;k~=} zM{awU2CB8LH6g&s6U$dFojrW?&}cjyjfPEAgT3#9Fwm^6qaiZ$00HC!Kv-?b{Z)$A zB3o~NnENUzu4;mO+$T56X-ng~C{$z1sF^uS;E74n0XXGM=VX+I)830Ijz5W zC(%uyg1j#$!JH> z1VGsXH7({c$jWcd4NJYzEkAIB`bjHw*b#5j$rn)yNe*^RGg}jfS`(qDn`SuJ!wN5) zJ@ed!vpoR~01EUSwBCGm^ysN-VGd+<_QKg$Uw&cj=vt$-0HHw+8~FUrt-JRh&Mz%j zQdVFtlr&|9xlLqrVJ4A@^cSnqW^t$1e6|paQL9w)R)c<=s0 zW(ERMDFwF)lmKj76EsTKO+$!vJs#Kfl}nc{U%DUxdR0#&YK?P!6bK3s?2TX+@x&q? zsl&8`)k2-v!&GcuMD%UhQb`B-8}BD5j+}?=D;2&VuT4u;DEpou>#~oZ#h!CC_Em^{ zXd-eaP_~ePDSxaq7=I9OF);RFEJPk(vP>L@&2~n!>JbTr(qdHW?ZNK$Xm2#wTRwjB zjqiN#+}W#YIM}$qaqH&o&%XHNqwDv+e6)3Z5ng%W)pM7w*5h4G4Z3+;H)_cyLkR*- zVzZ3)Q1^6s0(x?-AMyWKhhpgtkuk_ZSk9IS8HNR#2xhl2pccJak0+zSv13P`KY!t; z%O5=4u9Y@d(h~qI%rC4SKHQsMz#1-GJahHRmE)&QZamr+c3&7g+IVv7&b_aF{RJtc z(#p0Cx`74s16T2ew05yBhIW-oGwN2pmb^p43@1;qJu_<7KCAmoLRUwIAE=XCIGc{h z8=?TF2zYJGk_zFLuo4jnKtd^dwXSz}HqV?rdExw-w|?=_xK@f_zArTZ2r^T^Ra{s~ zZs<|WSmXEv?yjV{_3vU==3RI`7(Y*KYD}2T_RhB?@aGz|MB=Z*b6yp0A^n^Eh5f5n zdp_-k-vxs(THIwJc3MKbd%dw=)#!qU>w6UPr7S$lGCvogzjO#j5*)^7VPfvB*` z8{Az1p)Q!TFBmjD2&x&GS9DgchggNEv(Cy!ma{M>_k4|g_p5m1nNvN8VR&h4GOVSj#M zG*UwQLqWs-8JC?iDpAibvaz{DOp}pR^7k*E-nhlK4Xpo;%Ze<;47Ay1$j-HVwt=^| z4?%YfobYEz#Egon5B{T-Ukc}BCfP#}>Cgr!5CDY$tre+z_wHV~{L(kS_WD2k?Ctvx zwt6U}kmIH?%Ayq6As{w*5ymd|%QFj-5_8-gu;qF7;0-FaJBjXcqg>k3cSsw>I*?M6 ze+JLt8OV$Z?)Fpr3Yd^KTcUEOgra|4t`QUn3+(N%lQ!|pQczS{Ya*hi)?+#w&m1{*`uxQUM~)s^n4cF~A;8vf@6PSJ&CY0T?HD15N=RuA zNtAwNKv>9wz=wb!!~KqS<`db$TnNPS3ICazA)%XDaFN*JLWjhCIcD&U2(%PJ6A{8- zZGNk#FD}nDx~X+TfHlC)yZ7(i zd9=KINcgjSZJFHZSsxdVTKRAJ$j|}8Q|1u}4eb{V&jmd#mV`V8|M#o4{wCy**8Ppu zfi2_bX$c~Q^p6OTYiiI#>tx(<6o{aawAPvk5QlqP2>ONRpL_B7tNorNqP=lVqCz1m ziD<3~$eD8hZj~+CEJ(cj&2K)WypQ$Uyzy(w$az4@H?wo+>g*t8`4i`5*b$Tfi)R_S z-2fFIp`d~3X9`uY)x=;6?MDI)M4E^MkvaHY>xIRIwbfNY5`+K{TB9a098T6Z9zNc< zbM5nw@7%m00qPO__22x*|Kb1r|JqvLt$K?BDg-2Z9hkNFt{GTcpeeU7f0SVN@@CLH z5kw}+f$osM+sH$HL7m$OiOQS~s;OzlgWc`J$Bw*sg?+B3IX&*RY?f|H}BoQegC1X<^@V=4$2N&Y7@$5!DYX}P@*kzt(YY<2LK>)r~e@~lST^t+bW?`9kBq}`5684Xe$`MnrV;&IvXuRv%Gvng{xCR0wfdEJ-1Q67N$!KS! z>qeltB9RcVsr9{kk8a(*d;NI79^@aZ2i&rl`clm6OWjQbV^K*-` z*8>TwN0tvCT03>}`0DaP1t0|0ssVr}JHwmz9uCJ%RrORf-VliMz975QH><;MIJ8re zoBtw^-fy=1jnoqSs#^{T1G3;TTb@})5IMaxs^tQCmhd4ZK+_eT@Anb$!M$6H3-d2u zxper*QVpQA0u2%Xh=dTr0nC<)&uE1X7QSkco6)RI83-xD^XLsj@)V7sLFD91>xhzk zXgWYk6}F_z9JP1VZl4X%N>{1-=k~=Si-P=&T=w4JAw-FY2(-1ix%Fh-z;~?`Xadlx z9zR}xeC^s7w{JceHF{}ber0K?0l0s6=O^#Hxw)~qFt>~-1PXNPEs0rpzXmhWzT5}I z6>f0>NsZGC(j;Mk#kR9wonz_{nzq7Tuv#@js$t(kpw{K!}6i|Bo%FGJT8N7HuC5W3Xc>xqB z4OaAXY2^JB*+K@CWhBZOF?I?Od}OHK4LQd2rrmH1#zye z#^a4Iu77#s`mKePzVzail}eZu8pFwCZ!ki_)ukmVXyfst z^~aBz2>_T8Gyo6{z}2gqmU(1xFx;kW#q zHn8xt-5)Oo&WcecG~^wB@J{&i^Kfex4ZT*3>A$hDis&Gth7AOxa7&?IHAn(IA! zaO=?VL$AH~;_@6!nnnO9BBhnm+RXvPG?6c}gH3Sq81spl&> zHz#*?cP6SaM>PnERZrf&^Z4Q8_2GE$)XCE?zkK!Om#$tpcXmzy0Ni`D{owHe?qCZ*Fbezjy0rZ~o-nci-K3^0?wz0<3RrZf)*X)q=zdfdHfV>>Mr6!h(Iu zNh@#mFK>xnXBl+ps5NG6Y}^{)Bw@7bF)OB}kposQ*qxwxZjX((QyNFvNEdDLIFR6F6Z9# zj$Rj5^pcWy(xUfMw5^!Uey~|N;{Ftz(-^mAc`m4>(6Zg95{se~*!H`1t;2 z1JKxmLp1_y@9b?n*=-t-vS$uH^6NewERF<>IB5~7`w))(#-Ay__J9D{%H?0V z!36t50ppjLzl7v8hAxr7cJuqxD6L39{u7cB1-H~L*f;|}_U%;ipXg+isAU*~FXxUd z7^bvi6l+F{#?05W&LJR^gdi4_B_@}rK+&kWlGRdAs?FW?^+y{|HqR{`?^Q?uTC26S zh0)dyjn%6!U+FFMHXhwk_3r$9B}S7PV1489_STd6zR+W0PKE0bfYbi`xJhTo(8qPi z&6p|PQ?N5r3^J5a zFS<3=@n@o_qY>M3WN*u*QcI+L$!BMnNh}LRc@s^(Js6AQWU~@!p=pZ*+3b=9s*JKg z4`bCnir-Hlh-=SZvc@6)6HuV2WFHWyu6On}NAe+aX0nM6I+$&;$bN z;c)wnZ@%BjYY8yioyMuU6z?{4pIiMjdB&7HxdsZatCnnR&c0I3Gx;rgTX&8;(MpOZpr z(q;P|x-~Jm#0(s-Am>;~I2}V;Lx*UwPeqn88-V$17Kr^ndC!e+gppmgS;_9JZ!~AO zC}U2EkSKqiV<^n-&~`#VB}Sl)VQsnnLGF?O18N9-yM)FAyW^Zl+dY<~38mP0bpQDA zGynEq|Ev3VZvXVnkFn7T{8120CR4Hx;DafWilW_TApt4&Rl;V|8X3Ip$TJsLPG0<6 zv}vlx0v0M9 zO-5T=yXqXFKm_bny>ETz_1@m2+c!S@{PWw79zWjR9IP&_Zf;dFW1Wd8Adwa*2{aNA2~BEeXZ_6T z(W}p2eC5T9*S`F8`_5o6Rt*jH)=+`60*A(=g`Gs}8=FtopGeu4q8ir|Vfr}a4uqhH zOjaeoWsC=Ah>Ddhg?%E4h>YSp^m?Yitv|AiOYmjpypY#8x|XOV!#v82u7ta%q!VDRE)pQ3 z0tKiM#KL@kdvEyg;l|{u>d*B^X^=wn<|Yb0zjgETPrlgR+uIwA3AYib>h~1D&febk z-X5YR0MMF*KvuN7M zX0gK~7L9%ee>@f8Pt4oc8$gaxOcHNKEb7Y6izWgvS5FHeQJ_Yc496r!4<6k)dE(^1 z`HMdrsy}-0;2v8A6a;g2>*PI^b9zjmn4nM1Gd_#TU)N#&<7{oshTMNs;zh(KqMb;a z|C`HATlQ@dhSn2y7*34;Yt0_hIQ#M?URsei4*;Z@5u2JM^7F*cKq1slgG_UhRJx; z=o%3P2}EJmV>_;!LhV=(8h>C(?lM{BZ?Wc^9QoRfh%q5aSP;k}nGU@*Hd<={=t)Tg zlX|?n^H@rJ{_@2)UViz=;T28LC?$k&tNdMdX0#s&0EXlG{=$cXW1$sm%7c@#x#2g1}DL(MM5V#z8ct;UrYkV<=PT(TKXuPS)#_Zojo16Deb9I zJ%ovSYx&|QYI%l`f&1I#0x^37=}RLZuIk5T-nj6hyb7( z-Dr&xM#J6l&gRjhhra#B*WbT({U3hz_GF^4M_7qQHwc0N%xIUPLja6wy8Gzf){~7R zM^|9$ky#K+20OL2*|kCc?HJTJOfaZR&}m2aJ9t z0vZ{lRyt=01+|>fXAqa8sIrJo>e!8+E(tnaMnWPo!+<1u5(reIc6auO^!+;zdSbrN z1L&YG=Ma19U`Bd9)r|RjYTEoe#S)Rd?u4`5*-eQD)1z{~*Ru65m^h+r@pK6v;@ zuJr!+PygV*{kMPqhkyKsr%s;O+kUjOw3a z+G*0{t}#ICJZ&ZufV+<#KDhUAVPVBA6VjeqWOa+oUeK*Dt{wL>DXde^5h9e|93W(z zkF)pdu12fID8k9D^5tJ9-@%T?AgiQ2j$mpO& zC7E-h>-y@6{BXv_4yCOQ(f&pjy9SEYG#Axu!TtF2E_4VR*q+B>YQY4n;s9 zQHiQ2<@&}(J)Q_DWv^OXSXfy-bmrm<-~8t9Klj4R8vD2I-n)D2?#82y?ZKcDP)R8f zRnriH)`|cnR%mX=60Xlo!m0-NgE`4rmgua$gjH_jA*y)dS1JB)I`=3vwa=WiMk$0q z)ikf4Iw_9k?gwVI1xH=p3VBZoVzz@5;}F{EqNMFOBX@S)40I~|q z9t?~2V}xuqp$$30K%FS1I`fyl3CXXl@Rkiv9bPecW)1XsDa6-kti>ofBw*+Q&h`F zH|tM!KL6sO77_re`8hy6(POP9LP$kW$+@cPRk9~!4}}1d1cL1Fsek}!!)P4yNeQ5G zgtq(N7L17OZ-Gf(SIL@Hdy{>mlmMtIS*y{;#=YTi`|9)OzyDj`dG69#01#*gT2xG`~sTWk+lxExj-@l87*QTj43y(QRJsWUr8Qq-KAFdW!Lf} zU*=@%meG~KBNHb?ZmEZriBxml6iXX2WzvvI2*%%Cy2AVfatncAx&d}WvM_xe;^kQK ztaODrAa^_kfH{I302)p4K7gnOc{3MS8PN`*Uovg!XHr(0XS6EinaI~HS+pr^Yj|4V z6Ra%5RYjv;NabWO#J20+XDpkE3Ao`?^a4}_#0Lrd3NZi9mt+*r5+Z~qt#wloE>_iK zG8*jcX{8BaX<>2h%o!Rt0+hf>(@eg+`Ni$~k1OoWBW@4IhnFi^f$Ue3u&Vm=i%XS& zz44H=?DeFoCzD1=6n@QQShi+Y;s*-R@S%isxpT!r^RwoR-k^u#F}5}z{U@`kpUmZB zN@=BPr0vI#?wmY-^|!zA^-n*$dH??7&D~vUl#o3H)IN2j?%}T~GRE{JFOp0kllA(T(E;HHS+azuj{yAauQ&7-YoqO>*xb-t;Pi&Z zuyz0?A`ytz&Pb69P<)%1tQklAb8TraeX3EMURHa`4nm*S!p|0**9=q^5gU(B%x*fB zOa*BwuOdW~nx_38Us0qKoI-gz6UFoA5)%?22tXnQs8<#i1fo)k01*TbstEx|lw#w_ z*5Ci=XCJ-y={#0v53j8)%=H0;QkrmXX;JiKHDC4S=X?G6_dmJz*MI-_*Y4ccG~b(F zP_|-rQAfaS(a<*QJCzt%ghk8-*XoJC&@oQFug6+Q^J4{n3-nn|Hq)*I%EXUmA=CLP!my&HPGE zJ^J1ObJPqsGSa^qqwn*Mk#y1#ajrT&dMl0)bKdQINTivPY$*9RSblD2f?{Oifu(0B z=TX^t$C`5au&;>mz*o)>tZ)Mnq?W*KNQ?G8=pfbR237zt`{V(IAu==G)0Ck7`#y|k z8p0Yxi0zm6Nx`wsM9@=+Y@XkAyYOuK3qc@=VI9hZD>1u4(Dz+y&ryFs|H10w+dUvl zV5Tk%`*_HWVE5zN?ldAGh=zc$nqOS#^?E3!kU~nK8X}^dovok#_$RloefkG~^xOa4 z|KSgBKi*B4M#h7v&<0ED~!g#ci8q(8lRNLPQ{ZxLBO{`B6zoeMWm2Cq6Ptc zSJny>yMxJR%|*^y537~J=iW;54Ashi?E~?GBR5VG#F9&&>)x9HvXNXBU*mJUcWJU=Vt+4FDboF=ikN zvv!{V6bM3j^z^x7N00Zao)EH88jy57y7vBiA7A_Mh37B*{x@I!?5&SJ`QWpy%{>Ab z4o9PU>-w!PA3xsM+}Kd#y^lZm)fYGJ%n2a?CN=z*pZ)y5{OnD{o|F{|VaN?u!jj__ zbp*Q7P!Q4f$R#mA@bEL&Jj)7uZ!93ns;8BnOzNGj$HU>^rROhya59#lI{LZ(&{>JGOYopObS}8@xSG3DRjT6HFNRlaR zY?1mBOMRm$D%p&>px4c7dRMt}=}nM{B`}?0eZ7wDt7j*waT!bL)b{I6qy-f<;IxG1YKIJ%}Vj zLpmZ-<$1tzE0k3(xY*_go;{4MKQKre3d{v@ddQ7y&XB3e^QaxxdTMAXbru&xamg5s zaw0prWJ;h!*)l1Z8uHaWZN=F5=4cvg^P^E%x9Ubp2|#0|7S`4-U%j-n)SpZmK$x2s zQa1N)-oE|CXV0BGb>q{|e)11L`r`WC?ExqO5@1rp!@Gl>N7p|4<+a1ht6N)pni$Fvg$sC5Xvqc|X`|Ree zTgQ(s^(Q-{(GW;QXTI_EG3d`5i+65A$;2gS$MPW{$ft4xF0Z&$g4T5<1>BTNaHJ4Z zjApA%PXO4Ap%8!CC?Z4TG0O8Y(VBHfhT)M30Re&FA1Qs} z5#@L?zI65Sg$rjUwQh!E(#>dZ^Sw8J_?Q3B|If7#KfHJM_Fwuo@91>Td zYydv{^3G@1KJPCq&(ALcY7}Jmf+0sy{&Fk6ngt*%Y_Xye-f$MVy=;C?mCYykq3nGI zCzQ@T#p9YCGMzpI9pMXgSV}DY*G<&_v>9bWerzdsQ)4RKmfA#Yp|Mma; zKYsSf$0V8`{r%s6_`zql9_~$qB*Ln~`MLhu>dLW0hYuY-tU+$<4JU}hh5$eT0YD`y zS@mjw>tEj7+}c@KTn0h`BJ{1jy1B)BrjP8bc3LxE-wyVr-AoEcf4YCtM&;9w)<6?# zLbDuPE85%HL@BObxOnN@xt;_KFxQ`xLZT*fK%Cnc1h?)!diS%B?%#X3v~;vz%^?Z2 zD}F5K=L63%@D0L5U_GFZYHM$=&;fTof$I%Ac*!jIegb)r8k>HcF{>C8Mef%A#|*tG zBKfbNXHni$omv{l=Sf9|beWhL$S9@Cyk;CL@E8EyX(^7u=HD_c%=gUJtot;P1xyqd z%QNO|ZZ}BJAY>S=gRcE$nDoqAGE7W7v9}(KWhtW-$XqGHzq814N0`1Erd8G{qT2!_ z=K}yhDeComtE-0v;=+OeJ^1{y_kZ+*zxnvx4>vb=-udynKlq!s?(d97q5>(kR&yvT z34O#q5=``XQjZ$7HLNv4jU#*_7lHM zzFcJ6X`975x^x{seSHZG2y(KBttq17${%MYu00eOT*@TTve|9fekm%%Kd9Z$gEQw8 z$mezGr%WVADEhT}#8%=N1!S~Vviye=Eqe^jTp&ii=ud#XzY+Nq=*1S zpp}^(mx}a*hj-`Z#Pe64JAdZX9Kgzae`RrQPKpXZN)(6!P@0D|U z(=#`MITM5#TjQMayj$M-hQe96U(PF5$Z}!(HDvpWkFHfiDvG~7MWE6@alT0z1Z*a( ztNa}NV8^fhhK%tT6NG8htlSn+b<2ZLNFb$d-n_ng^w^y*uD|t@AHVr`Z{NIjXI@t0 z;qdmYM`NP?e5J-(H%dzE_j{UPXSmzcdRQxsAQ7biO(X#jNE4yfTB#nuc&s*ex0O;t zNTsyD<q8E!FX6JC1fR_BGQszYiIoNwQKio-MjMg`SI=HWHK~ogLzyD zU?zh(nRdA@`B`ocO;S^wfKqfm%k#+XG0QoXytGG{MAkmcCbWlcQO~V^mKVmFMBb^n zN?W_{;R%~a&kN5&4hK3Em(q9%&%?wwh{6hQK3`rn}c>K?cZZy1{<~Xwr zIk@$AkM6vsJWK_cPZ`RzW7*j4H!wUHPs*f?>#&Jy#_0=hn4!fa{j+9K2$cP8j}{;k zx*8(@m<0(0ec7*6{qW|;@4o%RAN}C3-hJz>+n-&hx;b;|$l@F>_Tl*9C5eKx27rEr zRfW5g@pwGm8I1;$2?A77f(8L7-0+gtTA=7vQZ=wQ95js*C>%*l)Vp}g4jc11)J{!e{`2$Hi|@4_4=CBlP8akpE&yR)hjEj3xmOExxeuIrOStwmjFPihP0Ma z_WOOM;nQ2UKK%4kHK`6CIU#!sJ&8yP2qg*xAkxnH#S1_Kx@TU=4fosDazuAlEjAUg zp>h8ai_E8MkxOu{2@ny94$=B9N`T05b08~6J?UizMKGPrACvHRYfUv!{S2vBUDo+aY##5?YI`}cEP&i?&yZN(EKAi*J=F~?!c5LqT0IjvsYSIiO z(zy#~mRA=lfLC6=@-P4SpPV~$#`rV=W@#vpg!@mP{N#gQe){=mM~Vc-l06;`SGx;uzzqDu)4CEC8(0fuQSL7o4VIc58G%?y4ymVjOf3dh?9yf0nmy`gk zUkc8d&-1dxF=1R1Tg-~hGs>qh=E49(7lxx??nmletM3+fCK;`ktR19;%`?&KD8ej-ZBxxiDr(m(O^fylt^z}2eHg_3?|px zrEt^+j~A&f*RSX%!%V%cu}xn^(YfsmXbaO9@lPIzu_0nc(b~jrgbS&CX2{vr+#CbP zzndrmu*xf#Q|E{&JpLL&pcey27#9kRn-*q?S;%nzmNk!?NPZNx1(76K70bu;`KxOq zPo*n|zlNA`gnn!x5$2e_V0aJ+8Z{9hR+bhK^=M~+i`D$x+(6ZhP?M3W$67Za5UQ#| zQ4xS91VCA#ZWIb(ZbLF!Apk+5Ak>0{6i8|`o+zdIJ&A~#6cM4|?29Ut^;WXLB+}O+ zNii)caC%-;JLiB zKE>42gR;*Ui}`*-U}4~7(!TpK%OO{uL&w)BJe^&Q>>%ex+5o}J&0MvP?4DKN_Rc&; z>Y0OR$fS-xQ~H5GYXZ{4(fH)4(@Tr18VI3(cJ;)y!R@BeJ0msFFt;E@t(DdabW_tp zzc;raX*AiMXw@hb2m~5HntcFT0ST?m@wcEsH%g1S3K&w%1jsj##aC=(r$xR?Kq{6n z-V=(vOY+{a)qEr4MM;AYsEGuUK-k@VGC#li{XhEdk#o-HvT$zU*O^d~pI{Oce5;NvgO96NmM#TTAiJ9ND2tL4?B!||}0OeW*8(sff$ zNNKXGNpXI$hXjq*ptU9>tprGvhzKaDX_VPTN`Cs@n0*Qch{%mlyXxj}0b;+2z^39| zBlzk0$R9_M%2+K8B*1N+&U*Oup%3{B_H);f-L{#<;bbILw*%<-QTAM|0y3tkD7oyUt*5t3H zFN&$7(snCg3YUYuOS$0knx&DL95_w2WAFlrw5~M?P%dujKT?L~)FFZh7o%_Abbuz{oK{;% zX3C+3scmo5Y%=Sdc>G`&f!KhcAFjeO@HKTu-o~XmYm0f2+ zcAKE@Xc&K81^ZF-&RxW{D|Y<3%@efeNo|ED26GyPGX?_If=`|2J`$#-GU-9~|0(H- zJ%3eUYFDIVX;_5TLNo*bbT@M$2taeYEszkRZYEnhTd%zFwJ&ab`ja2Nwf*?X{L<3S zU^1z(FDfm>TqUI-s+F9tCX)#@P2DsNHAH|ym>cg%0BBMKNTdOJAP99cQM!*vi64M< zt|e1!#dK?8R`F0QuXzFSGJn@FP`Nl1e_>@4Br`kV&kWQ<+$M2h#S}O-+mLy{4^QI* zX0n}Mk%6_|`)RV~ZUDX_Lc7`9&3P<5g&d6z5&)90?m!?yh1;8tPMy8<$N%J?Z*7f! z@((}Tdr~(f8-T^$+-L%dV4>I33Q*HwP$$5osX=Xp|s! zc6Z_a-B(|SM&jP?U~79M0T2)+g0kin0R=)sGyxC*6M(@;Jsv&2zrHj7Y1OL`P#r$J zaOu*;%U3QwclpZclP51-x^V8$YE5!9sy}|~oj2e4`S$k4^3uYKSFU{R)tBbySDIQ8 zD1jmv6ymJS%&Mwp?o9)R&%V~7nalCh{Jw2z>JiJ_# zrMO(pxN-2bzfSYjon?2!5dQfPGIV=O9e;KMVtS3miR4p#5o*Z zD!DE5lr-)E-9Rx_)Y$tps%;KG&6zqxBBP-kv*>1%XkTsrU`D1#L>LKU287&MnM9-! zM588;A3r#D==4ANlRs^0eCN%dZ>~=?z|tWx8aCrb_vR(lYOJ9Wu)K)N3v*4a)_T>r zrr~fr0zd%eO09`xJtl(5c&wGG`aLk~-`wc3^+p!Vb}*~NN@JM=qP2g$)t;UEIUMyl z`o)$+Ktyx%{W<8#$>h=fFYn!0zjyc6XfiS75djH6HwHrhC_oSjbB#D@(lio!G#U}X zNUJ-W!_RJQEWGop<>iGVN7r6^@#Qz(`1*xYSGITe{?iYB^w!VcQL1SsgU_$tsD%8+ z*ItuyPw5E?BCRwM+S8g7+u#-eVCWvDa*MgykC@7yXXoKGglS_r=GetsGa9xj)*sp& zMZrI$*uW>@59Px0{z~Gp+OPCZUKbqz=ZDi#N0H-h?p}(v#-meo20DrBeHKDo|HQ0i z(?Gtn5a3wRSaz{;N;rTo$z6I|&VEZ~#I|^>vs09FZsuhc5Jm^_`wm%~M8#(H&zxJh zyvX$O?Jpz*fgr?ay!&YL?&-59|NJlh_4$jJ|KT5gy1xE!cU&WAB!F7=B=qOt(xp@9 z&YoI3bW|exuPqrJVo&F$TBT@OdY&CQ|KFamh==RJO5fk11d za?I|i>b5`OYcW!(;w{n<$#ACUzPl@hpav)7N!^2cH*fyxosZvn`<;;n1gH>|ZU{*d zXtzoSw1wvlkw8JHM~w!pQ6K_nfQf?9wqD=fyK#5#{rB$vyTAJ3*~2H~{QQF_k2cn~ zdwp3?)Zl~9m)G7taq8^J!^?x+kw8+U5JglS0)|MfYfP(0V37|YrV><;V6uL3*3gR5 zqeyn7pRX^s<(FOdbTAhYJtG+`8pgj{t$&_%4gqmW;kJGV6>F#Pm_$p-Dk=kI4>4)c z8cwHa6ea;9gBGQCbxzT(CCLN-a-F|Q;CtY}a6en>V;IbRrit8YOD!z)Yc1W_gEOR9 zVA}x#ItN{#0!vJvu|p8#90AzG8%Q*3G_|I^y(d`Vk)y}|=9W!SKn}_PqxW9RkH3y&p6sgA5$9oO0Bht(R5`wuKQyXVX%K1M8XaKhM>dn17 zhLky3H8ly8+XMC1FMs*!3(p_>{qOdA^G!VjKzkuE+4i(s))35G00VyBk~mAtOn;k4 zL_SN@VwiKTd5~Hd-Dg>q{C!6u{&UC6vL`6K%3OQM!5;%y3`Nx{L%?<)z#6331DICu z6dolsVf-d|JMK{0lRG;>eoiRzBr%4bxh`LoTkzIA3H&PiP`}8|r)I6C`b_1B-`8E{RPxRv0kkfi08uEV0pQS) zV~wiUx1UUEz1WwN8pcEd2;5l)cAdVp&K3}m-Nj1)6{03Uaz{lAfuwXLM6ERd2oM@* zLaLG#D0uvM^#1!FeEYRmjvQIm&4`3VtpUgnT@$b|wA8Sfibp2Oeq}}iJg>dNL#q(7 ztjIIVui~MIeNnM~yI{n4Vt)@3W;R5{h{h|qrzy#k?`0d>6%3D@13>nkfg1|nGOl#n z6zT*z?O8b_!2qE@Atz{Po_>1H;pbP|DL^Ji-6Csi=tn=i79h?hiToU=P+C@~$va5- zetHF^V?qkqcSNDI1zNtF(F$uk5QSZ)p|sX8rqScacQ>CrsH%A&LQ(Z9NdOZ?J9`a+ zs+)Q|99BJvLI6S2jOXU&7M7NT=vP%W9yjv~ORv0kj%{5@q~%K@FO_r9C~;;@aNHOz{Q+G(Jq0h8=n zN^esP;|VD7l`{j}sfNcv8w@>w&>0G9kdn!J8F?86d>8wGHo1@Ui9|jIV7%}`%3|Q2 z_A592JWQvJS=KZ%1;K3(gh{WN`%q3q+YJu~3mBTVoNwM<$wQW%L)L7+IsgcPpa~Qq zA_y1^2S^04jR2ak-;-d5!ik6!3NapzM1@jRLWs7L^Kx?ITx3&RL zYdsl{wQ5j6w8X|09s8_AXbLhk#iQolJmp0u0B!(>V^}LNX5t!!kP-nWlhIr?clGL} z=iYmFdwq9qd0}Uu27}4S9QiL$X%dFZ+9t0A2m}SFi4e3`5!1&O04Rhet%v~8td*_& z$v*_^n>%;zJ$U_<7b+=~23ZNEb&N##vlm5vTmof|(bX>+4C2Bu6;4u+cknWrV4oSn z0Zc>}-s9go4RazS9)Lv0i@1>Dg7{^tYP!#8HI4NEcy1KO_BHT5gWMP=&mm108F}kR z_2-txkN>brOeu^x3P$8puDF~r9K_(p%;*$c^N}5}f&jUowD`NHt^U;BjirOJy&H}s z9*daxYOPR6DF6@vv1uC9H;{m!H7Qb(fIw>!f~2Sf2(7VEs*-c0VLYg{t^tONi%Sba z>}+kKkaax)L{(2nE6bz^zsG_Y{c5Z9G~<-Wc9d6|)cfpQpba3<1PCNh2t=)^RyEY) zS6+PK|NMXaw-4^F_f{7sif(>+_vgR-=)uD$V?7}NcTzJEX@MwB2Q!|ib^9;?{HbCD zh#(NPolCZUZZK#bZLE(cBeN-3Yi%qoxeZ{3R#uyoUG86U)r#Y0HmD;ov=PgH=gF=t zI3!GYQ?!s>%wyKF;>WzuGBW72q-D=CYmdQg1eJ7qbOre+ zkabBh*ewNOZTyco?89l$6el0Jl8OP-6gVJ598{bZ37GUw4*`C2#32yvVTFnS5w(`G zA|fF`D~$xGNokTokk-O1M*#qBcFaO!js{YCxHlRPCrARNoQx+`PXK8^5CED$2QwJ# zVaXyOw84jN>B^NNYL~Qy5EA}I0*q)+aMq+i2vQo<K2|6R!q|5Q-vj)g zt&MXX{>SVyD9BUZ74mol_hnN0qB9Ne#vnVR6A+LD0fCUx^?tyw9~3Aw znU$jwfi!`XmDU;v1XchfWe*6OS^+4bl@LHmp+HjX6#PUXousjvG5}O!N*6OA227ob znx9l=I|>%?pjmLEiImbpQmXKy*ayriHhFN? zaw>I{{=l-d&Ro+jAnP@M_7KvOy%7Zg?7jf==R5grb*oZ zAT%}VdOR7|&3Je4cy4}WdHLwYi)$Cp|L!;6c;)(+Uw(P#_WPfF^!Ul6&7G~uaPnkx zds4%shFY0PV2}XDA)3yUK-8q|6fy`0zepk?(P-R^C$*3jB5E!<>_7gU$5MLrYtj&ZX2rvQ>#L#acNw2U86;4yQX*HUPQrHW|?0v9{TayBz+FH7du zR#v`rUL`7XHq^hEJG&H)wRZvKbkJAIn!v7fj}}kPVEutX@QIw&@oSq zvLXV3Kmh^-0io~))D{|+gy)urRi#t>J9v`(jUU4hI69Iuv={1cSVI7S(i~&02_-6} zWkXujG-<|l(+nqr?X6yaacOaNb#?J~fA_U-OkVljhu_*7>^<4p+1%V(f4niC(7n44 zKfiwSi|g0-#$)X)WutXfp#T955MfnSfYx&=<9-3^$ygJ~N?OS1p-9#}EFS{I*5}&| z1iZp+Mxc|yK8kC>aKxZfml*=*b*WV1517qgkngW`Q#zG^&IkpRuutYPm(rDH1Ba8tV^ng=YmR?NO)IEqSKw zWzqDt7Ji%4&KH_n7?pNXwoWHT$L6!lyJB>xFj0*})Jkcb5a~uK zfrua)&_skN(OgnSn!+Xk=ZsshGxP1vEkj~yA+$+ubZ5pm{LM67$*t84T1YOTx0us` zQ)jj_YV=G70<$;nJvW>H0RAWlK(0-`EN}SpGe=|Gm$CZ5J|O26dGQba%X%C$-iv9rAeDZLkR$MqYyx=da$zt2&75rF~P(B!eYNSx3+rZyWe^F zh37B6^1|~!`1>Ef_wKtlAFQJr`0rIxAk=k(AR5&eGODUVFo&%gKtWtNgcU(gly|ag`33AxW)hExO zRdaK9O3u{Vl$Q6#pqg$B+4t@o8ALNf3y7q3U-keIwAM|70J7g3?Q8)GRgXr9dpp}J zhmNc)u6*x%-@JI{?AtHD@WVHM{K0#lKG_>r08OJ*GZYmH0Mw{~5MZu12Y{N~MvBm{ zOj_L;eWG~4JYdpxw#R7n*#(AGb9T3?7GF;nDw9lJOxMejt;*5q(^|B=#9~GS0F~1? zJC;HWqabTQ-dKE}b>J8#S!4PugL6~J<{88r;*eoeNCc{-o>RiJKo-A_z|HFv9#Z-X zJpkoXsk7{mh|bhvaf6(MLK1h9v`uc^d>l;n`EdkevnWWT)nhlh7o94^`~~iY5v)xm$X=>jR;rIi~1_WWho1-lVt;ZwX5NJXWL<*GFb%PSe zg9!ok=O%mDjCMAbSC3w~eDuueKYZ!Rg`d9o^S}Se&mKH_{OHL@14ufC7mlsKE1Vj)3f=VNO++L(!Av|-Cl8ALXtJ<4wKLNAnsjw8m4;>!RJ+)$|=>0*m zPBZ0TJn_ALPgTWUN0oF5Jl>AfGxA!AGMOK_xyP1Po}t1~<3vip5oD|H4yCk(sgm@Y z@(@K6W!tBdWjR;Fn+zjQsa;{1hZ+5lFG43#{&W+H8zqGfz^REHy)QfxH3E0SrKiUY z5`i5Y2|mx&)jNtZsm`^uKneo_O_w;-h4V4uY{cO3!&wp5AP}XGP?SrQX_4VOc~LQh z*)A0T00?2m?@TE7RIG{CS)AIcF&6E+QYN*89bk$`+huQnj7e72rk}j zMVqhLP`?+Z+)i~Bn4VHej3X^(zkA2z!hM$gaFJ9@^xQ}W@F0C%AfTUG`P;&c?K zqgXHr;z2fwlM+B!1{zuopg4~om&AlTYR6X0)YaU%0u=QJ#_ovb`^Fa8q?uneokRPsU?z3Wz%l}ZjqT^^hHsQHir9= zs8(8Mzd{^lZX&~e^f=L<5)JVwLg8zamKVeq*s-0)%)dr%rDXjb;a(8@W`5)M2*6*- zr~#1Bh>+GK5J?~qm^1uQNYbhj6@eBg0I?a4rIZs=TlIJYpjR!Nzj)}v<&(cP{>Fp# z^*cB3ZEUU|T3ft&<&uV)ni>J^#$m|D_`PXOE6}O1)59|XR;gzyQxk3tb8Sli?yOz} z;i-vjeOtEPV^Ba;oRGw}Bh!~Mjhv4*O@1w6uJoLsFa*SE(z>kK6j*3c=%BLe^{g>7 zuMny}HRop{Fu%5t0w@3gHsDiafeXZs=r0A%#(l9RV{(RWvQl`$+zBNq!^_BqxcoQ@ zN~R6VzRoRj$hNou=4^^GjB%dR2)hP?#Ws3oHOFn@YW0`?omG5)m})y-g50z62#K4s z6cPUch@c6Do3KO(UV{J#NNY4lVH21$-L%$-SPyH}Q$(ayO*E<}w6d~#;q>ykQ!n&H zZ#bGvn&Iy5X000y8bI2`@UuXKLcW&V#FV5V&xFUF#7i;o34ACyrUvOiEw! zk4!yGr#QJ2D^VXth8-tC>TwqUeUi9l|{01hykUadHg76zuGy-cUj6~AQNDHifA|(B=$3}M&b-O z**q`-(=5!o5@KtjM<@d96v{-tX7iI;rRShD+?LPo2P4btt$Cpf73*{>VJ&Zy{uKbQ(IVF)V4gB` zMa)F5T?pcbI#2)t5ejUY21t`4jkQ)lpzRJ!=WEQGjA$CTPzO`;3`fe&9uBM^rM&hT zITpgU)Skj{{A?j^cFvRoMx|Y!{4|76L~&b127(DgvsFpVgtV^&IzNM^PgvEiiY2qq z5)ZSE!>>KG*{K6G!#*}>o9{fEc+bx~;lfW$fG-D7)Jy6IQHA}%!`h=oF@VU+a5in*Dhnc^|(1wu@ z7IJf3%5z5iJwp!@f-J|cf)G;+72Qz1wKQw|irtk`mAn7f9446o7S@F zb{SFpg{=q*(6O^PivRTogaSgz(_I0DvNcOyK1Qdw=;xGgdQ5DIW zA@?-{U+K$dA>|po{R%=GE}P|Lxq`M)LL35$$Lsb(Ou-r#SnE)WYXQ>(5T2ZbhaE;? zpFM=x+xVF^BXS5bYp%IJPYlT{b}|Y3$KgqVPZJW1($WrXg~UmbXVA_O21>b2@+sZO zrBMJocNjUAS?g@CGI1r?_3yyOqcNtKi~(wM4v7hE31~{D=`oABx$={WW;s#LTF0%z zr`)?>IGWMd%ew;q$)^i`f*cFMzpIXjAS>o7IOV)NoSjCrzE)Fy3t-&=2 za>DFVObiD^mF#3OpYXr~x6qWzKz{OJYsh@2^&PRQV)T(G$x&IUPOUl`@(z15xH;$L z22-y6w5~Pru2>>}FStee-jQ?f)J9bH=9xnGshYAsAh_>j)APgZJ+cq+{Bb6gm?>XJ zNl^%@P^y_o-=y{JGOte^I=WE>jm(lz2Ro(_SxiWAgv=gJPxW+xYflbiXABAKofeV( z&4r}Z+9aGRQ@~E}hK_}Hk>Jl>+jxyX@s%hYC6&NC#meREyvyuB?lcLp&*V;(w-WkS z>5n|8a??7OoZ4ZhDt5atgfY1SGl)xqTQ}(Dd%a`uy!0KS+0n|>mYOZ~zKTsOhxdL3 zxRfBA{e+I_t(B%33Ob;Xq5LVfYVnO=5pk`n^PJ=M0Cg79i{8GYR{O$N&nn~@CQ{>H zQp(8IFqJ=XHv3`{wD5H*Q7&UF(TB;urLR0;CR)zuxDVmL5jbnR32OvDRnW(njj{W%?cRcPTmhC+)nH3Cs_<@kfn$&f`}`@ zTpl^XFk){KGYYxeBI1M1d?Q*bWA_sZwt9v`ZHxBT_Kdm}e<~5BQfAC%rh;a+A&d&H zr~HXnOJLFih#g}`?ui(8hXhJ@#K)ZMX&HXip$%Zn-W6yeHGe$|Dk@eT`dE!UQ{NNOV zo8}0wDXN(HO4w4Dh@6(se$c-~0i#R5%@7{)y7-Pw=^U_ zV@j~+-Rg>2%2@+1Dh|ZdkpQ3~c7#}O)&fJPkks3)ww)nlk@iC;wN=g@WJJEdE#g#N+Lc&q^tj`|A*$n7gbJQX z_-Y(=Tl5a|0I^7Q7FZ-}pJuuX+!UW%@|l)r;zokiqb&JB1f?qpbyqYqR340XCd(?q zl4nLBv?M06v*hhxQVzO$`RQ2}t;2y5dtm>e&koWzQ^J0vBmX&Lz#?QV+0dk~{1hI@ z^J0IAW@1`P(wPIse=&dSGBjrag}e;_W1`dwcr1@|7|$?@ zq%iP^++CNLX2r$8<_rk}&DiX=8+pi{9>~Q?D2>yk5#qWr>sJs>0?6*{u+`17?);gA zT$aiW7x%e5+-=KqO5onxzVU7r1M^x)FUbF|&v3<#Kkk_!0z?D2d@3V#+d=~LnX1MbvH^=}9km92t zAm-9kDvSec?I3jZ95R}ILt+0`vLJNNvQ+aa`AQD$mCpL`o;ZdfG5p&%eQhDMYY{zD z9MMQxXTB6Ai2gzwoA!ko_Yq1e-Wqe(?A#B2j40-3u9wO-FPQO)4ghsFo>`yJG$D)B z^8^c?s%`==JZdlOUf5rV90LV+LzGHLR~ButB1tLvG2Yj-iel=Y`MAywg(W{FD~XVO zwB(hQwF=Ct|NJTK(9gS6jQrV`Ms(naAsZ4}md`&AP{ewXCGZv^6 zk3EyD{7-E81TYKEHg84z2HoaQV9-8=1hY~a`_`!h{RV?2$Zdl+&n$FQe4kQT)a@j* zTuVZm?UyJ8uAS0gGqCzc?pN86-=&A{x2LpSG<$4(4f zn_o=pf`y-ijDwMFqr4|p2-c8wtax!fq)tPTu4w2kF^ie^0Jww9Ed%nXMgAe$qab4I zflkii_5RSw{xs_{(JiljQ^5;!uDGR$&mts-dd4Kdm9|;->6+o5+u~;?utW$iuMHRE z(#WlU4(z(A|1|~j79zT^%YAgAqU3`C~RL<$xUt-MabgZFdFxx^XCyvD0 zqNO_*ikng%!|1%1Q;5#dyfwdOG#aOA;na}x6CJDFIZzn3VW%8zDVl)mUwg@AsyU?F zN2R*qM(KSKktImJM1i>v0HX$rdarr1R4*vCp)OT4cakUn&4<>W^ghD=t8;+z+L0O* z-GA}jRBM&SDVH@%$X!BP+5KeLXpXS@{(Pl<8G*Q$1sMPv&Jd`r@R1O zQXan;G3kV~M+67_N(LURok&JXy1fXeKNz+o2V~RPPZ`Q)7-J%x7Z5GNn*Zvgt*!4B zlaM~mkY7j3w`bz38+K$z*8uUmQqxsHap*W?8aM?dpieG}A;mA1dPeQsN!h+Lo9W2t zV&K*Jby>4ng{eqeM?I%d{!CdO1cbG5J7#9n#YWn-4}3k7<)kv*sm7T;hJA z!tHVs+#s>^)2NA4W8p11`)i}wdk5Ug*eXg!QP-mdR~E#m&~!{@DFr&uLdTz} zDT+>KjJrbxJt~mW+6A1c^jUy+$sSCDO+~xWRgANKWfE)@4iDqv%S@V9y|xbKuQm8a zXUY?*!xa{bdJseYqHc0A3GZ74tLRwLo`Sz16b1W{x1g4|zBUr}%c zJdUezx1^;t54D>0YFwUA$5&2zw63;*^fFUEQ~dn7>s=fSLN7>Bm#R$jDs9PPfp#f; zC#(ve0eFmd8VW9N|KT@+^9lhmYXXSxW_t!bgO1`IE}SJlXyZLn0A+3D&VsPY%kd(| z4Kcqkjmcn6CpjhWv~N)K41)*$jD}$S0SdJawv(cICODD*ECa^!2cAdzBDPuXY%g>+ zJ#Xu98gxg#GXatKp-^qxe(rQOTT-Df;@OJ`8Imbu&9tmpggW&HF&_2+72`ZHD#ZLt zooj@+zs%`Q(E=1}wqL35U{T1fNVMmE#o{u7+RuPUTPp;`w!Ha`So{_SIo8>>HkuQf zI>H6}n7!XWbreKr7H1yC@qpc0fcBK^Z<4(5-sKgvmt872jZDmbwh4#JGLhon7%rfs z16;BN{yco2Ce(lhjGaPv+ftk7Ee3Ri+9qNvHIUi1qWvkAQbxYBQ+=a0o;S% zrx>{b|0TXP(MRj_O08UN^|bs&eC8d7*X2~xO+XH1a;Y}1k2Mi%Py|S|VU_~3_<^rX z4!kydV?YFmRe(7yJM?DqvZdfF=!c;Q0H5uB&@)p}L`C3ieE@U(ueZ*#7(N?jZ@fe) zJ9D=Ng#v9M6LJemIzUtYk||~!ua#KKK;MvE^iB^Lg!dm&$f*h1V!l%vKe>#)6R<`< zi3{6)bUwSE02%z}fBF92*15Mf^f6WKojhRj(yNV|*hNP)v9c26;cUgTf&ppr+#dq# z3b5CyI?i<6aOA$o1ISXLk&0Si<%hot`?U8NJg+<2F9;qYk#H~58{iVU+p_W*wpkM{ zkj~5TT%VBzXhX3rzY4xH_w}sbY*{+JVYu%v6iMtqh##isoZig^02m8sTQ=RM-uRY| zRm}Nf_RyYP8Mg&i6wb)kUt8d$P|l}3GNuuHG;YnNRI=+^T5KXcY<;=E)62dHS2wzd zEmx%#8f|JjGK0re$Nj{VIqrK*dr~!Cfx^Cp1BarPW!WcQ$-kW@o-AEUwNr_p)aSbw zCN*U#yUI?D0{K7j`}C2Bh=f6O&cG40Zr~^v4x##GuZs{27u)gjtXzF}9vSnn)U1#R*i^9S*_WLU(3<(y|HF+D_x=jABN01yHCWv<=uXg>kdS=Q7JS^5l@7%>ow z9VFj)7W)gW2{<|fw*3qf9Y}tg>qe)0f?y$v?k(+bWQTO5dr)IGWMyH%rG8e(Wx!ps zwGs)h4gV1;*AUJ{@dMf2w=xaxJ=zknGwxRj@~D`7XNhHJUnZRxgGw27@x~AL*^?k! zh$`10kmxiaPR}J|roL*NZvpEBq(a@*jxfyu+BOD1adyupJbQsNb7Nk~ELdY4%ZtZ$ z=_$}RO$y9o+RiD2Xb}U9k!3vV`V`D!ix?=9SHBI&zw?L%LjqquvA@h59e|>88j3l^ zAXQMKvZbXYb;^Bju#s24g@B^Xu^5kBE_^v&Yi(@##>%urB-ha91SZC3v=tT@D$Y4m z+MHbq%!PL2nFQ)RYvea$PA#~H3t}Pe^vw%Ar^xqnY37qG3B76N+?jg!-MUBze5Bb_ zIjUufH!S%D5ZM|iZqKB8ITp&}WMutg47q*agSMP{jBDLy{Uc%N;x+N+@puuy9m=2P zRnDVZK}#i0O+isyV9^EO@V;-DlX?VZ{+&!$$AG5rS}kYl*HORVlslZ9uX@M5fBL7s;b}` z5CAAX4V2d`whi6lFoUeLH1WX#Zv>1bsEwdJ4gh2(p0X6vWTdS+DN=9{0e~U-PJDym z-^j=tP0sU&(qiwaAx_eA5JK*{<1g8ZBL9Gkfnlw-BKHNg^ITG!MG$kCB05kw*+70?YH(MCzA5)X zRurD1adW9H`bNwmv>KoS0~6K&msN_RrWvG$n7=KFb!zE6y;-%GF^`NNC z#k)czKHUP+686Qb+3YpL3^S9#Xo+0jvklBu`p1F~Xf@5{4-w?Y(j1ygO)%38TN|5W z*~u|lDcGW&%kr{9=~+M_e{y421Qafp>7cr^lWExo<^yNNH-T6NFTB8(aih_?R9hMCB^7 zyDMXO5psSC>pGRn*>f-qY^!W%aY@_9`h)p%YUjJ5VP3hE!|A73suB?`Qd%Tn-_|&o zk(8{K;wWX-GmwR-I95QecKm1QfI4@o0snx>zb>QvWTaS@O7)sv*CYp5PD(3U(`|Ju zj2luMMHKQh|9VY~y<@k0#J2aTTMjLi0ohHJ!D(e;{9juNgp4g+Ij5f;;e~Wg>xumg zF)_*_2GrhOQk)q8#DJGSlnr^j7$6C`^~Z?PVvg}AVjqxO`jDdC!V#y7vO3Qgod+PID7CuAVKwMH7G7NJzKRUB(M+jZ~GOe19kvhHMu(Go^R&N6Par- zvh865p-l~!1xKXubkbj+|QHwzx(cp*pT!9T0>+l_TywAYP8&k&l)0tnLP4) z%x2Q2AW8Nr9B|_*)97j$wwxB)sPZMoxf1(W`re*-ITX`%TmLdIf-Se4Cq#1)cWZ8C z`w%{&qlUomNJW4uy0~j9yS-cPjM?G5+tRh>XUs@D5K7903{CPkGh+c}u)F#)IU0^w zQ>+v-pwlivioPYHiM+64?WnuCrc;{dMm*;-!A79@D%Au!cLYxoC6tl7>0}=b81l@^ z4RlUTe;_EC6x5cVe-mYl(LY^;VJa1QaWUVD5)!3FaEG{+YC&njDRL8cqg)=;J**QY zn-Z_}CHL~3;I^X%1=T4#*2LA!lJ{)EX?L*AGuom;;T}yQS7oTc9Ry_48GjJh4*}8* zYE!D09=e^TjcAHrW|4DI>&kqZS=?{Ha+^b}6AAJ#R;z1`SlgjdNgkyV3Z_4PBuGD% zGH+?VsqC87Yz7sa`E>E3Kkp`OMm0++e%2&{^X2>@rm}2MInZ8Rx73F7id` zcG6bZNZKlC>;w8g>@B0xo=#xUeE8=5#Wbl1{q|PR%PDEk4%1(mU4od^J_%!9rZq+D znkzNt%9XNvzhW|7$PLq+O=s+Je=+VCxLc<&x(5`^QXVVn6b%9GkMim9u;V+r|Lk+J zn3kew0O?i|WO;TF$%|;Gezw5uJSM->Nbxgvd@KD5fu*#2xC@nTsR`vjl2-{EJ89_f zp(R6OHxg&w4ci-}t>hU)u^mG7l3Mt;7*;*|2xPysKRK;-V{4iv0)5vJUaDSGZi*)xsSRm&q&D=0S?)BoBre-v%77IYD-BxaP*C3Hhb-m zS$aYUus44$M8 z-nuvxU%ik}Z?^sT3xka5Hhtd8WszM6oOG@HT}a+E@ALdg7BZ`!>&C3E`_~l$g+XsR zJD)67(aFtNDENCdg09UF7&nV{rw~8xR(3_`ES4FCX!ax@S)Ll4EyK2i!4!JQCt$KV zm0xYnZ5pBb2O|YdPTO;u^)F?ZMQ=|Kx81?CDWq!IDAN5hQRMxILo2<+1ONciGg7=b zX3CnhNUkQ~XKtqmB7H~-$b5G4+~JLq?|!_#6}J#LX(tB}35f`;|3E@(`iY3#>BN38 zh^iQxSRc~fIK0Z%2UsUlu5+=HSp*K;!tH2rh`7L?%Fx?OXyO%19oEP*N0mQkI6V3C*>JWyjecFtxw#DpK*B zu7iX&@9ln2^b!jZa~>M{f|NoGa{b~|1b^FQbhBj9xy{^ij?D=cV|Oa@Y{E6*k-{T@ z>pUQWISbTAM$$y~Rv;h(6o~Pq@KZut90J~L_QzT$iP6`w#eyJ9-tv_vGg-B$i}(AK z7nTXKBR0Y*1HYp*oBw^qJ(^OG<$jQQv zC5f&m1_x$6wP0!p6>3ExMiw}h%P8gB65`Bx9;Ot(Y~ChG?0u94LED-cV05QjEx1aM z^T|f_-E&kzR^M|?V(7Qu`fQKC>C7~)Cz81l5c^msP+XM){ z8{m1AVi=77cAJMNP%!Q>!14KXVsx^xQ$HOkmq!nTp(=UCsT#}-oI8>@j)r4dr)EpB zNITks4`93v5GvB*g!>6sO9W(zI|ExW7~_kat*)@CwSHDspNF7pTxN?C*u?&(d31{L zL8$IDAUR1bt(EKGe(CaNz5uMjSw|{JM^|exu|o)h9^TD{#>mG*h^YxOnTjlodmUe? zlhm4Pd0s)T1uRKa&!BJ)_j*-p4c6LVM3gn^guY6CM#G-v2n1xt_bqb}K}acu6jfz> zfF}h7A_~h1fhZ7!5N01hv8G6l-(ixN0POHmd~c-ngn{FXBbMgi-y){RL(e{=?%T-F z=a_M^Z3Nm!@EPQ@7Qy_Hf9vxMk^T5zTZRP+X`N`&Kgoi5iYXHmkxvOza-1?u%kgSlpd0|gtZ=bpE3y=4XdBigjgemq)lRQm zrqOU*mrbKMf~#wpQCR$y{#yt+?PcljYM*wGP8kj1lF+a#-!rq-8$?fCYo3tn8Z%t% zh1-n4tSW%B2gI1nd`B1%>Zo-gpwnJ-w$E9A+pNq(nR4CGw})YtS5CfJza`iZumCgZ zwArZI*UXkhPFqYlhysNazMd$AkWvTq;RMOEDHCDUp}c3E1Q8 zc(w(Q7@3MN;usOw>J4V<)9|TDjQ&Zo>d2z-RQwFK4j8bJc}lo}&POos8u7na4tewD zCqG%^@+1^~BYIEd&NWA0pfy(pMLO%6WXHXQ|4pp12$_H&fZIsro5=68LeCXP5`;WF z&ZNkfkuTq4dJL49q{6a?%zP9GL~u485z#<;A%u`9ED-|33V*GYkcc47;l5gF6o{G- z1tO5rfT$X(A|XjMF-HNha``A;G=ftk$W1lGDSTsQ+L6%1kxiT86y-gc!sm`Imb8=$ zkWCARc6GWCoCcKm<2e!DG05PRCdf}J?P=NU9O-DyZp(7qS&VaP)0QqW zwbLny-;|nkhFT@~w2(teki(TFPmmN?6zM3J#I%%5S#GSE5Vm@T3Vx?_t6dc@%~(D0kFg=D*0vaR{dav_X+I(Ho6-ecfQ4jkTlL4oI7z9MeCZ} z<>`SOqQvC;flczCop}iE5)c8jc}YH*C6t`!@YA-SL8BeFkx~kQ(vRn$K!HLCfhYh> zF97X&Q77^Ow5%%MZ4v+|(5(G8OF@nIphmmXK$-taVP|BB!j^e1*GyU6%G81mFwDh1 zS_@BUgV^7#8lR{c0Em(m3#}DfBNo%$WfH%`=rf}yA3NecB=eYojFuWr2hy1xMP7^9 za9)dJXL;Iak!|qHF}sUM(WooLFvh#RqJ`}Y)BR0CNCf|Y)wbv%y(GG%zO+(HPa%6Y zB0FNvX8JijtzM3&R2ni^%_FQj?`zQ(n zL1+xUkX6-_LZXxcr5ykv4S*u$B*P=;vBnZE!#9!d1NoR zfsSoJv_im(T}V}GYBNE=4z_VyX@DSff~L?9d1J-Y&dPjDKgG$J0SniD07GJ3H0Eog z+o&oxnN@E#;NfD2(fAA|C1SucL}RGE=pg!^wnpxbA|!7zLw>#o9P;#9Vd6S-V3-a&qX%;=xRz5Ho*lK?HHX-&txwEa))^ev_c6}Im?<_OEKqCka=ZD`6;sqfp zKa}gK%?)Pc@REA)1v*@7qG5{II)!J(TvmiD5qW*x{xx43fs?dE@*{0XWW}{3IUC8+ zx4MP!*}E_|yg(79iDXZ69VVf#LgowNq{uy@*HdQ@Y(tR$2DZ^1X_<9Mf4W-6u7p@Z z0tkqc!9oCVha9-V$(P8;MFMTK#>ph0aAwuy>FH;+F`qO5XaakC3J63n3oAhokPyO} zeq+GR7(Io`+jeu!X2$Ii5QPAWxsSvxk?Dw-xMo0KlL8=<8~_oN7*OKCPY9qJ%HkLWU7M^z@VgY2^sZlxd4O*PZVuz(!!MQQ-=LhtB2QHAzhJT#Ji}xgY`9MzzXQk&SfA55c3Kk+~Tue~H zVQxP?6PQBfd4$N^LpV_=B=OQQ&Bj0%`#bs;t$AJ;e@8cV*C1}xiEL_ zXkZ>af+T+Fp%YFoB%u%{Grth6XUl7Vep1Yg&HRB>4iy{JmwAerhJMxYwtOOxyrL0*oL-Qzw5Voz%CR_x! ztI+x&Vd)C}68}q+7OrHiHE9AcGXW@ofP~-3Mf{I28wG^fFkmJH1fq7MQwXTtN+9F= zPyi8t(iJn2!G4AjD^DPSg;%lH4+0cw;^rd4X%xY2xO{^P2r}()4Yyd%W@c8w3x$(U zFMQs#GO=M)vK`CWMgRviLNadq{fpcQVB9LHA;7>6W>J|b4U1?)Nd#^)WrS=pJI#JM z9u#JUk^O~W&xwEI%ihtAID!Mm1rq?KBMeSBN`&#oM=%{_vJ-@PNK8@0`cjBE5P&1E z2!#P;Un>Y!C5WA0RvouoKnPaw9pRBb@uoevjo6w6x{%e-kezOlX{)sBD0h5kc9faX z$UhU~gZs^$68WJ`h!U7bx1fb{h;f6}mUAE&dv<1kR~pQC>U7nu++|IM00w6pXW)*0 z5(2=CqL3y)Kx?m!18{>QE`Wi^W`xCcKhQ3h7ies-5M~*rTT>|z08yB%5Kw7_fQX<; zlLjHst2zn*0wPVM?HV35bvI-2+VI~`IT)T8!%YNAX(A2Uc{?yJ2h8*@ASk5`gFpa~ zMi7W3eRsg2T}=d<2tfc6XdtbDq^zo{0wB;>IR|aKP;SyD@EjwFcgtM4g)=SSMv;I_ zVMYf8IN>6r`=N2e5T6q}O9yzc5@g0cdOdNXYsG`O{o(3ts*N#LwlFrfHQ}rA1I*yt zzEq0Zaur0EgZoKIJYQt6f6Og-r{L@)XHWdVt!ipyd;^iyHs6W2B{Cd@Jm+*+BpG@` z4x$)sUG_OpgibXGfbBAgA~~9oAtT?KZRO;?hSe*yNT|O3Yq?{pY`jDQM?7bdV*A9U zpa1sq9g4R$&T%b#0^ozCi8qX*c}`Poxfw_|OGi9$-2XErqrgUQ?|rAjHAsjbB$+E7 z1rGW@=$wc>-?)(nD>Ldwdwg;`O94(o$O+ir0^xmA?_=my}4w6=Cxi%J5KQd%n_bS^+!8z_Vz zgBP^ch?1=-(i#LI2)4e6fJh4=2|!5WzL2z5S|JL@Hbfyv69D$Ao+gb5ApA5m`5`LH zeLzVXrCBlxK-6g6la=*OKtfiI7fyD9sDqsqA!jR%$FeQOl+$$?{R?p2FE?~T-aZGB z2eQj{tgDEf0f1K)rWE#1G-eb3>taMB?aZoKV`~cx1hF0s2I1#I&$a}`mNurF;y7`I z2v9`kH>#Oqi*Y3gHq8;qEHF#OPg(I65F?@B#BmN69gbCN|1(s9kGGhgG9rv4QjeQE* z#A$TYG5F}v6S>tV4r9A%S6dG|FcP%T#c{sQ>K(bIJZ3!KfLs8xqTOI#kX3~!WF?6# zOm36{AStERTGdKOfp+yIY9irKzlZz;Kw4|9!TBp7(ptG*2paAYf!2g(07@$YJF=q{ zAyKWA1OPxOQKJTvw~%PSIDr%r5Cm#Xgg{cFsiHukL6asaB_K*5!$?%nXe~ejpmc7D zfQXck0uZDW8c;V40clbIX8#y~ow3kTO3)gmG|mx(&=y_dcubY^y~f6K^G3!`AegZv zbPI^QHv(b$FJZzS3_DCO#+w|0g82Y&jTkMX4=PKxBOXmX0Uu`e)*+Qm{~PU04~9Ig zru&V0Oz4A1^S~iz@I8>kbs(8SOmF1~QP|U$$cUPEJ1jXL;lvp6bGyoPE_gBX$`43c z6=9>R$a$OA2&0mC9$~F@;Ad*?5}u)x5F2V|7g3}0F~eZo&~r56kL5Q8pyX-y#fDiYF3P^h-1>?OMx-2LmF+T{MMM zslZ3IGgbh@Ze^L{}n&qmQsSMBty=a|Fo0k|L` zS#*zXGS}f3S63%UWJgyJ5T!uCN=hN6Cv+TkeD+IEZ(5yhMkLP&`fA!$Lfj}@XI1O#n`1I!GCHY#RjtEJmrW;x_` zG-%LBX1L6Zb^!oMJHLRWi9ox7HQR##?;(s@`%DF(@e?4dc$jIASecmdb~Zg%2!hbF zw}ZCAiIu?`NID)ajvWZ08>6Cmn~nek@T=}vdT08Gqs9Px!iai!0|f_1H$dcIqBRzA2r7aIYVH)g0LMV=BFfANK!J$B zv_4xj-(NQ{AU?7Jff2bn{Q!cw0%GMD=vcG^paY3{E}~*uhU~(L%3&XHev)b}kBD=g z1#ojGW^z!|+BhO26FJTth0o|y<>cKF&>*`o2XIg|0yK1@N<+My53%FjVkAdLU?8{J zN#M)J@um2;9vXMAT*k|$`emu}@^QGUslcuN-Aq%?XSt@QW1UwI=&Lna%}9PcsDC$r zyc+0^Xzbl@oF5$mS2somH$a;6DS+30XnsmwY3ZSoImf#1WhrV$9Oaez@8v`E%7=iv zLhslkIlcPO&UM}$7XP>6M!nj1ecazc-|k97d^OG=|JU(-`TVMW3_UM{$14B_9^=^G z$_sb|D~|8?WoPv&LwZMTz$;hqc;k-&<}Oj({m5PRISRMoPD%D^OuM^U$Dnw;`p5r! z>`n2Nf8}t@Nd9+U>Tg}8yA1p4QF|rx;LD_X%=+kHbFqF5-|jCj2O;`hYC2XiFHt|Q z!=L`j^#lZT0yjUd1bKN8Un(MwkRBW%!&gEyI9LtS?p_6w`0{AH1p25Rv`V7RKY-v~ z|E3nWNa$V#n)7*MCU+nX^%~7w?A>J{njc3x{t2}P1_P)#1R^q1y~Y)jGBYHGJ5tuY z>L?kR2?CM5a>q=a0}WG9q)lQ~rk#YX^hO%t*vch-Ow)N|BOPt*D`kQKc&g5ZT;(GEr4AF%!{gnuh6+ zr+g?w&RNY()J3JJn;S?G$x^2MVH)!=?hi!Xc>kSh`R-YIHQc}a z_AccdV-p^u0U(kC5rH8A9;b__;-EH*0PaG<+z0}`GFF4f4hfIl!^;Zo*h=FoZ{{v# z9NTFBTkrQ6yyjPbiN+thfSOY2E*`!F1759g@#TxWLKqxF@++wC%XaJd125t2xmB{` zb*-;6m-YDab@A>^*GC^;c`tC6uIeki{CPaa;dvjD-<7v;%#HPT`0-}JF;(0J-d*DP^dR!xrK@c|!W~QL0ja{- z^=O(qfCmcor`+63DbNhw)%;;b#LPTDG)D=1y#ffw>|5V+AO=cUdfTz5mDU{fa5%l<@M}XE!eOonkp*-s2|+we>#DyGtb03xB89L*x;>4y4tby5n< zfkS9G&^S(0IRp;O!Oh(b0XRfAYdCNpR8>TaNJvXBbTv1pfTC(A|)z`+~|#njD-7<}fG@aW@sJjD(UKvdPTW{L*L1hu-sfM7^iaX`c{Ki|g$QA>|{ zsODkm+RxVSW}z6~RaeLAbS7Hsg?br^ULo7+0Z?;rP`BFm0Dy@RlEKWL9AC|j)#DsI z>tldSHL}rMi`1u&{1`fqm7pE#!IxpXLJMr?xOCi zFoDmv($VHN>6pKKzDRTP|MCjrF$f<2?feQp|2fy@SSxfws+IN;8~j@dK^6QSr z=B}tY7U6LB{{8QCOvl^pcdw2JZpVh_*ge%pg9wk;-mCf>=vX-*5aF?+uUZ#$Kqjug z_jvMa8DGD+Vll_+;O?q99Q8JEJoz<9R@!Tp*5Iq+12l80fUp?@&!Eq&?lEAdqhzzb z+j?mNxVDyGmS7eNpy$m5D}X@A`^qE#t_XbgoBlv49xXzs|X_b?7)fO z5IJD=;)(OSLSjUMs{GLGp z06_1Kn;vgq1Qc)w2uKL-gk+{fgcw8x5t_C$2Q9`iFtM2-LfiB)q~o(`MK#431Lp#! zK5Pe$ftdS6Z*FG5NZHNBR5LM$5K$?rU`QNItyTs_1u&(K{(Re$s@J-iY! z=BHqOFpi~ty~5_|<{<x`PuSG5hgx zL_#{E{q;T^lgtr?tnZ<|7kU{nYMe&Es&zvHBtSbxm196Wma+4NzWX|25px}B3P(Ah zRgB_Tr_X}%nIk*4E%gc?W2YaZ7R~i@eVXQ|=QW<*MLKx(>$ryXC6Mw;U2n(E3|@h8 z?gIaDTxmX6v#)?vMD!?9oaKFhP{rtgh{*mj@WKq#RH$SAL~iCzOhjBOdqiR+2QV{2 z3>@oI1~Vp6dw&OTu$PL+imTN0Sq}gnk+pi^sIrq-OJ<io^9ymCniUp1$Vn!haWR!Utjm$kXkv+JpxoIigqGw`vUoN}d zZV1uawiENNTN;5IatyBU~%{A9-Gsu6Wz>n=oE#xW07y-f5Yvv*Z0|2vHH`=VYF#t4EqEL}Os6!xz zR%?872Uj%!_c?*pphj>kLXVXqFwN!m5h8n~z^oC;;W*MVHy>sSSd*4kq_q}Db%|Vk zN-Mvmu4c}N?iiSkmH2${YO7=5$7K|526wa$64fg>o1V-)6IP}3j0_RF-Mv>o#(Ou{ zm+j24KdTjO{r))Jh%_evpF`q&ROVS8!obAGy9Y2+SG7B=Pfo2sW`WxbhaQ1%JH976 z>Pe1weSR3{{5;nXaO{fw70$`c{MbiSbfsz^>Wdp75b_M+ztUtdGtB8|?gQugx*j>7 zwJ!i@e$41*iHL{+vFh26a0^yEiRR2Z*8~pkR^udqqnp(_cWybjW-6-OUo8Th<|}vX z9ekFfI9M&eDm_Z%$FdraD3V)!F>^Bna5c1wXVup9sIfdA;VP|Rq?wQe1Y!esGXSlX z9})u?8JLlQF_Qt9n}Y=kRsHF;2T~wrRq$*~p-F_q>X5VT_S1eG_J{p$f7p)W?P1vM z_WQ$TJPhN0@M2P2aw#HN^H|1Qq^OihhQoj!B%2wOB1LT~W)AZAhxq?50sZd(zWVoc z%n3CE>nqjJ-~M5TDsTb^00SrRnr{KTCukC5#N;u|XABVlRGmX8YN_u5@pf}~asA@i z^JfTjes*&2;_~9MzrA@OIgjJmbzRRPgfLA*7AYz*1&-9Fe$4sX=g+TiZXVu$czSZ) zt6ig$lZkSo!4#Po9b})2IDa>gC%*>e>DWs+~bz)LgL?m=%06;Ut zfDVuV<{}LM5yb?+nW(ZUZbry=?1Z@z5Hlf>snv8#NAZNK!*P5D0L@UeFfqjh05w&H z5RaBAHCfEvQ4M_|b`%jT}8Hc=HRDWwz}BCfwq&5j$K zK-An#qyQojRr#Ts5m42%2SgE>ao5@!`&=#@sTp%1a94n82?GFnEa+j*D@M%oCJ}Q7 z1+V>670bhXejEVNp#t^w@cR)iLqIe)Ra3171yGO1+-}eB4**fsX4Y$d2&+VME?t-h4ffhn%w`hQJ{O5Xf0l+nejn_02~gefn2F|HaMi?Slsoe)QuHPEO9QuU|ZS z_FT%iSgerKVJy$DHzK7?@%-X)93~cO7v0yNe)IqOFaP;xpM3h0AOG-w`k(%j^{NNw z`wt$P=5ZWLnNp0VjKEp^cKhP#x8I8Bqt{peF8K<8q84MRG)>kn{M}<8NO)d;a?CZ(d$LM08VGEIMp&;~HY}VcZ%#55svG$IH!Q9*&iRKqFjTC{9h|SE*WgdA1BxGjdFh2sv zg%ook>;_1+(5;x9xpP2O2PCV4GqkzKcW|E(A9Lqp#+fzOwKONH)%Fb3*IFNHJadA8 zh_fbo2GDCe<1l9thnk%M-2@D0lyru@D&tUNG}Y>z@Hqbo6;ym#;~xogaCg%gv8*+3 zO|TW3pX*jWN{|QWWG)6LIZN+|;~^5ns+r%r&?}rP*dy>5lOQazf+^R=EkdI~X#1t;uU$Z!jw~=N6!L z9`3c4N38nt`X(HJYaTMkaOAcCz=4QOEH=SZ=UZn60K{RgUd_~NUxY9V+Yu{L=#DTa z)44SPKyai`r)mi>5F=AB*RYMK;M|BcH%`;lv#S?ZSC{wBe)NO)?_Jz~@Y-t>5ggxo2T76a3dd`2L3LA4V(t!=a4RAX5sVX%awfIJIqC3N%hrE;*0mRL0Yj z^BB`mCPE5K!;rVvH-GuFzbccSt}a4g1UD~5RLz)J&D<=66apRgBL~K68sbQ`icm+l zimNaO06-HwDk>0>D>@5gWQgFVb!txC>r-Ul>MrV=-OU%@d<}^2f4}RxW}LE^Fp{gO zE4as|tEm>L zs$@KZ?)9+;w^C7gL}YYlw?a(lHDJRG<)F_~HSSsi`Aca`O#m}zVCLom6``6bikWk` z1F(-h$Bcr{@%Kn!-!TX-erzZVj);PT!X1bY=r(7DIs#O!)x`=S-w7ODtWNv`02(Nm z-&s!*RDCwOyH=&5A=Fo+in7caqZ+T(RaL}NN<|DL*N6>nl^}6H(p^Nzhz>eq07q8$ z_%QZKchyE6u&R8C1}WBXcEXfe0CS zp7KR-;y^@zr0P;^f5^MtVLR+^w%h&TFy<+RP93MQTwUFK@#WWFee>0mr!TH=ci@oc z$XgM=T8xu}nNyWX=#hn+$7E-meJ0N8zoog+@klX5jwyyfDTI__YElR>rbtZ07&yep zOvHf+DKa-r+r}mac0e;l!Wbd~HBG~eDW$dv%jIIV?E7WETJ(!W*S1Y+LI{D0kPu#~ z9Kqe(#9XroFyx%cs7^EFG6fGIE!r}cA&*jInx+_I2&ohak?)~VlWde9mmW25C7n&Kkb`FG$RF7nTA140|$*BVlVfM->r~K=`8{ z{NTIqzNe~P(}c({BD#mRX?j-EaTw7taO&C)5tsuJVSsTMZ?A8s!_fC_zg#d^jSh~7 z(QqW>$P|zaTuoFI0aFZWN<_pVFf~mAz_H{aQgI}3q`<^%=59K}hydUyQV6N2xNC)> z&5VfAodXlG*Lqq+pw_%(4k}(O6A}^EfeR-9xFe?>fYG@==Ti|R56nmmX6lFrM8M3Z zYEUOj0A_~qt~B?mG^+$+;D8X!Tz!rLUPs~U{i>Qkra*iQ`$sgsZqt~TXkdjg@R)*_ zNzG?A9*@Co#{0qDk(dzG)Xic|b+z%tJ5lM(Fn}ROHZueOt~eXP9sKWvhz>N5S|!%SL^F$2!8JAHBR!1>?uv?tf!Tdl{xh?P0U86F+!(|Kj4}^78&_vFQ3{*>~%8zv>rV*ETVR7-9%91dcHTM&fE;7l@DiH!&h{ z2!ZPg7*)+h5sipbjKnifiBu~p2RA7h+(gHcaWEyM+Tn{Hu}xD4FqJ}-Ct*ZNl?ZhT z0sn9R$N%;9v*(Ayfad$*kcUhh5d5&8kZrkKPSe;l-ObJB@#Ak+>yxwdvk>Ecw;RX2 z-`s9@J1us8ar*Y#Z$}R5kS86AScJoFv+CCGeCMr;^Rw-4v)gVMi5Qs}0o}Ciy2WCV znm)xQa1bwQrR02jeSH{)F^}VLI9;E1eZO9=D_pr)w378O?Aoqr+g8*7Erg`vg}aVZW+V}*stFS*Qc{Q^gyW7)KtgjD zl`$V8M>7kxz9W(%wJK7z5Ca05sz`CQ#p;BKrko?QnC7W4gQ_EANKvw+)EeMn$ot_S zWuzF+PR~!)rwBOiH}~#c?Dm_l9)Gh~u20t&5OBA>NueS0fMi+_wV0Y35!u`)K#B0ni09CD-uOdHKo1HmE*gVQ|6z71EsobseMnY4CnN*#HH$>zJr3euR z;)*X-W8jLHRUFB{+<}g?bG=|3xnfVRC=!5)0l?f0tcuMm`8!{X+D6?CN!GWGz{p41 z7LT({pstmOXJR7us@29hg&-br{W}=S434o)t6C2shNx;a|1nc77-%kCfp`YTW_a!; z^5(M?Onu7vFihLq!;|M%&#qovy|}sE?DoU3-S4LS^Dv+4lWtvG6^J)cZia_87W_6>ZS}o2bk z`uT&?QuOxbHpY1U{07nFtV z{-b+Lfyu{V?;^|PQnW6s#9Xq9G)pi`Dw_-bJ@uq|n^n z-0p{6le)ujaF>umq=ZbWMa-m>VH}ZwfWe#t5v8v0#l&*yx*pxfaYFX};h-YRIPm^3iJPmbYR;pBF+xhMJFNQN&`K7OqB8<&RZcM* z5Q>E+F^6#)>)92RCIk@`m9FU)C#Q(vi?6=^7yt5Ke)`21S~3#6^VXaH^Z(*Mf9IX| zu;g~J`uWfQ`v3BO|7VwvE`I#}hd=z_!x%Xb@3*&!(`wa6MkFUD#A^M_Dn*z>Eg);~7t8J-r4-ed zdPF>;+C&v{00(tr3NbcceEsFGfAy-McppTS9C?5VNBUt4jN3Z4EOsQw)Kb zM5;Xt8n~HJ3<&dj>pK5|fHhK^+3cz~W8+6+vzBURHj9p`SO_cZUjIpb*i9X(2p%gQ z3kH729CKjsnKSm8f(ERvlQT_TISZ%2cOohPARq>I^fDWh!3^P<0aZicS+JyP$6Qy_ zj@^MUGqvl+kqJ=5m-Phcla9)d+R@NX@@EUmyfW z1ey^TH$YT30OY_`El2gH-7%Q6IICjwvqXhLoIh)=mzc528;}vv4MjvnM74;hnuttO z&Uu=~DzD6v^OW;A4%0LayZ!bsJiEHN-WufQE~O_oxGcveBp z@-T2wbv0nrQeuh-emESqo84luSe&d0-4Jw|!lO4{ODV4U1t2cECA~J!Soe!QHK|O} zb^UU=c;n5tHn+EnenCVzkHa{WTvFGV!}|0T9rnBZYY$&5R#vN3*QLH|%^;)%2%DQ1 zDW>xW4*;Nus!GmN3<-(GX);ya?HoKrZc-|{$pZ9!Z{P;-&C{ptZ7M|rvASHnxET(I z)Wi_j9L!8rkf`J`3}enY#kg26Qq$z&CdH(x0N8Z{BJ4NY-C>_go~G&H!v_!UgF6o6 zVYlC2U0s>$n{T|?cMBjgD@|$-hdk!;;`;f=pM8XiO-i6nM1SxP{y>TqDZ?<7GR=ZJ zQ!|&6_lNyBjv>UZYhr9e)42IKOtFb=Y6x*xhOTeBb}{THoXTOl`*;8Cpa0kY`d7CA z1V8{cPd@p>pFVs0op%?@{$_W$etz@u@1FhjUqAcz|L!+G{pm0N^r!#u`yYJI6epG8 z+0Ewqs#|o6Wl!jB)0~{0P>e2`x(3axAVowZcqx8GGi%yd;jAfVB%ks?NU3Q!G9d!G zNQP={h={~R#R0@rROdOmikQuycDS=Es9%6+YE)I8pyt3pO=@(sfAe4cx95xXpItu4 zPRw{1Cp$`I00F%!i^$zXm5C%vE&U}+Y7#{Tri#y~PHywy7*|}LP)$XZ$yLSFm{~-S zCp1`cLW$q0oy9*aOYuizsBF*TTVW|bc{uX3xpkptYT z(9EPxR~R_BSwJSN)f}i9&LbCIEwyHSW*x?4CInNP=QSKv6##%41A!V56LKx6y}~Jo zMhK=yA4YJhGpsL_Q4S7nmB4V-s>a7Uf?m09sMb{m6)nTc+A4Eh97_&HK2sQu$11wk zqQq{7NXUc$OoU)eb###d(HzuF)XFf9Q<Fp$RNSBxbwpPe0d>f8t5RvF`N5ex9OvyDFFfaoLq8L+* z)HG?i?3at~^klt0S)Z(zXD6$(v(uB4)#=H}a@nuei{*0BcTGLo6i~I8n@SNKN)|*c zSr9xhi6|3+qq$`fsy7Hgia>B6a&RkZOtpkpDTu&CB6<|>gNQh4Q1)sugvQKh?&Rvm z#8_wV!3`W#-3{tO1j6csip*vXY7P)Ws4jTfOVcC|94_zQYf^I6Y0M#_xrs>Ebtbl( z_O7m?CT^-tOiY}$jCs1*Y|c(jnx=^%F8iK{5DeUR+ilLnvu~e-knTOWl%g>;bap;X zgA}Wb*Dy>a=aMC+*teYnpjuJWqFPK;_lJW!P~hG@PkFc9mZ>yNQ$)6#JrXo+LV!{f zU3WCwZx@fPeu|i(R!|yk5t~wKloESZ%}}cZQ53aGiBY4pMT}O7O-t=swQDzatlC@c z8Q$;vZ%)q1NxpfWd+%r6!xF|gtLu}j{NM`6*DMT;>CH}_~3wEwo>z> zH~qdZ1cT-}5``brQzL&vBU-HHq+nG#3D8sya920Zw{emJH&MN?zcg9-V`kTnU;Z*& z>3p{0nL7%Vza8vV{Sx10qbU8Iu)R|(l)$4Pf8C!i>ig_^(&jQoF*2S5MSw&R|1Ksd zksK=DdzfjN(R^@B=v}UOr=!&lmu_FlDY{*(ib;w=yg%S8>$gNZB2{CjA6$$n+{9l# zih3S~v-tkWQf0n7Bd-7^_vI_LBk^ZE=L0_5IAe`u#3rWer)_S|ib-0I<4#K)wX(7; zCBo-V18GCB6TetOhxk}KrG;vK>cAaF(t?3m>#8=iF_k9+T%bU^z*Vw*!QF^ywEl%^ z3p?D?Q`x)FZLB0(C1>)V)3MI?G_IGq%4Jo5m67B{@3qKm;~z@gprlg^i{=_Kaa5%! zmgV3l<7blKXz7cvSJze35_#{ZydBfJD?kk+P1kZIYqN6nQDUNS1hzS+u zNCmebdK72mc)sMP$f}VunRq)X$J3%FiwcFrA0bIWNsNy4&b;NyFi5R=W*VrisMd#4 zTt>_!T%LkU&RFH0979;x@kri;DfuY#Z8j=e{LW{Wbo6umAL~;Ptjq5xBD7OqVnR}v zjun})Z_Hj58+$Ms@D30y7q00$$dcDsFnL(=``t$B#abf;T+$23SmEFP3G8zUH zZHd3WDNS2@G+%D?HtiC8_pSox&c60uG|YJV1iiIrI^C*V9n9WBp)8krJ+guhmi!k^ zzxr{%zUoMJ3C$)(HJ|MR%Y%bg-|+;UKBNh{Tz3lD?+Q8HT0gS6?k|@j4DJv|ft3A= zt45&6?KUp=+^8?r)59tFXvgUEJ^e;4hN)jJd9LLy@u5(shr~oGBJp4gX&y!mGWL-u zEMm;@|1mcbmhc+ZM|ZahX(C}13mthv!QzuEn3vJJ?T9}f^1EvSU8<&sCpwtC6r@g? zwlcXHicxU}LEn-`u8rk(T6&9orQJ}D&~Z)t7X64>Z3K*HPtocLQ~gvAO8`Nz1-J-( zr+dtaWaIm<hcKuQoO01c%YeF=LgJ*o|W7Y^(k$vzfe1 z4U&67Zz}WFIOnyXhyr;eVB%Jz4lCA@cr2`*l#v()Vvf1PSg(R{)2}qcL=T0j{PRDK z@B5spW6zDVYksf=(1>DNH4VhznweeS3t)(Ml;K3xG|c$Q#4mpvH2UsEN+jI5ELOfb z3qI{4b-Jkv@ZWte3Y}d&_&DqSfxh8I?zr(^CsmOcW%2{s`o3vc*qYEU^9nUe<5$3%BOQZL!~<7oY>E~mr< z?{f&J5He*_l}RN^Fcd$_O7o^h1Pk31GvT8)f_;r^lg&$%?Mz8$P|2EaT_#SbN!(W- zEpg!L@)9mGRAI7mmvPWwW-+F!WI*PEmY^yd_w~@JlqPIRI31GY)CWir!);ueoOpiq z;_|QQAv+EU-X)jxid+%21NeSjE_2K4^oqLtvi0+(C53l#VhM{7q;mu1%}{0IROfW` zT#XLliHK3pYJPs7-S0(NAh1%MzI9pKJ5)VV%?wp%jZyPeV;e0g~8TiG}nLR|ht z*gp2HB(5zc5FEXB(TxuuT>Jx2{_Ci@v)!wi!C>O14V|h>aQ*3WxzfX@Wx70BH;~P1 zVMdgkI)=^WJ~#S$Q*NBMn2%`pgmM~z1dc&;w4-9SSyIeN42+*+-=z0VR0(t4UlNw1 z2^HR$Z(mx&(ab*;z!@XZtOu9$*Qfa&O$U!f@LP$S6TbKPV#eeG^MyBPY3KPm`chTe z-lZ+Suel)lHkc%Jpr31Ne<{_q`eNskT+$)MGOx-PeF?3d^B!3MXYji?S?cI zqyisExj_bx*xBPdbz~pNv}9^OYMEaP12Z%ZXcY{E-hhKVOHXgiSgMi18Dl^rPgHXF z^7aKnx$mga@of~C&^`P9)xrlV4>ws=PMoC+bE?Eb|C<`<#b;?s^_lh*K5@~mmva0X%de>)BwIJ@s^>!Y116c?6s`0$lkuur1k@I&XlwlpUqedxViw4 z9E4)OG1`)8@&N;~QqQO>TQ05osbxp+jB*s_wr`nuw)aHx)9`RTPUCZi(EYqJUoW`V zY76I^LO$F10-PWthATDwbKX)$YZ$CuQ0t?GaiOgIh@Pz!mx<|IYd*5Qa^3(#8oc~%7qgCl@5u*V>cFuBobZqTc1KJxc({vYYK);-@*nf2N zSFCjGu2I9xG#bTTy>s`oG~s#tmj(TqJnsUF&#rX08(Ra~y^9T+$VmOWsnGRi<^Nq)QvnlE+cIlCQxd+QdjS zW4%$4&xB5N2XqHI+i=fb;(65%Dr{H}WM*GWI(SvN2rphG zb`?6@Y;AacG4&PbX`n9-{w4&wMe4bvSoSG56sI7jX?w3Mwfnzxb^!kpT$6&Q>3ks_2p0{;KcD zDGGHf8++||pDVT2rBFK@m6bPj@45x{*kVC}mIb*|pen!iIzJ!Tu z$ehS`M{2gCP*06`QdI{gZ^)@Jkx|1RQ)Q#G_U?@4{HDF{%O@x(_6U(=e-!AHy#Ik%YFOx6-K0lL+agy?+{r&bT<(MBj*O5{N=S4S zB9f8|`2wiHd411+`cucnIZ{V#{O&e!WEbO0str0D{p8Qtbdb3V9ka((uKouldDMS9 z%w%LnP7GN<`?pUj@VUnji5xlK557J`-;Oig(+Wf$tx?*(9i;k#7(8L~f7}^M!1l*( zV%cN}t7bJ9L3J~6Ibu_sO+@obiBK}~P;y%kI5kc6Gefa_(-U|^^$kuH>h?;^_2ulj z18~01N73Ic%1k$x*C*G}llSY@8`kPaq;+V*V4hmghzCbX1%)Y=zm3r%>0O1XEFeEG zWm?!%X+N_b9ANg2^0%d!$t(`YO6%`OjHE=14M{$cI+{u|z4-$3E|o;3=czGCRdj1# zOFJTl*)blj1*7Cn1sfm`%!&3|u*XJJes4anY3kC!It+gYEAb6tn^T7}92I9Xg#-d( zpq?yTsr4}!=P&Y6kJQ>Vp_FA?jNV*z8u9JS8*MJQDpTne2Bc>ek1Z120&HZ0(gWx2 zoz}{TTTKJbW!Nq?vf3jJ(OFFn>vbUyJI(O@KfxF_}3Qn6gN{tC1F)QUX{T`N98cV zRV{{Q@7x#&&~j>M+o{xhNP+7>N5@CCF{r-2y7X^e(-j?HBUZQ=(SF~&VBn)*rI45p zvyWeL{`gtGxpBU$_0I#DhIpo^ZtKD~0 zE;lti6wd*+yRo;om-tPu&K!2&>Oz<2;3wwi zSSHVACLxIyMZzNFQ;lxFhDR7y#EfmfRHH46=u1j0A|&OfB6xB7Z&v`0;sNLJkW`nI zuKp;1Bo)zRhmmnME}Cffd(r`nk7XR zXjcxS5Z@zmM9WRNT9=j>-ePW&yRvj}+p4Fxaq>4?57szIA)jwO_maV)+35*|OKoCX z^cVfUf!>vqTfQ=)sB#Z!K=*Up@b}y|pH%%b=Zjrv__|}K)aUX> z%06y3c^JhJbDrHhS5N*Jt3G$+UgI{U21n0#BO+WMt3ltE?Xt#}t#b%cs(6-G*c&7n zPOJH(3#N5W-72hq^j!GB!ExR+>dS^aJ4h|xP!Q|>o_yM}|MtZ_8s*RWj|+uYEy`tU z3nNn#!_(0S3oWpECF=%;BfUp59;#0wT35g#2ioKkW8zaVQcM}ZUZ}E+qP&V=4w0gKBVY$xpkI9uc1|kq(oH*h( zN4(K24_#q&aWa#d@QVL$yqI-kZP~FLcvxFrUqd zEx%2SlWvhM`*rZdF3)rW5AwC=?q4xZRJPU4=K#F?`f7cZ=z5bnA=@f5qa=8jN=a6+ z*_r8jqo&y;N$F}aL^;eo9j6e7A9+dK1{$Fn`v|W%LVwx1AwGAL@Xq1U8)EP+Rc-3F zD^Kr+M}M5g2d^#%Lwp$N- zP6n3v-qJdf>p&&uDX83DqV=WoN6{NUkmsRmkF_yw?=vn4J7N;sW1L>?)gt~xgaQl` z2eZMI&8jRrf458P5Ih-s97hEPPZmShbjAU)sD8#0I~fpUphK%YV3ejp8i)Qu$O!mC#0&pRuQIcl7;&PR?0W)z_r%WpjeXK_E`7)qO1!aHJMbKU zi69`DxZoIgbg6FI5ZuHi5dk7^iG!mFJ|32qCF8}x!_dc{Yb_4h@?)#t39$(|2{{4K zWYt5L3*7DngZ)yda!M-5p2nTPafiQwpF+h!UgY~9Bwkh%hAFe)jPioi)EEs!wSd9J zj15KG&fMjcNEKxkFOZRspG0Y(NsNO5NzH_G1bM-2Hd%`Ueia&8oO*0bCuEwFeb^-C zqxgV3;x;cB!`{R7XrGzCP8TX5W`>tmcTg!hZR~;!7cx(BMKb@&c?Q!GNluDP;j2v7 zyVxrhRSG#i+)z!fnLF2wnYnX&6)CL4)IZ&aj5F!=*jO1r_()eGY0Grg!n&!AJpIZm zMXLfMi|C7;T67ZlBYdnH!zJbn?la@QyZK$Tq4JS-u5#_8NITR|`KL|Qps0)w5PJk( z%=2G|s|#x5o9ly^C;$CJ|D{fkO)Ivb_EOp+rJ_m9hvh|Lv{@^yxC*J^=_KLf;3C)B zFSny0l}n)6A3F2Yk&f|*_6)-~XgZCoK2@6}FM}Zq({nW~xV2^0r+Y0Wd~MrwX@Vq7 zK;KZ2hD$-6Q2D8z5c&nx#HnF@v=MO;a6_8HfNFG{iMRY#WYebU zW?p^!g!KKNX9LfQvJ7cCL3WMSWvq%_r%USxLJ8TgiAz0;9$5+DO-C#1r1^$woVMUuiFb82aa05P7h9ffW3wH6)Zo;7 zHB%XK*u^s&`0~0u`0V?erlaGp*iEeF>1BY1W^7Z?;TXU8ARoB~E&IK8eX}_3y&cee z4#f|KfO*^C8e5QY-os?57%0u3+Olt268D+$7RspYHXFI>0xb3c-$kc9XvL5eE{;uU+U|6T$+#n_m-UdinN9q;+dv;OlrKp7CFM0RsF@#!86|Uk zZQ%?}nx<9zd7d7|Pa-d2*3g|=L`;f~eh>-iQO;Givi}tq=SsnXjKQJi9awK*tLdTX zSXLh?!MLDRkfw1=I|L9eb;G4$UbaRWxyr3Kh|h<v5boAsE?}E9kV+E9c&wLvC{EXJmCC&ryDcSPD_13^qiotTPpM5 zZVb*wy3OgWuCB7NIazI-FS`P2w6S8rDgc0X`AUL=sLrSGMhyM9kv0O%W)|7jQM&)kN<#_PAPx2$jBl|kk) zva;!5C=-LqfKkt+B>@K|^YI}wNP433nL#yXct$J9r7ww07K%(x=QGsuJsJT%7~_?W zhB0B`YIN<9MUMqo)Qbn|!qPCDFdT&c0k7`UuCUabChF-U2s{W^M8S!4et0@d&-1W$ z`#fIOxKN%y5BEsGZ@b=DCojH55vnrti}dJeZhc)zd{Aip=qR0G4P!xc3i})KQ2)mb z!ZCkQCH*5U;Op$`{OkK5a}o6zm@Fxy6dW3W7xZHQBggn6)+#$e+AzzTMaG1VH?Uf> za@!f}Ip!*WW_jP6@}Df_O2&V1T|BQ~Y%mF34x^zAr>|xP^1bDh;7$Ca_OasUct80y zRE_s9hPq98zf5$r8l=F5pO-FbZ{_&0+KulvhbM!Bed|4V54NBLO-cs)bghq1A{Fk{ zb8~s10KxO%-T8?VVo#6%oDXyNjP`*0_*+PyvARyKO|`A0u05E7{Nx;>lKiHy-aoEi z@&oP#TW?<4M{&BvrIp^Yb+*{eO=6{!+0(eR3A?&2QISDYq0R0%>gODWuK5||sImcF zQD$T2POp~-QwQKbDZReUOljw+$shdy&~WY`6~8#y(Fpm2QVKpg!p{YrpB=1@W4DjL z&Fx6n)TLZGOddDtF&Yxu%Th?w%Wd2SMF*Qst{#kwTEE`kb82%m&ps(uS8$_R!OT-$ z&FnTd$yA<##d1dpb%kpnMC@loqCo|_}BJGrOaV|xr$HrYZ%xNQ`YnhM}urv17xwdt56?o`ZlEoH8D&9$Ihyq(6h2 zl!{Nflz*PlNMHq$E`J#dYNs{L%WLfe^>7xO(U2~`uQJzyCe*E4@NImwa=V4JF8K(j zEH<>kyKs6BY?z{bNgdG=_w(qax>KSjNB3pls1jr_lJ7{V@vo@+Hgq{n5P7^7TG5zd zv{g)B9_43OujEPN2ne;dfm$3q^lNk^gjnnLSjYH7?L+sE`6YtxcyNV@h>dZF3KA#p zv*Tl`fYDvy70S9wNK2mQebD{&(-|3LXGE}+uyrw(e_*K)Ciaevl2R`x^ zX1a^a^e14tr4444xWesohGfjG)MfE_vNs)q+?g-IT%{J?WDH?Xt(1(2za8^q7hL*W46A4Kjx^8T+_W><5;#+PN>DEb&C<+zRjjY;epkv3Dt$+H@VA8#MZAkh? z;>qHgep}s(y?$Rn(1k=ezCRa?WKdOGDSLN8Y;|ik_l?lkDoo0GK}h-Y_ZvOQ!_$8a zu-u84YO?Pr*ux9!d5-atTZQZ!(r=vxvwebY8HUGS5bcDGXkD6A)h_N8Jy0{xEa`G_ z1DvT9g1MEw_>T3eZeQx7(Xnp0zXX^fea{FnhZeLBMZr_bNge zrbhKb)%gMy5~LmdF}5APlEMB&{ZXk(4&5Df3|Y7rMjS>8W+I84=dYoRk2w zSU4C-`@}dsWt#TO6c2yxEfT(nYCF2h;6nMw450dYFrx$`SS&m+ZcCT5wz9i#9yitr z$rp!yBFaWUd?bo2xapu2Dv+*13`Y)@aU5p+2mS!*fcEB7My@WQ$c_C}p>LwdF*C80*Wjirye1`k&kkD=x6-~~Ya-rWWM6gV8ZyT^#-+y&v!B^Is}{=!YE;8z>wb*{RNI^U}WM?{s{9dDIa9s z;6(G@G4fJI(&!M{AFG2DBB+st+T9U84-)wcXdEA_Xb5c8Qx2zfx0+~4-G~yNKjav{ zNkU46EGc?XDpIN;q$Z|6nqycuES!?c)->Kz`$Ld**GHdFFEsq=R~>gnEQAkq_)bPpe9X4vC{o{7&P)O&2*E6AwH@P zDo1TlTNm)rG>Gu>sTQ}ONn#;l@$WaKTnIekBXu`ZSG%?lXH*+{@?@qhkc+cju&x#bj6H#ysM-FUKVV?Ep8mu7h0KX>Wq zgGT%MPoBg&loqowNou=y^+geNf0T?Bqb8rg+9cOx-J52WLiS&#{K*v*KPvuESL{!y z0c3-l%TF2roVX<_-)j7=CZXSl`pf16@AgGQ`n!42UavewK9hgOUChi{>9|<;A?KAR zc)=`Sa@hxpUc9)^j<V#0J%qDAxuca>hXK-21CQvI12--04J8NzT+%Un?lYe}gD${X4u zqggpF7G_jTw#rWWN%z!JkoGH3{duuvVBEU>Ng=+@U@wjViq&s1xHPNMS=e-6K zxLlen$caxmO@3W+>yg^ z!Bk7Vmcdi{3`4>>bCWANm7i>$TGhuvyYP{u(P9hP0BaaC#5jM(c7@LU^ZK;TrY2Vs_Kq@pKF#~MWQOFhPlXId_-Ys>xD8@RJ4#WATA>g(QWZ4%kfTF@ zgS}Eazl;#6bdX4y1RXUYFu2she8;ee$&+tkzB^InD^AVXvE$xtK`rVsob4z)D%Cue z#5S&#lM|A*QTrbh>Wu($mWSdt&1q$o5dhEjZ4GoM??+*hA%iMYcsLtuo)pv#jPJ%T znN-lmQn7_zQY^h6XC7%k>J+>!ApG9D2cxV@r;yA!I@Q)6ZE3fnGTkx^el`0h4l~iN zCV6pAGQ#qxvfOm^>-Rx{&FTKwh#^UR@y{=Vw3+k!n9Zk$gEA_LbmVH>?OnszK{7Si zWptfIX{4R`kv7ebnQ2@q4Y{flDpB+K`3Avh(a!IBVb)Ij*@aDjhU&Dfl?jfCK0Ek1w>$b$0kL`_Dr}T4xs%qXnx&;NZvAYSd&By_ER zTVuQVvQ3iqVvmqNci6vhem=S4D6>ogcPlGbCCpgb=&2(P0D8ke7_FPpZrSxjr@SmH zY9uS$CRgxF+D>emSbmv@8kOYCv~>+JN881(VbZ$!bcGYNJ>!{_|qz)*NxC zp%^a_;d$}$T!CjmPZ!%XxL9VBCH-AaPL8l!MzVD{t0+U*rnACV$D(AnHiwGpnL-P- zz#82~a49vKFnIf9!XyJ|W|$T|(026?n2QMn_c*WgC!5p~krDgq8N;JeI7)#Ina zDPyolc$YgmCceADWvN}L`^bk`HbS}2M zlYgsU`KI7K%pg;v>>**cBh`>Bv?!9Ad`LP-^IeSXXJ#^_v5~SSECRxyOgkpG2a%w87d{*2#uTM(t%;eevKJFMNd~p&K-BQp2ctE3yO1hik>h+T^1D1O z74l)+#X6803YePk4)ivG|2m(Q`{{U3>>e05)n6g&dRZA68F?eNnC#%=Nk9}D zsdgg5qflFma5o-q6AL&SLeQ+# zb~bVGdMR12IVT19&xTUPSk1}KZ?6CW89&edRV9S%4J%!XUi;7Go?NY;>|`t5%OwDP z>*Dq(cOR$_f$uGdCcP9R zF2M+}xK;|a*&1h98zNw7cJT4+KR~vF& zIrvb|{c`?d7m!DGY%r54hFp%8hg>u;t1uawi+qf=t}IM}{g*xm4EeA{v7Vf{RfVk@ z+X(XRSM?S<^nv%AWS>6fB`+Zljw7M=7J;gH%5HT5Mh-wo`)~$TV?}uVFP#2k@v`i@ zMPEH?VLovj^WcDKulgVqY}A89Z6-7M-OuAZChRs|&!WG}KP?S)=BQ~P5Fkc)AJD6b zZKRf3sy6TyW6~R*vAoJ>hJPC+nm!~X7o`|(Eg*^Wf93p{(NYJQrDk_M+4E;=vvmjb z>`R!Sw3?`c>I6%2vNSF3gY%_a_m8e+uB67fC1XPMT)>X>01du7<%$7B&p@%g?ch04 z3q#oCbSXwx6~%Txs&l$OA~8Qh72DEH3!~%`jIr+D%}Zf0v@)B$Z{f(%^}Q8xr>H1A zEx=7vN18xFGS%dy<$kNvMN&eL9$I(STlYdr;E&;S80Lqwl#4x5fSixTN5U;tj6p7k zMe3emhlZMhPDdl-zGD$iAE8cSP;^@gOg5AfTgUi}d&Ammdb=!Ei#ll}?GDb7Q={aW zE<5yR1@W`(h?%*AOo`)6sa)BKBM^&Yn?gSHMc!<3rM{F?Z*rQ(+8JU@{kB``Z z=W8#qq<6KzPo;UYnk1LDy!nh*^5zYa1_#BbWdwCL*?3-?kh9bA=Cjdpz}T>Gc94C! zBy>F2%a(SuKjRlc{q$-G>9CsP)gkSN|`O&yY-W?5^q^atV&3?Zwh3YRPbmh%^^QAI8 zI;xa-+c^xSet#R z;*=h5I70ge_-lbqM0UZ$3vSzAF(1|guD2JR`nG{zu;F?0GYajpT}kS2AwSRR6^c>9=`r(``seO)heuYi<*-Zkh^Ub z7fTQM1@A_!=Cc9rpzR!YtlCxx=2|&&Pb^OS!^q1{j53sR%d&rn>jt3nUPr6LI~lk% z8$%ya-xsfkba)0=tT1cCH1ANFYPn9T*}Lhfsc_m4+K9+NJ+atgqJ7 z@xFdEE?Rv-=s$8tcr_~mR_^!I3}~3hN9`~3fLEac3Cb6T?YE6PcFo0Vs!M3>@v{XwgxPo99(Wx*8veA>6Seud9buY2hVoI^gf}r1GK&Z+*24 zt4r6GEUt=Sdo8sA>d}y2H!}+2MuM&s~R$h2tJ4vydCjKY#jN4{w&+Cj;t~6%cK5 zfnQ&O()ICIn@w9!0~b`ymDSi<)9QH4%e+vve&nT?Oti}@m7$g$bDDD5TB z)p|Aqh4{J6CI0%SgZje7r;|>*>z>_*=N`dF?I6~F+uXJk2Ps;h(>8jW>-B_?iK}6y z(=(f^{kcn-kSjp-sC0!_y8IiZ^s})(;A-Iv>(S^N{Jm-Br|i?Rri(_uhNhXFNG!G= z;A4L`%&-F9TXn49X#bk}{{JgnrYuLngQ=AKChfVv-3FsH-H*M0zlH2w%8}OeqUs)= z{oA(|!N+duD90zoI7q>xh<2R$aIe~*Aqiclt`3Fi3jdk2nP`1tbhw54TKjz%KoT6rYGy0k@W>4;P2v@*H5TiR_a&ky%S^HT!4N@ZMa5=6v@n)!ydzOH1Gf(7@-KRuPuY2! z&Q@M1o&KfYv6+1_wKC&3_l|i$MArzfYd^c~S0nSs$6d1!!357%QXp%05&l2A>}%BZ zpl|t`qUGH5?1KmX2irBR(Bk(U$A@o3Cyh%d>?Wd8L74DzEGr0`DE2M-4L_A+lpTbw z4F#dQt+z6j7pZD-c$fOe9KFT<`AZ$T(cJPE&z?G4-BFCITMsZWI8b=*vz|_w1oFxj zLR*)OML|RM{%;f_9tmZ?zB(t4OJY+2pZupUH+FySt)Lr6+9o<`Ek&aXQd6nH1;R#a zgxS7MFPca7zFb;GtwN$J8koM+F8p*jVbJ7B6@!R&rzz`M!tz`94 zA@9!P#XMv0{9<$X-KBV(Q^Qxvh(g)#FT-A~$#838W`V`XQ_U^vrya)X(_0>ogY1ngGIHh=!W``?TC`9kqf>wf&Zt;JYhVO z!eH9_wy2#!{Vg>{E>e@5bEcbXla4}7ZG}PA{Xxk9!?IX@o|%F? zN+}DT6-L>%b2|RXC?s{Ddn*o#z61Ax8+J4>++b%gzL{23-m5_8X3F`iQb_c-Y{}Rr zGZx4%K(tB58)`M$wb?b_rvP1aENsmJVMuyuc0LvIa?dj|CGo5_XzTi1fk#?21SJkAT6q{CI*c_wYh<717~W|Dxss52uKtRe(XX z#8e2b26{-_W(P#jJ)cvL8PK=vivv|Ir5NVg;*gGfuntYHk>NhJ*kFincJThB4RN7- z^6!3YBYnuJU9-i#i!3sCnenJbmJjMR-G&T9J@%FQRfaJIO|`*SOIV>c+0u`Iwfo4` z#~0G&^4n^zVcnR<=+nW~#)j{(D3Vr>JA@!@MQhiLHDsz>A`qT+9s>4oAmeCNwCQsH z04R}uvq7t~jlEtF9AA0km2=g@x`1PMUaRBSgTPN;T&7a$0k5l%`s3n3)lah_*JKY6 z+-(Gpkdw26;<@0%Jz!cn+e-+3Sz!SkMm2MF{jC&jvMkp_(gGn4j^4Wqmy2`3xsHGV z{lP_BvPYBuem@>inUs$Jc%$yv%vTv3o1<9BtA-h+z~c=2>Fr}!BtBWn$Ww^ymiEIq z_G#MJRn}EANW;7M+}jC@0=J7N94jYzd_$f2+QhO-%vMiC4BaNlB<{23lQzw5dszQ8 zKa9mEFQdO3GWm7aMF<%FPW9IMqL-P5@(YAjnBPzHteH^^^a9xP&5)DvkOOS~pl^OL zs_H71tpRXcaLoo+UU!8YJMD)2o853=k3POo%|g#`6p6?qfV>Nj)^E|UJUWnHn_arr zoNqUCnu;6v1AA+dy{hS3C9(MMx)ZDBnWB$>B;64@1O9;xd18zPgc=eK7WG^PMu}Js z6MkJ}{C_Vcj^1mK{fBrwzW|cfPMRj6730@`s2gprXHIL{}_^1lD}B+Xc|<(^{EtyZlhh2{G4oPhRvGJdlLU67L?UFp*j z!RLDw^V#+Rf0mK`+g%G5qf44VM#?)X>$RM2rpybh8R zdjrIvnT)KWE{eHHquDO}25uVuQo_i@Psqt+H0BST{Qw1M@A|U&+6M00;Cw^1N8Mzq zOd<)lYmeO*BiA+JPE~cq1Cm4hj|GdEpRcYC&(BQAQLO8iTR(SAzr=#P(goGyX&367 zr&3AV8C0}%wA&XY8CrZBl;q@QP|}(|t;@Z8Y?mEIySjk@r(*4x=oUaObJEsx_GC^J zytx0egBh4jb8QX_T_WuOIpb@21ao>}_x2GT15;H0$~T40q|z5i!rQ>r6U&7Z4M8`R zmv7qauKPdPD7@a@&-9z~Y{{U^y1LAH> z`(6CScG)QSA8*$`Ydjkxlm(y7GbRCE9SQRK`T+Tlm+QMtuTBCzf_EEtp(I|GS@#aa zW~Z(5C%OeLyeyB2=tlClE*z?e!R&{1v(o@3w%o=I18_ONZ_xnam~Ex#p8j%ofsrJC z{og6pV?bnJa9|*E=8KI;?ix__#;W?4mnotEr?P9+#Pp8R)nR3RLNoE75Rh3CzWXj} z9Z)`fq8G8>$W{t!s%v~&IzH#W%f)xTmf+=BTwAxERA=0LzXc>eO} zEB!-R#fBwi*lh}mqZ!}L&&5aSa&9s;0Os1+-J)-$PeUa8dZ^Y#3idhfS6{{8-b9YW3Kk$i`3=;Ghc!cfo8 zwKH2;R#t#vYF(1m%nfNA{+%|qI%vBJupuj%mzjOPc|mxWa!*}$KSctpi?3_{}_ENpMSj(l`B%%#2}DjRYQn!Bj07v*fsb zM&>Oss}hdtx@Eaj3o!T2%j6qOKY2VZU~)3~u4?{{G%QKX(uEbW+K60MID zYARWg23lV<5hODmK+2lTd0{b&c44&3@v2J$H3q&CN6JSk zZU}Q+)7-KKA}iieF-cTn3pXWosvtEvx)Zq(J4LJu2s6x6s}KC?cWa!A)Wtzv%*7!u zV!$O+-hD4Bup?tnN=leWjJWJe{tK~0R0ZgQ^bwExWpOP(XHdP8M?pOH%t@9p%#U8u zY*G3&W-Te`%5^Y&48l(3I(~Mgb1cIw6tuNlya`-W6|rkpV)nr~glg^`I`{{meQQG` z++_n#MLoXC3s0%`Xo;c$DO$OTf?&)UzDhBg>!=J?!eW3}e1eSE%Nc7|03W1P4S+iJd0zR=pYIZm8Q!e`WwB=J@1!^W#i ztkc}h$jU@hRct%6DQ-|}d-D{4OL7XoO+ zGFITt$7iulO0Tb}Ft7ZtS9pk%JTf{pJe}gKD)NdpHnR_`$}Xg<)sK!>SQB#{=v@3# zbq5r11t`4a5s{Q%Tg3ID?xGkctChF!`Pg!!w)c#sN7CB<)pP3Mq158_SSmm+a5b5n z?>^3ELUTIyb^Oz&6s4Fb%fl=j(mFlG5CfQ7jP!J3;Ii+FNr%rSCtd3Tb{lr#URqYP z3J4=B$V59sIxfX4gAQspe#Ez9tAmx*hs~_`0%&a_Dbx!jEo&u0NIh;F^3{pyU;KaH zv-FH+9motS1`<0?zs`y1ecWw6334QNNRGo4d{AdIfUay515V~d4jeN(KQHfM>VXE} zQ<*$ib!R#c-kZN7F26_sxn$s&nYyS$>69ZlRvO7rl`Nj~`ovF~?TYP?8%YcVoR2rT zRv{DwSJenxSP>p@Xt&gOxJu%oCUsxXL}XgVy{fHv11*45lPd3RZ*T7-HM8d{4cFr9 z=qE``>en%`YV?rz&fZs3<0D(qBwNz)c7dP@!)lgj3ntJaZ-Q>B5w zUDLlGqUDNhe>7U<>}JGtE6FXweH=`oCO-aN2#K1K7JI-efBth6G5p=3koy*hWQgp2 z8p|hf)_7()1_~8P+R&AqqF+$i(9{A)lj2~OJOr>!l00f8B88FEM~#mf_30_l+yVSv+u=r&-o9VGUKhu0}s8y z@lR~@mI9x^kEU>wC>hJHe~G;UE0nI2TDMfSV(t3k>6ZM{$(h5LWELf>3JvbZKc>Fe zOO!35p+XTJiWUC0tC1)sT=3!?th=~iIOigNjS|})rY1_pv~_`2xv{PZh7<-;{;*iA< z;f=LTO|s3ke%IDug1d}6ex(Ey92_i9+m@dl+}R#9w^QA=njMn%e9cVAqmkGd-b+QS zn3;8JzPbd6`lHyZv*gw0%cI@kYoT4G0AgwXwvOwc9yIZ^XVEJW=#h7jb<@*s`90F2 zS>C+L`ec&3tU)muhOfPR4mv*B{JajQ*B#uo+C3i3dhJ~;Uw1t(NE-xGm zHrEI2At%e5FJ}BQoSP?uug=Usfa)#e3SL6j_=B_6`Brtmy8{ChH8k zj^_K9)Wq)g)Hlgm1Nd4pgkzEVR9OP-JwKH$oaDl{(j<8zw|Lcz(|K4F2V3>354nDG zr@gx!P&v-1s2>=kJjxqPG?WSbrA1I%>fsp@cwY5p02LbTSoBe2ZS9%|clFh*=KceG zdnW{c|73DIzFB1FovqlLN0jUc!8`|36Gzi89EKkSG%2J6l=W3ZEzU{aq;C{FRZ@El^>+Zmi{K$|0yTM9xm@H?v0wLZ!KMLR?F@U|iE`p_FSvXU3c_VSU3Sg{L|lC z@v#31mLS{xb85iFWvdWQcC3~GMakk8hvrl$b=f1j$Z<`C1GasTnKlowg}%&pJQAynKc_o$w8 z`l5px7;<+KQqF!adz^=xfcdM3Ro?cvX{KV}-QEIVW!AvM!;b#n3+0sWK)ZBhTDp8X z=cT;06-zeZYACz){o9O;af};vCG~EKOJD6_Lo4Vkx%@cl@&?_?H|cp+Pd$G2#w&5? zk^jC~ao#oIdaBMNpo2?)ndrH+y|F>Eu#m-@1p;>bCeo@?L{ROnmK7HbNQU1g+)N^o zTwf(hlYoW~iywWr*GUQ{5bm0dOODqWq3_!3$7#nB?V#gmxNMN14i~0fRuUW6OvedT z$=Aly@NmivKupK7fA$U>Z=3soiF_cbF_2HjvqJC6$IN^pO?i(!l**)Tg5WOhFqs-W z3N`xg2|8M4A#qmyMT&YDm|BdhZ~&)x%0gqy$Ig_WV+e)jzGW%o(=bW!Vq-IqQoS)O zJzka~2w#=%ORB?(Nhf-`*Js_vXN{oCU_59!5^@K5vY7Y016pj^-O+Knr*XFDq|q63 zyb4@bz_xKX&GS}+kh77z^DAerj|ID@%5N9Cqocz^`PP3jmz4U|;XVc;kR9Ls9sj6s z8G7C0tLWAU7Z|d^6#e>O|CV_+M$o{6YFSd$6)Hs|jskN3O1SP$+D1xR8erp?J-1TY3P(D_^+ub_968pWu7h`5C#e->A&lsHY{?HNg zfPj*$SDtIHf9Bry!^){^ar2bqG8VL!JO><4fBRWqeJa@64yCMoZ@tZ~O5*(Zaz_*; z`AnSbw8*M55hXX4I8)5Uf4#3JSd~QwserHYc5LXtKCl@SJ^wYRq0*u1aBIfc@`dGy z{PiO5H9z;cc5N`*?Bc zvsHKWui!2r(`rflgBPVJtIV^dO$s7SuT|aQYN0CcHpUFv?;Un{Fz)(!>#*z4ANR

    2NbLsSf_U22MBlaef*Z#Rbs=|Xrs>!r4~ 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 Xdls?XUZs#5AmF%aW@B1!d?W7vIy4>W literal 0 HcmV?d00001 diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/mountain.png b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/mountain.png new file mode 100644 index 0000000000000000000000000000000000000000..680f0033ef5ffb3c2b610822342ea6a31defbf61 GIT binary patch literal 399205 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�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

    U%J6BP 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 z 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ⅆRe5i&Wq(^e*V8opVeb(X5+2+ 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

    EWKRG2$4 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 K#@>^#<>;l;?Bl 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

    H%MX)gv-Vmxfkqi|8 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�cZqEz6fD|YA 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 z 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�fZeetavTqOrnACCX#9Mx(eeI4= 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

    })kM-T+U8^qISVJ<6W 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%0DRe-8
    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
    z
    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
  • -kAG{SyxJ~uLlMiN?IOs0h+d8}GFEwWm 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᜸KnqSwE+8sX#GBWvE0N(6JZXM0) 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 V$2*qBD+~f2EAwk+4W_pf{s*F)NGbpT diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse_from_engine_1.png b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse_from_engine_1.png deleted file mode 100644 index dd5cbb6a0b549c72b0e0cbcf65d647863c356e3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256718 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

    2NbLsSf_U22MBlaef*Z#Rbs=|Xrs>!r4~ zwu-Cn5EIO(enAfQGI=K7@P@~@y<}&H?w*S(+$@(hn z4zc+bmfGNKar#<{H$QS(NvnucTPI%jx+(EmbeMKnLeu1V9Tl7QF5v+IeU*=deqh!l zM%`DZrondYmkz)QP>JKk^w0?Svv|9@<}vq2*EK}8>*2()w+VLnC_`dTWouSdoD7Zg|Y`G9u>mGBNpV>*P1?hE0AxTC7rmS^nCU zsVv57D~rq^^nLTQpZx(xBO6;=1j`0(+8W9GFu{rlO12q8lm76-kt{g(NOiBP zJ@|%&X0w}zi;@_)(v6)?>1^D|p;?rdtdsE{49AZK^DLm>>>EL9ua9f3l`RX_+ zr^pRRS4gg!LGy-Yx_=jK9vEruq0HE&0_c;2bluHw6Rl;{!X$d}Xd0BEJke1-CLtE4 zQE|I>CWwD~D`06sF!NMtW!fVoywUL~cIm0oeY)H^>MBNI?RV9cBKx{WGKAC9g{i>|os{42Cvpdcf-$zUu#ooB(49v^(0~%!C zw!4$jh~BnegF)$*8+kIK9=Sw;r1dE&PJ;bKha{qAGrc|Y9hG$ZzCQa9>00WwxJ1gr3N~^k-G0#^kK=DPngk$+iq6hcrBsV z*iA@ZW%=3Z08!KYNo~rBxyX@`9*?r+%^>Wu=uKB7h64qsNDd>b4jsGi6Uho`YIn73PJb}6 z)lWL(rAZ?CO2+bEa|0zE3r1a#Dc+d%)$;KdoZ6Z+x|q)BKa4ejl4^!8kbIPI{nkq# zenLg7AXkrWYjDQaH^bvuIfIAyNVBRDWmQ*gVeYF3Wi-Mdp-<0<4rD<-9Ro&#KFy?6 z0WJ{`zqY%(yY8>Piai~{;jDLZihLs~-d~*Yi3x3AL$K0GV?QiQ5FAPAZ#x-lK!wS% z&8*KRhkk_BTd@VB!lRb!W$G&2|C{2685%Htlp^w7TAl_MeR|G`#y!89GK|i3e{{)K zXRIzoFs-5qM8y{%k|v=sNkognR@r|r)7j8cu1R4eq}aWjnk(GzEAhhu@9*bwXnj~d zes(urViha|;`OC>dF4Vs%pA(iB~GgZN3t<^K4+_;e%+imY1Hqf#bT>#73=sbU5&$o z<<*K-+}%A10|Uno@0icnK_B!b+q``g;J3eh|A}`gy7?GCtK#U!wmBOd-MvtS8v34w z9ktj!*ch7)TtAgBdDInob?Au4IQ{oNHs9&$`BcwYq>bsTXtGWBwIU#A{Ct!$cR05> zd+2$`fT&srOt@6oU|Vcj}XSE|6Y?1Ta`Qd&nA$&idIu$7k>w)Mh9*BYmo=N zdpi)c$zTlRpnB=+_Njb##PPn>@=LNXKiL3H5O$K`W|HNjTK|vteTb!UNQRk%q2#KU z>q@kd{J=&A^bIHM4xjEXh|np_VLENUX;+J;WM+JpFP}Q4*QSu~8I~=0gruZG>D>1Q z0EyJ5KJ+PvR)db8=6dM8l8ROnPS+wv-0RC^NO^2CzOc%_QX)r-lU8N%N$^sOFPb$? zFOrdv)zzscjIXURIg6Dreg|0d0$wt|SFn_c?qe5+_S!ctYsiDCiCaP?Jx6P=N#k3| zfQyfx<-M4H?>D(M6*5$~)P+vWa+j2VORdUV5MS$!4gEYudaNl%v9h(racX6Vcb)w6 z6HMX(Y=E#m2RG46(>%`S)6P-ntMg7ZMw@feC#)C0FFNXrE|#~?7DzWtt6rdQd8wEUHJ)O_kM1lnoGIZn7%<` z86}3pWzwfXDd`f6o1tEExnq~AEu{Hj(%_wb@uI4n+*~{QX9|P|cey1UAvh`7d?v7~ zIhTw)kEA?@L{1|ij5=cHja`W!OB?C@&(>L_b_pQ&IK9uzr;rHct7~?f79lznS8*CP z;WN*M>^reEO5`ui8Hh(zSE2*5R;9KedR#$Jaj>zaXrWRiz1^EPsA`uHZ~J;{zj-j` z9pSQ@uKO_I+wl)ZkjevYc`q&oE}BFd_AKdp%+alzJ!(d+|S1P zJa~lB2rp7}T=?jC9W~9t=Nb3b)xavXnb5%q8ZP*GiSH6d@w%yj1&4Jr5pa8UlMvUE zYKx^Nc~w?0h*$;g?V`3z|aD&>|KHL3Q-=s>Sq= zLYTE@y=XtatUM>Y=)ZSfB}~u)QPoO0T$$@iSH(?{Wi&NgT(dvHQ_4%yj>~q0Sy|U? zRiPhvkb4QzRaPIuwo4EekbKv=LMI)0@!ag8BvnpAP*EpBDuSPmKx>t*2xh&LuSPm{ z{kw3z0+(55&K``vOLlx$KQ2CQdvCQ*ui&G-0xT0>WCrz{dUZ1OJIqzZ#4=U#?Bs0> zLK-$Fv&*S*yez;&Ci~5YjQTe|c`-P3Jdl({8Ob31Iaw)g-CmH*E4g~lK{{cys#cjY z9dME19PoW*0(lUwf{r^Rq4bsZuS>m1zEtCHJ$g8^ZIV32d-^?@{6e-={p{zzjS7v7 zTh1}{mVFo$XY1U!Pgjw=n^ctAKG@=e;EU4{=w{P(-<)9n2Xgllsv()xR~30~!8Gz5 zEykepUyT)wNlNKsa9ZmJCFoXSI9ZTg?uPcO_$Q1eR;ik@!~8l1_%f#M<&CJ1s4f7{ zDPm$mK~|lRUn)}Q%sSzEj7&#TLyprhYdw+iu}V(OA(ile?ZadY!|3?P$A(&N>)*h; z`Wn+Rp%JyabXgeCV=?WYJw*fsoo~$IR$RHJl<=L7Een8w_`x74zvoD*YG-Of9YEZ1 z_{biO=<|JYE)$?rcJd=8v`9EuGLc`XAJL3z8Ay$n)s>kbczZnR^8b% zRZK}Ky5)O)<~f`{tNdjNZ=2TU_an(NQf(szKiP+mML1676+D}Wr)6b~y7~so|2C)< z-I)2V_k%PUa~O+N;Kp7h0d>QYa9PWuy8VQ#U@fr#9a%mWR1Qae)fNV$orvD^hIB<9 zdbDkEd&@IdcWWe>C7MM#^HH9NK!;T@A^f*jsA-6{o?toGm@y6%%mYXh*7(UtV>rZnDm$ zeU`(>VIWCtvx^;27!`3 z$I!udi1?sDb+sDdM5@k1*%efxREf{`95HwN25m#tIbk@9%vh}UVW4_YHZLX5HWQ;@Enn8S_VQ=}!i zYpj%U>)_||Ro-FeN9+G~sWn}rT(3bWLy^rM2!2e%*#V*(_gyxB)LnzQxh>56eK6;$)ySo+bj`FoPgOVP8rOs&g4-ZmjQKfge= z=K6U6%`gnTjbT1}XB*I2o`zGjJnjd0)&N;yKUrDeor;LlN3`D6{YUgHm6^fzpC28} z`-=JIrM38><&*x*rVUc|F@8Saw1jF)BpeZ~D%g6f#i=9kPCASRb$0&vT2htjhDq~Y zcsg`b{rImyxzEDZd4ogxh^=bFzubWbRyiKEGZHD81@CCC%0yNhiKhxF@Q20PD~XW z!Nh_V!d=7_`l3`1DB}u823iONqK&>WhJu^WcDhU6_Fv%fV9inCZ<%+^ZUY)73x4QV z`wqvqCHvw$6u+9Av}^6$AX0&Wq(!RVu$?kMsAhyX-7H^apig$85g|)U*gn9)K=qkA z8Yc0G-sDs^mO@_mYVB^Xs^_zh7V}ErNg@lDIzB`eAEx$dlGk@AnNj#-W)0Xry`Zft z9&C_8bD!%2y@;*C9^>aPKQJ(E20W*%)ZzVHF2* zoxI{ia;!(Ua=E0GuC80KtbSY>=yCcbF#9{almsJ(of!BoPtE|_io)VjpwRqta5cqM#+-SOS4^%>23CAtO;+67ZAe$%|ZTwhgvhvm`^ z7x=3`fnv?DajE=d&1bi-gE?|@SlYqI-?mwbT)P^tXbl(YP5rvqLheNN>^Uq3a5uMd z_oh!h{UMwYLjUdXURkJ<-kr|#6KD;ldO|3_h7|arvy(mqB6ua?jbrBNEB%QE0(AL< z#?}_1`-&qY$KUEDicP@QHsaPRK;Cs^j3PB{Z8faWc3KL8As!5*{|19rH!i~*6O?>&PYilVj4s1Cg zk2I%HpGkpgIa&2}IMGVA^fS4?gJ+Ez*Yw_Fv|BeY7*!1oQ<$3If!~ZDvDn2Z*1~`w z=|Dk?3p)}74Y%4`P@O#*654;t8KA8TC^Tzw*M8OZ4faQGZDLVLjf}Z_Ta&`3)g+9A zlHUz9Y>d#+_rogpZ4{E%YUOFsLT7Yzw_QE4xV`=~=IHkX(j=vNs@9wGTS<47JRvNz zZq4k31|ok27auJK55Mh>I-7UCc$5be_dr@!%*n>URj`^+D867IB1laLK3qmrNv?3~ zZ8KB24i@Eq&~bV#?P*$~l+akj#!I3TL_4z zY@ZDxw|944`7g7ztMznJ4&^IRFX5~!V=ilnZMDVWk0hC)n_ckg7#g$fE^q{y*+L2p zqt@Q;8rx%^oMo1fLc^hnY}8C-^p#Vchn)*`#SIL-T*On#;qxitoPx^q-xyDnCPl^2|)@%(ko19Ik%<04@J);9E~r% z*zlx2S=;S<8Ts#Medjf{T%%DF{pH;M7PuT!$K=I)6Ua3TomWaHgqzO`zc8Lx^$m7m zm)9ShV)$$uY-B*J;v_+cP^VN|3YrA|!bZGT*6ISC8j=J$nYc}Df1w~ETX zH!gpDIv&x*V7v!f2GMGAJwCg?L#Z*{N$Ks}mjg3w5_-?+{=NvdyHrcfF z=%*t+&=O2d-Ud1exr5)3zsf$c_C0n1r~QFy8{B@a^F-m8U2N@;XK8f7m$EPF$X$mJ zOPsdBCBxO6%)2s)lonY%=t|%^gFEgX6LbKbKdP7hGGsLj*Gjk(GWRv(a4X@mnTv_! z%0Sck&*P~9gnIP(zkbM@l`1&FNZwclS{`$JJ`Tj~`l<#er7Px@WdXx&hwU>pmOujS zw&Ci}t{`rD_DR(n(z>qb5InCZgOkBkYGW0`B%GWPgy&VrOV@gn%emic$o`*+IG=Ba zYMFe>T86SNvjwnw0zV5O+V|@vg}J%Fn5n8z25!ndb@cVkj*OzbhDB*UT9pG8zl-cq zTFogEY4ZG?4|I%eUb{Z51MOXYpP4SI$^9kAPS=2)Bu&i^TOG>UC-V6U4%mKhkzjR0x?>ik$VIP<0qoTw-^3W>h1k8(-6>aHSuO@#9SeIb2+3y{dOla~RAG%s;pI>6)=e9~jSxh`^hQH%A0U6Nd{{njD^v zdNdYUyh;j2LNd4llpS`jG;f3^pPrtb&b)op9Sx6;ytsCV#SX+x3SLP@P0b#2XK2OW zQV+9M-iMeZ4n$mh9u$_f@wKAmu%gNC5Bft~EdVa8v(0h`rI7hoNipf(yk8*u6-WPO zUz#Oa>?+-d{XRJvFIEOzhTV(s-;+(dcZ?UUPv^@ugk~tY?0O21Cv*4)KieTu#LiLdq$!ONzBp1`~X$eu$kl%wzoQ6diG}mhW=#* z$$Oz56Lh?`PBPW_tso?9n5L&H6igBkJmK;1I;e6LnhB(AFNYT3;GW9gqGg zC+MLREc+!iSG2pmvrcC-9*$o@G2-M({bpbq18Pku$VNOot!1u(h!=p3xdh~G{@U;{ z_ChRe4J4aBT-n-+F&L&T-Ypp6eG-W{JpbXSD=TR-rbuP}X2_d2{%wM|NuxitXqTG%U`QARM+O$qtM?-38Cr~*<-k4qM zEn%Xg#jF&T zV^>TWGICSYuh7>2=!3?kIMOg=G%{Os0Hy6mHbD?|>|w91)Wcm)yMgD|byO+~hgrep zwL@kjjkQwR!3$UOrDpk1+;K8`obMZotNiE$NhoeCR}J`A`?_PG&Y}ZlNFDuR95WohvG*KxeQ{~9Nw*3Sn*PM;%tX~>PlolxL;|BT3qZO-tjBZ zk$YiFD9a+eSH>lJd=}=Y>eVmE%!kbihp)M}yPNbIwkLDM*Vn(7QP#Wl8yoDUJC;6N z?3l(xbkE0-iUD{tTy?+&-r_SSTe$;yRix*@S=2K7q-C?ol8*R|b!uunLMVSQXhfVg zpk6*LQ9~%%AbL2e#jb&%+|TAI;4=f&cO427&<$&}-#|pZZJ`taSm&u^KH}}-?U1g; zdExG@`j8i;j&{B$=OU?ST3VLJD`!4!{K@PEoru`gK(uS7o5!WVL@;yVGvJ6>X?hvM zdlG}Qvxdgjs6&)&q2p5zUMM4dr=|IQ`=9dTA**Pv@GiUT#1&VS4B+;cl22^^zPOE5 zEih84>ek?cbulHqt9hD+bv)X{<`=pMCb{rtKb~z)r%llN6z;4O{Y|*a`vLyR1R-X7 zT`J7ENhq}S&IkF-1zPeGuJs0QOOt2~@6Rh9OMbVFVMdasFXL1L$S*WV00skvUM=9g zF8-dN@_uwL6V7L;iaw#Xcil3D(V}m(E(%Y3*-qCr&CSpKR3SI`vW-Co)J;mZJNE{E zuXQTo7q&COZ4U2u&a=LR1%>}c->PIjll<^eTv6X9#JtQ;z&HJNsF7rK_Q0pFJW!Ff z_7T1g$A&t2e3FY`GU+k;dLPDDx=<=1r;RbUaY!2U6MdP+<=P;XS>mh}o}lj*#`g2J z6S-boK^`9@_@M9>8^LZuddziGr-l#-E5Q*&C493j(1(P)7Qf;G`bAP+p2${u=$fx6w-bhss8g0^rq)APySm+o^36~ z4|auw1-tF}*p$aKv4v1R5MbJaQ+yncJMB3Ak)S;l2-!Lu%r>ORRD}QiJK)pN%w1g7 zLRYQiXPvfE!5~^QdGJJ!@MCj(;*KG#3ry{T6l@_o(4<(_Ngb|z4xg8)a$(D=KpSXV z`T9*m-Mn}QtFT`R@G+QTIuwvhY3%qE7<)7F4k|J0Oidfl{aA2x@GWUAzk;2<(RVv@;1Cnd=*S--Bsl^uK8h+9}e}XOC;P=+n+2)o+Uwm=s z>8-6T|KfHos{lvo=Yu&G=yGB1$GrEQZRi7$h_@J^l(<5>;N%=YG~|)?G!~D{El>oD z^7+;_2)NwI(@o{bBz@TR?^;Md^I{IuNuGMnY{&Br1X@Mc!Ra3trM7*YM%Sho+mKNy zA3?Ff4-@qtex}3fS;!`znWt7g%p7d=!;C=tA#~g5L;3shKZoGI9(MsguR2z=FH%qE z395&G<8SaEZ*2u4kzU*~vE7kKicY14fha2(TJ68n7?79YzQ&j4mcEbIHs`BKsWF~DF+hDxim(RL zu?M6}@etf3b0srrsqALypASJyG$Dxl(6-u}zA_*@#5hPog@ez`X>!EYK>$N(4)Hk1 zse*t%GS|~&RbdQ9Xl%nDq|^tni^8cAq!K1+T;v$O^6HMs8%VF))yAfZ$`S6lNt76p zBt{mj;ck_fo3bjqDIlND9a)~*P8n(Z_x9aU|E12o+#9~>L2m3+c57jfc_G#VeSG#l zP~tZw*|7l-cDQgSj+i>6RB7QlLhF%{zpI3IDHxjc>3UBD7L0$BgNgtbc%L@Hbw!l_ z^cBDo(189NdagqoV zkEEN?m^W_(*^$OwRT^qyNuL7Du3-+=#j4e)?MDjA<%Cl!SGT ziYd6iXoc8bjNY3vJ&)hRR=+5HZgLqrUdj7D_XeI% zDpWa!AtED@h}MNyes=_fe^hjUKbcn`L21?AF z{0QL(58=`diAErTx*z#j=WR@yI<@|}^QoX(utU|#$xwf);Fl6gP1Yu@dg9e5tMBbV z#>gQ;`M-jtlQ75?9-jP#X~bcq>AN3K7@7ljVm_CeR0m1JSRY{Ks(kOFYd_>dd<&ty z%>7E04>|L&Tp;^5Rka4Pgd;O$$y~H+>zdUj1hBZh#!so2$MeRQMQhOb!e_D?Q#!qh z@sae;R0NtH*Zgj8ul1m>Xq3%&MW?B-l9ubBbku)!U&s<@%MP9~^F1}Tocp=GotX`F z{q^t*WPH=W`W{O(I=ChdQSKmJq$+qy`YmTH>E9|q@q3r22NQ&?_ElWR5%GHHPu!o~~C00-tp|6*HpGHdx!BJ=3fxUfKq#K?t$w z(BoCuLqvTH!xHnn&5!xwkNN!(& z%#y43roo3tisS^HPE@4--5zo#p%YWw!;6hp1Y z4Q12e^eI)iq`%4$hmhsYHh`g{S$fkpDwi|H9pXV#&s2~C;;U&lP99k z%(I1ewcO}6-RKs)hZz`35Ew>qMNT#P2^ho#R-|yJTm0KN}QIJj3ipu@&BBS*uH}Lapjk z#}XKi&`fC-u6nwk`j~4zCFPQ7AEpkRPa)5B{!W?(^-R>TQTZfz+Qcj4`GX17f{2c} zfu`t#4O(h`YO(8;nxFMLjO0yVoshfN6)u(Iy8ZI~aDPLFo;!E_1Ni&kHd~2`!v$4V zX=*_jl~Oro{f=o+pF*?K>8$6XcHd5*s^EeA4Ua)yz#mU0C@nDvAS?yBbE)9I0Io@-7wQo^y;InWe3!MoX3|fwafTYd43^Ybka{$D$R-~EZDQ6!Ro<8i#kzZn1{ z6D~J*ZWTrzEgd5NP>h@3d10#B7U$zrmj%~}B36F$Z37<7!N8bq63C}C(T%w?&WH`6 zV#ysMa;P}iLT7VoF&NDHai*FPjGz-leC{%Bn`1uJEMutE*Whn?$8nX#QL+##^$8-H z{Wkt~=r6Uu_iC(jvqCEM=Z~bUB;msY4x?j?QkAy8OgKbFh$!SiY*{LvqrJf)&mu{3 z+jI(L2Qlsk(b>!c>$Fbf#liVWsG3nRPSFOCeibnG{QH+y8hzYs?nPNwMgq1&uKa@w zml2^c9$lBJBux`4QO~6xLc__>Hx9DZ@)(dxhvV1SBE=b~K$QDXf|+PVT`HoAQ`EC$ zA7o~r6=%UH!u|{^b(syV^B(-?<0%Tj9(_I6<2Vaz)gR&x7kCHD7&TMn#dUubUanSn zTgfsWh9qU&1h_+AX+BpE+1bcyj736SNjcM4+p+>Kn|&Z_$#JzMi^>dEcY6$HoWCNv zeu;3|sz7pBUssc8Pirodh`UaX_w*>)=9aPoWr)YCh?_MN!M|?BtJ%H@%(nP88(u6% zAZ&QCn}bp$*%iQi?{!g@%Z@2Rj(6b%&zMWRq9Qqc7>u=U*>ZYHq8{)I6k%r>mB;Wx zTfIMso3~*k~sCAY2GF?(_>Vxz^1+)Op-}XXb@xUM`_mh7-_(%iELR~!`Ry) zIr4qlxD`{Pv*g%h`%ndLbmsrzL#I*;K&sA$A8yPtk^8K^jK1wrEipizd}l*(+!A&| z`^jR=UWgl-8@`{dn`=pnMy_9mez?0yrSGb?e>Qr{c^`%h4Wjc>+#4VFLo2YIU>FI< zY)LL^LZ>!w7iSh&;=9B5t2K_-DHM9u|-t( z|LqEhF%X)#11xQ#qaj-{Coi2lqtEbPwi`M^n;)sd4y)&8xttKj?6MYu9gr$XW6FTN zos1nh>W>RQe*Vk}T{Sn?(cn8n884mzcI}%L@@}rLs=Pp@9tE)w0e5#WWoSt+n=5C)LRC2Zwo!qk!pf1o}QaNxvp&=!k)0# zvk(gUPG&UD{+0flLJ|j${{7x_J|-$_oc|&1@BVtVUBsrjw=u`4t`q_(Nt%M#!*smR ztr&M+i)?K=z0^18g04d^t>7S{19std93w{lKLt7l(9^C*wSB*zjuk@RI4O;|BO-Tu zU&bq}dJBGE=?fQ@+K%UOd0pk-;qU&uMo!sDCqbp!TQD&T#2JX}i99|T-|;^@pFf?S zzhZt<7(exAcQl{JGv2aa9(fijIJ%Qo+SwI-aWJ=dwlF;%-nlyC9DS{N8Qs+$_3u|a zYiqs`Kj?ksN4XjUFAP3>dt7>sO;cREj$R8GJl|)7Wne&5<)s;o{ejwGF&(J|>r6EE zQWK+>WSg5jp`x;}l$q~DocD5CjRGT-a8p8RS+ce%b({@4DRI;erfo902`Vd0Vu(#i z;xjNv?gu8Jn_KS$k}ZXC@>zx|KNj^}+3XsuC0AN+Euu3|%|Zg+vhw7U-!68|ZiWV- zM^LkqQ{zdA$n)b{uINXdVG8&y*YKq-Y_*pRXtGuqg0nT$U3R1$sz@}f!5(W#SK3m> zq&KNcE*rnWNF|Q`YvZWV(_zdU`XG0A%1{b#c2%1&%zNF@!ov_RfK9TZVWG06kxLPI z?4+5Xf_-VIMI-(aj#&jvW^s|z6}^llOpd&qP(~a;oH=lbi22slNQ@__gy1E>H4&cA z^$Xfk0y$g&(vI<6GcZxlqInuxa}Ux*pDsUDAhhf`Cay90BUVk(A)p>m$w!b^x#Y{N z)NP-7kAO$OZDPJG{6Ki4g;gcyl03>n_v77nUcpk9f*H510`HuIMI|_8@!!JRZ%-vB zG%r7?(-VVIiCMXGv5nV`4VNCPkBm*pwU6AaF=*_ac(}+Me&s>AmWP(Mc_VN)_7@*2 z6W8SMZ&WkAM^;8}Ju1Z`4?ZUg6Ze5Au9)Kin>6E)eXov<_LgA3xui)V6xtj@KkhTT zS-mt*vC+|B`#G?(ay)DO`2)tTKCl1x)6?^P)1IT*#q+M7{k2q(cr|Br=i>anC5=v6 zi=Jn9%&|x6RYOdjgABJp|1LY6RxvHs*^-gR~|4nStPhxntd ziSsp6Qypf`m_OKw^%jBCo%67xUF;!p-{Ww1T=-s({YCxaS;M=Vwg0}qy%;Ea^7LN5Zgl{dI zE!h1B!qH%G?ANa@f~PHhS%HFhy_tg>dQCv$9QVhiuy<}GNY_>}#8~eLB8aU@4f^qf zMHK9-fpO}LM zjV_fR{|n8j^T#C&xt>I%=@u~IHs~{+iMm+7t4}xdiPthUXiX(|G%f974G6>Q3rDJT zo$nfN`nsD~MxE|cfakXv8V#Mv;MN;}aj(UE=b@6k4Uk_RH0}nurg? z(Ufr%wKu7oyxxCB4>B6o`^cH7wp{R~aoeDdd!_%0&G+r@J8F&z3Tu^NL8a?O7wr|qXN$C}<7O8GDp!Xyt(JTp(xS@XMd{=^s zaZoT(l}tuJS1Zci)X2?c!l9Qf&Adst#!L+9vL|KS8y&MVzykzaAm1-;n;cdH zJ_8!<-{bbTAN4%z8`UfMVmmX9KyKQ^GXY;B!^*G5Q>^j0t&PvuADW3Ek5{Kpl>?-U zMmG3__6EW({XF#?8cWrof3J{w{9iaj82{F17hhrX;H(Z!sJZXP) z%bNJjzYDayqqK^uQ&zWHXzvEr;H}1#&T)$b@dP<$OToc*e`~A^2jJK$%z7ANDM0R0 zl>cvOBMOjnijYiBEj5IORbNlOnA-1X<;myK{`Pf$b|vW}fa-{gK521)&Cid|kLJI% zF!Gw@r*t7tmS=+_4@f=dzk7~bkztWN#f-PC4WCy6n|;yqffpAMNHjAa=>8?L4Yuca zu4jK70L#aLt>4-c`G*?UURW-YQE_lT8?qxnF{I&buU0R2GWEi2wE$-f~S0pJ>Sy>)sJKJv z#GoYu@G+l~+qwX9vr#whnB>ygF~=82TJp-Ulg`)u@9S-FSIqu`>U!S%BS^Z( zHH6!GOXSY4*$AA^ch!M!hdO_HZL57`g`K#$4XviBKp!}1-sho!5?NZ`jPZIopicPK zlCk%QA$THX(n1$Z^%TiVttdr0W z_P1ilh#1Q28;eK7&KGm70oz4Y?H?e*xTu|Da-~tBOLL9zy|$CpL1E`duk2!rDRUU_ z{IpObZv>*$Fyi0ZaA=2KLc=CTwX8P>UUSpkeA*1E$k4nDu-CN9cw1RomSD*m##mji zIvo(VxS8g4R(}UtT^Fk9KJhAgdJLGETD92gaf|hHkyv;hJs{eS>-m&QNcm@`0_LFI z?pOP5O{@EqU{3~>p^Osnw(Ny7J(X@SKdw%Ug5m0hb}q@5F>;&Tn{JEgrs03_3muSw zz6}6+CKTiqw#sK-Qa^&fNBxR^oE?sks;dD0sF~Z0MezTW7#$P8XPFm@#=yI%0Va*t zX*6r}r5Qm_p<595ctu}Ehm#RSca4em9{M!$Im>q88 z$DI3*Lu6}Kw1hn2l1di=#V-xKK$@Ict2b${S9Ga4s6{lXbaaA=z^ge|>=2T^@c*o0 z`@k;yPmSBjqIqGFk*5RB(NNokPM{YH(T~2!0KUGxFK-}Es*!+pVF!7bjNEAg*~V&I z3^!kr0D&f{|NU(3*@?X9?+FSI?*`2O=a2_47Gn0de*M}w?b$y|+oxrV`nPl$R(g&F zT!GFWAP=euQ=W@QVXPhymTm>Ir-MRhkoCQo-66I_DdwOP<%?g7K+|`td#B!Xf;hJw zP44Je`Xo6Wa*FNQt=Bhei)=*&n9brw?K z4`D>BU#q(=cT0Sy7PkC6sK|31hqRgXhRG) z;VUa#nJIHqQ}L`qW#AGGGe7fUIxlLWp)ZrDB)$TSxQgzgIO8o1N}n{ZfzZKHfC7 zAS|@?`y-K&hyON?F%HIUM;Pm)m%?W&*w&e9`j77}$AUya%s)ZWeE|5Y7OPX^^Sz-R z7umAa`Bo@WwWK>HQ8gPjQk zqWySD)b(SbK)fDPwj^!n;V}@(d+TD&^jy%;G2l+|9+nJfZ}y81tJS;1k)WhM*=HLs zozJ!oySqA&7ps(+?FA>~KNrPx%lQ_pqKtg0^DD%7ggVErL|DKizzZn}FP~FyH zTjC|@@S>RC$uUun$qT^haCv&Q60yPTlpi|O$oK&@w>F+6<}icRhy#U97pyxV1pOb>KK|Unk2}T~3&li*E+~^)({~aTqhG?0bv3 zyDqgH!9kNhDdr%?zNs#i9^Zah;Xv(S|FJk#-A8v0bDcG95i!tTLX(20b)KCGD22!i zOYv;Nayzu!=y9+tmT*R- zq)79GpB-$@hTi+D)4FCh$$M8oF&3m%ayZx@l-}sy578x$Mc}xfl?wybsl$=23k|M> zDLFe&bUhoe%A?W-et>2=tJOeXkq!iOo<_}qNQ`Jd8@ zvz^n$Gs5)1l%CL|{HPZ7QH5H1JHg~NofKeeKW%*PrJt0ua>zS;tRlh8D7($e+L_j> z;6+%OW{RSQ>9+`0{7XcG+pr|=53?1!HP?GLhR=6L-HF2%ML8*;Y`LpcO!?^C+0zk+ zyBVK3?)3VuXpUsbB`{{-l~y2B8N?HmB{;c8IC}TJpO0tMNaw;+AgOEdj27z z`K^OQL!qloJl1kqysC-Q3ew*RcDsa(j-{(eTsJ?-Vr>p8+{AWzR(u@+(h+g0_YlT1Tt=iyFdDHirL4(Yg3D z_5X2vu1R8Z&zD>(H3@UcB_WrRdt)v`?u6WLDTWeri7xJQFXk?}n~?iuh%whiWD_AR z#Ejqh{R4Y!XXl*H`|^4{U(T(%-kf0vfVh6I;Iz*)E+B%szps*PzH*<>y_#3-1v0{# z5cAypiVj<^f`b0b=!{CDl#qPpLNymZ8{gL%mimmk(?Q7tBItjrmMU6&Jbn} zVxky2Zka-nWe9X)QPQnoWQ?{ju+&2A^@pz}$$^-6k^}I$aQV3QW{KD4`7iQeCQ@+a zi=gaQpM};sX}pBjAlUJ{{8As)0K%5+^Uexbe2p2~Nq)S)cu6sYnv zk6-OX90033uKe3k^9MK#ruprUiTbM{Wr?oeBTxYQVShXH)GBK4{n9Bt%I0t*?1b!B z;E;EQ0vE-q=jYk~^4-bA)KpXmu98OSUsEYo3zY+@>^<8jp*WHeK{5X*Ah*ret-7_f zQ}5-y)Y_H7s&L|8X3_Z?K5`cP4W1GGs44;YuQ#QP2tOi10_u!y3=AIOx5>W3M|+{S z3{~>D(y595YI!TXZx-F_rAmOF)&yHx{$kI*`B7Vw=-Vr5ob;_dC4svyege4<0F~VX zD0h(_L$l&0@vFPr+rOu0YJEcoz-_P$(w0U{3RI%-{Md7+B>OU(b;Z5zZi$!g7+Mx@ zYW}Nspo!A+PJbU#JybNgNjn>IQx*yyMML1POnwII3nW&>j|tnB<+vssP%^mqTwGOZ5Z#(STUr zqos@mqy?E!?H@fmICk?VN`;dy#`p~(CO^P&C!4{Le-zMw!evz4I$AqueKQW{GSy2I zjl08*?lat67%eWx_|Dz*iBgH!t+&#!pjiDE{Etv@vI3;V+ZLe6jK{yZPX7#O9xk%V zvoR8p^SK4DBEt`l@|b38GP_Fr#iw!&pl!d9@;`)&D)z`POf{^1h*2kJ`SBOn%Jks6kTDQzp}a+Wo6iPy>utOF>)drCAJLF1)X}A}Jt!!2tGF9C9V+ddIK!OY#zS z!yJ#ZuH0wSkL8-ZCC2Nd!>aogZ+aK89Ph>z&HfG+^aFkF9JOjPFRY!~P$9=uSf4S7 zUpLkjYv@)l$P<+VL>S?iGs$n2@QmzYiRk`fHu=nOzoNqKm0Z{l1rN8I`!No;Z;jdc z69xJ9zQt&dv79|$#5gAF3d(D?ER2pV%qr1$muHS93PJ9}7$A)DAN5?S@=618C3gVg zQL?y`9wXmq39n3rBf3h7(JQ{^hc=&CYP@;wBr2?8livckv46__3floiSMd&)`M- z+=BP#qDyRV3Zyo5o@_3i0G6)XPXnicWpt18oEGtGgO28}ZLV*vCr`M=*Cf1L-q04B zPq!UTzW{qH5=At^dYVrSm_4d`&zDwuiJJS)Z*0s>7u#AZrgRlJs8GzD)b}>`N;yOD zQ0AGNfWzE=6@H&M`Q1Mlkb#&2+MRbWX8n%9iWa+SEj{aRON&Y|E(AshLm#YM;=;(w zg;J$4tV+HL51e2bTc%I^Z}V3cme_z0DHXS0BFPx+7j?9@Mn*-x!>+%$)v2zqB}IN7 zw^4dh*?9s3b%aOK|4eV9hD{6X==V-vERk{@E~dn9;%Edp`m||OXk{M@^4xZ(Hf&X+CG6cIfsvE}^qXV><6?W>YAFOK~E3=toeqa8DX6LDj;~*+eCJ>z6r~l(yTxzqa1Ia zgGun|X_R<0)1$Lv%G32%GXZ=F&{M2D2GjyR$_vKLb~k-KTL&A@Sc^u#76sen1g)eY zY!tD%NxYl6{0ZR_cXhSo*}STtgDPD2?<5S)I>_V%NdB|c1%V&r3S1G((Aith65>Ao+7KQn7dM=*=Rpzt-xqPSUEkJ0IiDP+b;XSStU1 z_=0u%%ljexYlTWT(~V+Z8jh(~=I4c=uNCVre-_BFehcGuff4II0G>BhO3SrqF-RFd zl(qV!|AV;rtmM*H6lr?zjA&!O^#d8`eWwRv7L>=?hmqfA zn`>+1%l$G!M5N>z9{O4TI69)6p8lzQ_&E~y2;)E-3lqKlY*Mii{deF*@$Z-T51uL) zIU}Q@q6!GOwu?yV17rK16pr187w84>~u)X`8HfN6N%?cDlne)|IxKBd;*OO-*b(mLh)zLUu(gw%rLmCFBjqDza5Mp*G! zG8q-d4FWS2cH;L^*u#{Y=|54QD=d>T*e0$~oS_=V}H{gS$oVRqcxAgDipov1MnxERD zQpRnlo?$8?DHO_oJQWn#8jYtX-6{Ya?~5ObAgFL&XRO4gp@`G2*Je}u_cs;4!L}1c z21=WKNpA;xxRIU86;>AcK|Pxfa^?D(do=p?W-WlP{WA*0hr9`@S|El;{Td+o78szS zaH+%3vut#o65*dO*v z_Mz7K=>D;}_UEx;Lgs(QY$zXG-Jw+=g*gGxa!eR=cm1{Mv~d2*-5H|S&bjTYy~xOA zdaV!}3!-Wy+054A@9}H9-YD*t#`jq>Bba`h1%t!a*M{*MLvhL1&bfS-kGI1Lo*hz) z*DB5lx&wF7;+<6KQ%QeYX_jdRHhQF;_&^u_-H|T5WbuH%X49+R6#F(|Fiy+WKt^vC zj6l$T?5?I6CKK>k%hJ-q+Mp@8wXRk));VU;^z?}8Yaay=VGe&xyesuKzdt|&1k8RT zyjGd182};7x* z9BS5pp?`3PhD&trRnTKxli)?#dnh|G)F%w}tyHnsdNQrr%}j~-oL#{LM(H*P7K*Fe zsa;yy-rmvpxBkxWbOQ_8Kcf4TUBd>`_et-M9@w+EJmSAA&3{hY!a|yvpWRT?$QWU> zaAUroRr&n?rPd0jNoxjr+=fv2WW$^<+gG9C?jSvNX3?Ow&%i;7vzN6h{=2>+vG${# zC*69bzcx4Q6_x#5+2_}ukO0o=X6?7rzEqSKSVs1A)gx83S|B9q zX2j;Z)Nh@iQ{J7dP#ydMCmqm`-uWo#GW7mqRh#d^6foUP74UhcE|U0RSmsrE)n0j; zig7wu2*IW}tr*twc)`Q;BEjgc&b0)4e^(znt?zamssEhys5 zZB?8szo2yf+Z{(ym4Oo;>eoyeaian0J`HSFWBgD@!8o6V((~!#_?`gaxQR1%H5)Sy zof+_#%PyK0Ns{}t9(z0AoBX#afl*nYB3=`i&zNk$ulS;Yinqhs%6w<{g_O{YT$h=HDM}jHML1XuPbp3j6BWqs$=9V)Kc{@BfJOl+m z6`XN%fb#oBCModqdYjr*I`uBZgvJEV?}vF@mx8{6dN3M5u>cHzxR2#3i+N%Qf~oM% z>T{Op0O6dreIi%Sqw3vnqM=tWTT2UkU}MEvvk!oue*_gHD%p{-RS15GGzmRwGW;6# zAPYuRmAOKBEFDf6oXh&gOEfd+*tJeLh+B)qc7HPMZh z3>M-1S{ZQXWTK$%)ZrG3n3#Dkn`l+LM6}9_;VYC0mQ88C32qms&nH~!E2@IO5;lPYZxG2CtREoF|E&2r4jBh!F@8Q=HGrwY}j)TB3DDN6dWnjOJRTLtBHeY2dc4xN-Qrrwf)BhDxO5TDobSO{90S26m+qMZfLUzrW9X2BR{ z&$N!Qm=sHeutCX+R~&9Zs|+?rg}(UnGsqDwzLW<+-DQvlPhIFbl_Okd=m-pY{AFRB1QMqa?$%CUKh=VrhW=rze>4*NY}9dxi=BVB(_vi zXg$99lO{b+f+8K70rqGse{bs(@63@kK&~G2qQDS;mbVlJtR0P{%gS=DMYO;*)@hR?Xv& z*vQ)F80zTZ>h(RcbE9zocM|QratqS0s;7s(cQMXW9Vx({Bw4yUx;dlV99oYoh!b}g zh!30>)uc6=DrEw?Dw(s0p)BE5K`IG{8xYkj9d4&r&V(HtK#e8jINw(u?>>>{=$Wlw z-r7QCO$J1@E$lTb1GCuuM358*h~1HaJNnER2>+IWO#Q&9eyl7Sf&fKRCfPwJfBtxY zn6*H{(T8iI0BpsJR|A8o|2$h`MIt}`jI1SMrUNH@Et5v)HjY;w*FD1NSs=NYEdhPS(`)RsE=zb+VfrE9WTi1R zGZ4h%6(f{QA<5sV2@okUj)~vawz#G}*oq!IGBSXT@wE$I^+>Ka(SnE#JU=}+9Xb6@ zb!cyInbko3K_kw?4G5&I(Zl^J-}ySxN|_Iyiv9hH2=T%_PlImhGUDuEg1<1U8$;i+ zPV*y=_djPvbx3FRlYdTE){X<|uU;;ZXhPZ_ijl^T%CB}g(4%1v3HzD9 z*b`LeLHbS@c5lwT6)CY?2h0;fNyV58L$0t`Ibl;QDoemDL_}L;z7&#in8B{y^YuEK z_x9dZi3*IQ@lP@t=yFIv3Jy+Bc^^i3BE0>rBf`)z<;p&;=kTx(IN^RiZIlX^|H6s= ze*EWnXw~E86-nQmd1O#nn0esiw$PlFpC^TA34LPc@zL~2@W0=y6oE=5NO~IfCo_-% z=pxO)KT+euD`pJzC>0eD$2w~j508Ji3VZ+?UtYPS^jqhuoYER^r`FC+D>7;wV#d-R zF#FhYl{aYEbusiaTZc(&VUd)@s^TJPF-AKp2q1Pj8(j&?2YCvw&h_anGzAE8#oJ#9 zGFtmdxQZwHGegm241M zAQiCuo}K`VkddY)(TL+Bm{T+EKa+t`_n;dtX=2I#u0-CuvucUsGpi2jgf!3+w@P2@dySt?v`Xw;Wyso<%@^jpI*=$h+i7FHHy za1yK^n)1b}e^N2IE=|$6sDeL<1#Hx_9%&Xw|K4If)&CL>_a75fHgRG5A}CcN_O>xj zk0ZO=4sL0-!-QuQ9@BUN&b_kJ%@`}C-H#7=_CR%;i-=R3>d%VbamhO$tU|qn#@jvB zH+M~M)kC|w3rf{je5~t7UhmfbP)OY(BL8z&a)EXm#N{58fz5M#QVJj8h0WyU9GY|) zlmGx1W8np=vI!5jb)fMA)cOAXvs%2ofx{AZ(+n}6c%4`y*EeG%xFHaQ7tz#tl9b1LFt~Kt~W$Xu)tP`T0gQD2xS3+ z#D;&;H?6`BXucDuRf4IprBfZCE}Sj^PEIPj#<_ujKSBoAiDvF@l1@&*WZ;>WT*gY8 zMUfYOMQ?JkzWA(NF+blBRAheu)3e?84(s7Tq099@nc?c$RV*xKyvAL4KU{79DpPP1 z>0br+8}7F-U!fqA!#!Fv(2i_m&^`UX_}s+U70X~M0#yf8OfDqqhf~RojiKtCR;jfd z*`sr%w$fbjk%;MzCgSqXCyxO^@i&0^_o%Ka3>O*oOLZW$ai2Kf?<*@4IzZ~Ay@=vd zcmcyL901zcu&7n#&Q7Es?fX9g&7%oXU{?XKpQv0K$IG@$hrc#fcIQHG^-Xax1!b28 zwk#EG@D7;8SF9+OVsMyI_s!hT9k`RLr|X@O)FXOr)Q;83Sk#}e0*$9gwlBfz#zi#( zTX6QJov>9EiEOw*S%q0R_!>OnC2|iRJ$5X6y_p_|32s{N=3N5wZCl&kr z_u!{#kK%bB+>Z*mb8mTwK!HQUd1eV7`iI#`&&xFq^f(D~doy;maf;ztYL=GT4Qo@e zI;2o**Tj+~4!4*6%-WI^jXj?dH3(Hp?9eo$G$bGei9!)2_GCdoct2dJUld2 zrY!8W;hrAPUbw|^$?#@>%}v0C{+JDc2p8oac^QO?iqb5d41N`~xBtiJNo(uu{s51f z+OL$b=7X@AFj63W_q4g}6iIX&n!H{IwTt~X4Y$1ri0~d{U*k;_V<)Zq7QTwOqQNQ} zd(bZNO7Z=LxywT56-S~a*w25^2%q9Nq)SLFMzTNbWesl}-JeFfUthdLKJI{Z92YPB zYQnr3G99O+(SRB#wDUT!4k1QVtOd5U7-X9BMgIHE5##Guqid`A7mXIrHKhWXIfHbI z4Bks%dH?O8nFH^E#OM#x6%P%64sd>$Sb%*);uxotVB-@qRrFx;AG;GOw%a?gJFLSB`so=H}& z@S7>Hj* zo`W22^a0zm{QPmPha245UXwlqdTC?ABoQO)Q5cv!THk^e>S>@O@HjJV|(Y_`>mw5ESD;!A+9 z)NGDZ%xA*HKdB~TjD=|7ITyE0cREj@j=0ajj$D+}%4(*$`PO25ZahkBKVZGauVx@X zAy`BN`$@Wb8YOr;An%;`-4uz7jFJ0?|NWKw)nxqL?_^H%c3%F&C6c{J=z0^m!`uY6 zM)az#ZfG+iBxTkP1XyKqs~Uy)P9pi39mSR%+40|yn6XT-%TkE$VvaFogs|$e6t+OB z84JnIAUR=h4bt@$telx6byI;F_F21!Pw?U$Pr?s2$b1k@jl9zG4_OkWqhC8aXvaN- z_|w0drx@(2dF4pyPSh@SOBS_PN!a~E**QJlIiW|HH3F+jR7+Ib=|5@e9}@6m=_jNB zFIY+E>1b-yX+hL+-?+x{Pn@Xn@35%j)wPJw7t~gJnbQ***TK#XMJCO2Vx(Oiu#afi zywd~(s-~jfH1i}mfVyd>AaY{upZ_U1aMt%`+_H0g<@F$sAK?3#SF7&LOAzPldzA%I z7hGPuJD_xUoijh7+g$LQ-sZt(>Fg z#<vF^}yiEi-8ayzzoRo*;w3Y=f^RB#p7LrNS_1b<4lAB2fZJ-?;-Pe0{g{f_) zdd$Irr&F`YqC4J8VdtrG5V`E~#G18Qg!V&kpK69^#q%+2I^O41{T+j^AvV-uK{FwP z45W<)P?t(dv5>we<{X%Pk!VoE6cvO;-J2F#^xLvev#N0-u3=*?odSJsnfU z4pJM`H8p!$#jGLUXvFA;?+WN^wGV6FwOGyRYLiWa@;;{iGH#Ju;3QqQyB4|CSkAKfZ9Rlb~htpBgR;B3D=TlrKjTS}oI}KgjYFZsk zmiiN+_N?b?Sdt~H+QYHT`%KY7ydZn!0ubkGkWiN|I-$px$DuR)jRZCqj`rGeI377| z+F|wE8mV3K?XR194oh|^Xp2R+9l5yC2k_F>-Fl5#+{~fVhw^)o1-P-rFGD2ASyliU9^k2AdGNRD!TNx+JWF6J-hLIP``@YkaABY zRuFA7Dy)SOiqMu*c#e+m((lE)TVoHOL|hE(QAwuS+4W5nh^E5+>~Dw_vuSX;+-NKZ zvsl|pm6nX@PguNeNjiJhme9m|W@-DTy{1amAoi|z^8Hcr2s1iz=F)Pz9b4Vz(I<;W ze)vY4uMJu0wYhCjbIoSf1m8Fn+Bb*?l@+rII{RB62D-aLuSir>$1F%i>0W&xUYw3= zWdC5h&;4E%!`ZzM#nf z&zqh7Gh%@+CpY{~s8PqH9Tat=uM!Ado@ow~g%2CguSFz7_aalb32v74qoGVD)#>RS z@yYmt4F2ytm!}trv~I>T+Q^tV@w>rnh{gm=f@&yCGR606YHNk&ZH-78{Qx(*4din% z{tkbLet`+GziY0bqva!{>bm`iEd=T=_hETs+;kwktsOq zBbhxqogRuiM=9Uz=bJ-fWTsL7ew$aGYgN#bknGLHg}0^=_uF+G<-i{WyORWzg&&5h ziWZob5G#9pI1&U&Kk8@vRPAC&puYxjZw{dn&^pJ zvVv|-e0;X0k&cF*YnM*7Dq_065fXQFmDqyBAOJb_=2KojM#^c zwC8M4w|l`K0|+=9Z@rR6qzn713Zojsny{VjMCs4t-S0&^H{&aB1P#*#8IyA4iSY5p z5?=FU#o%gQbI-;qdFgXg9}>#>AAIbpyKme4H1U+d7bUihG8}n z>*dgU2pbP2cgbR}Puldw^U)G7r)M5{HHr;gEgUQA2>+ z0v)Y}hKMcHbes$5`GCqVJU>&A;I2T*Hz+Zb;q;Wk8FWEl1xi zxj_hD=~DG@t*V};t_7;T2Vj?(mIxC$TkwUA!x(EDSo1d~+NwnP+~RmZcG>3aT%8vmnBOCLkGO zU1>)URWI?83t4wCmUTYIAMLWVv;WLrth+TWY$xjJ?#kNit9ohoLc-!6=`iAM5czeG zs2um#-H5;g%4&I&Wu`=he%VGR-L$iyH0e^r$)SfhYnc7KbA7~<(~kRnx{X3 z3y}&uT7IZKE)@OWlOxd+(bJ=)6VuZgYa3qgbYA3IAdgV?n=$H%YgazjA+(X|i1t?~M9*EB~;HU6pzEr{H`iw!?rAqRR5#1F`J zJfZ*I-QB}v$~piHVLR*~Mq>|(r>sg$TTqCfo>o>j$dB?!$Uz2vY)JOMd5uQfzT;&Q ze0~dt(Ps0k&Uzj$pa7F~-)OmTuiJXmjv-Ck2pTBx>Ct(xUdZA$>9LKw^{od`c>>wUK+RMWSjD zo;Pqxz@k|JrYuXw?GDqDA6!6KsW(gh#p(rC>bLx z9zm@y;1ZWLr+EVZG+Txloi(DG<18*2*P}MDd%F9;o4@f_GzF~(} zv?KDGDXi5tqt%w@$k@Me`qCol^OM6ruNZ55SZ&D2E6fJa)*dxy?aS}3goTf)t9IG( zOFDD5n=mqoi-D@u?=qY5oq6BY$P3}b5_UCD=$*8=aa4FvkPm0YJXd7pR)pI4+Mh$r z%&NP2M*765Pv)fiViv8zNK`W-;((sIbo#Gmv#s-}(&3g?vic3597<`mfw5{u(@%B4 zl=9D^33CjnZBq~8F=`Gb10KPH_RJhq^>XNSLKd(s&%|T~Lbn z9Z(&VdH(TT-J4W+=HxJeY7Xtw-Ff&KEzV&NB-9dq%8M4{n^0V4)-VeTxo58GHWPeYHo{UgIvm%lF#IK?j&bgEl;{0A-g(06@=d-;}jcs=BN`|UF zjvO%DEs6N7G0`1tc;rpz;hCA4c+&KA&+2XPEBd;l-hAk~t&fp7<#^@a%7|=dOZZ`h z+5zTxm*xTmF^?{PUk%Sjof6`?L^bli-Oig)KH`X`8nI!FU@XCGZ}t~ZVIf*wn>~A0 zK&s5j_R(4r;4@m(OW}p;4!ewlmLHPU9v|^OFXQO>Xvc35@f3CR?{^*U0}+Y7Z!uAn zf%Fd7(3GVv<~$zQ+ElKE>87)yOS^@u%M`$0j%?1CipQ1Q_ZG^E5XmW9t1)c#NZgV) z4x01r7p&KZcxL|0HAqy&tRFt%CIqaTZwm{HH0Cs9v<;${zj`G=$>1396!)2;mJ7{2 za*SFw{0e6yMXx;#VmhO6*O}ATRf-uMo&2~B`MFz-a8}%Zx$6!7wSVJG#q*}N?mVCk zG=9kjHvtKnyDqnyXlccupJ(^w5^cGexC8ZTO7Tv{RmC(X+z#$l1-XMs+tWDbM~Cu@ z^!a|_#XC7boUy9l9h>3sj=!qd*KnhE4!Rq`s_|fFbS}4wLG_zUA$GP`v_X%m8473f*yB@cFV>~=~ll(KiK!^S(fI9e@zMRz-H(d$)$Gu~UF#{z9_1d0Kl z9pbRUNJfXbnCg;q;BbVtZ*_uH(ZH;D4AjgYQRmfLRV*$BQLV3t=cT4DMMcp6B>j`( zjI1S2y~D7Od%nx1{Kp*1BsTjv4mb-BXr#$uoG3~~B(=KXX?Ek(CpN`bu>RZz%l_Z{ z)BioFt{2`1GKKfn;tzIG1_+^x4>;^i#>dBnC(xP|lU;uZnvX#* z?H(1EROq?ByJa3m#bP}m7nCnST4^m81lNBa_8OIMdhhe*FC(=Dk@jx;zi7XCU zklH5ruMUfzQI->>K54wwn`RH(&cdFZ3&xq@i^;5(7?sJj zK*`dM9o1MO(z9B6B-0_XmE>b+gZ$jl(b^WiyYlymSMkDDi>7eK;in;&>b;1Zo4Boo z@ul9>R888PmEPZo2=v*dj?b;P7X`nX?q~pyF>L^lFh}u&7+Z9n?j3DxZ-;h@JZx{9 zPsa4@p$5N*)YjI<1t_GfPVXT!f1uVG-)C1S@>PFocxtD+AwMu>O#LL*NHiFVAsns- zM4ply|S`$6pS9k-?u=(x50MjRal)vl^u9Km6pf|tCn1o zLI}Z1a+{6+hKmB;cA$o z;ah!1k7_5YQX1>ppKF(FzzvL`K(=66qP`R>hkMGS z?^|126u)oi>p^To8xo(mi;zjMV3NN^zRcIAg;4;j0Tk0cs|2QE2hp022%4Vf+UUZ} zIF|77e(y#2;&=Y8`|4}-aJ3n?jlh58%%xwU7(E&Lg}-wA`@ZyACZZ-@PxOt z*yxb*5+&x@$2ZB*AgQkz#GIP@6a-RR*Z!g|23Ib{!VPg{Eso~!PKqnrlz92LBGr_u z=XD%Pt2nENKn*ywb~b7i{V=!X=P|0Zm9OCeo;JFD-a zw~e;0r?Zz~xkQQKZN^Z0p_{8~iZ=*>E%TI`OWOG|^sk~doVcwNb7Y3pWcyjrHE)Bn zB%`m>MkHfAgRqL3*h8By*Hi8qOWCN*(Nhj+>4A5Orv2v#dl?f-aw zfI`6z(9#G_Q7?17pv(`w^?GH(@+BY%k1B7h^}>ihKS{rQrtN{y`HjSswbVWj_0hv$ z!QNRkgeHIbW+Wkmh7@@b+{)cmnK^!Ji2EB&Ovw&@dUP3f(SoZq$m~ zOF>;0T_dGlzS}-**DmXF=vSYOjuQllaIl#fArf>z(YZmH@owd*rlLmen^fOs+w?GT z7ISl-3Zbl{8YZoSWipJ_6QOHt-|%vkKyb&ofe>4?j-9~jko7Z+#nFf}34xghf9<9>;)<6S%qMi`*olayLpVY3S4QL$h8 z_ME2T`-L8i;uJ4gtY)Psm8bUNi>j6usK6+(hto`!YT;GgSmpzm!&N4J2Frv5gp_Z2 z;X3EHgHpClw7jZEpk!u~xVLTXTk)TaNOE5976ii3zv*F1F|^sR)s}NH6Ln2UgOHir zTcG2Ucu^HOg@9h(pT9;)O}I##VFH1U>KuV}K09@?aqk}DyGbux9fWa2vhv(rO#c4^ zq~;(&U7TN~50p%4o}8rONWM`()CtK~85bXpdiuly8qksOy$QlC4_EQzTz~ayIAt?FvQ2_AeG2PT%HfG;wEm!~#Bq)s1B`$wS z$5D$HQa%cCnR+duQdY)Pcq`|5YtBQTT8VhihbdT>@;%^U?o*ZhnisbA_HKr?;@xDZ z`VDiBL0bH<7b9yHGE_MZ_TO6t9X$1fpMj^_yVD~W+@?U;7b9Kz-a@l7;7&L6uJO}2 z#d}P+(<&=_NFg>EGqp9!JttP307NS4go;v-V0<3Rs=7wHjQ3vN5A28NGVv z;}<#LqS-dn=jR&tNLklZ!Oyot^DLmocy(}kN%}me)iZLLvF`Z^+|)r&7S6X^iCL0a z8;O~$9yS1^4&bS=*4J@a+v>4Ja4v$Rt`_xl!q=O*1crf zT?;+dF;8RbnoiCd=)jQg>y3Vdg0;sIgctcHCT<^muKGS4qD^9El5~|*u)VQ58}wMl zmlHjy(P*HP!V$|RoSpWiNMFZ2kvT=zd)ur}y1%e=vua*AhYb{nb|2e}`KHy_#|sR= zTsR1BjLlBM5dRR?vbn_X!M`;Qyfj8BCDJ-em&|V_$|Q<;#S>FqdY zxfxEvC+So!(Ixs{!gv4Kl>cH=va`jIRg=g{;eSumV9v>PL`$SpMV-bk-7~4({wBH6aX2R%b@Y$0H_FE|QzFql?JMgQ z`=vVJLQAh)e;Rh=Ff8hb>OkL^A<11dWeL8oQ%iP78eVUdXIWYIGFQcPhc=%VMhkMN zBY%KZ$*)V@VtzErxXVn+#ZC38P)|N$;;zJH1tFm?IBO(etU>RP1*zjSdd-f@^9H;E z>{TS{sYZXA;G_D57juUZ-?a#eNwWYX-fKeA=_RZmZIWtgx~lR4j8>&YvWtw)Ig<$!lvWuL%dR38Q&TCBoYeztMj-M=`z+m_6?4JRWJys1wCGsV~~umr?-+ zjZ`n#nJhSMQNkh#kqhxpb2p09)&Ie694yTGLu^uNMSYZ4a8$r1a7G-$I( zQL}zwGc#7aWsMnd-9k7!6P!)*t$CGCwh3i{WW2DktEgF!O557+tHg2bpc0|>OYOXS z@f2VXLE>V3Lfh!`@LSprTaYOQ2qLGF+{b@UdZ<0`8utJ6ec!BI+CG@^(|opYup6Of zX^#!6YvR_?((=@D_4fH%y|&0855s_pY9D{oue*O9N=_>snaU6f^4qw^IymWN0PVkq z053uU3mU@*1Z({84Ki!RGLqs~t>5PfgRFYeF+y^ur`1Nwx&_>qH`d`XU-9Ppz8yyI za`q!R7qi(_)SfImRx)>yzCdI3jo8RSfnfWq9J*Q*>Ja{Hf({ts9;{?j%d4Q|QOv8! zu=XX_N<`=_Pg@ex^QSriAV=+m*ujLY= z(yb3(oQ}(qE8F5`i4X?wps<~zhhFwBC%UesUIu6oShbHg6MlV+ELHsDTiEA=4n~8< zMwtV4%V9g@GmXzz2T-?U42@xLRzmAZ#}PkXt1ye*3uH=F6%Qob1;K#0sY|7^KU-gd zvGSuM;e)ps)8HMa-{W^W==8m$g_F^1&W6>W0j=iG9$e~(`latZm+VA*T?`Cu@kWT( z<@hUM*^7B)Q~Vm|L*c_i=QkBEJY`Ej=lq+e+uvW-jRuug=G{FtR5`Pl{F*6%Pg%i= z$EW5xXnKMn0bEEN*3T-O3hc;j%eth;;v&hx%na|dm{Kg2mKw3!-qG|8`%gEYqS`kb zVx!x2EjRNh;P87jY9eQ2$oq(5PasDj6Mp!aq2RL zL(t@&I5uPO^FLb9-Zbtr+ObjzSxjfbFqzqJlrb=JFyY|((RM^@RZhR~rFh3>=HGv| z$M7#(XZ!6M^|oZ+;Sf`pdQu768KaSgJh zjppGH;p?mWBhG6tSS=n5Nr0-vC>LbTiKs9m_#W8pTo&UCp_cHb6dBHm%nXUukRQ7% zbG|t{w20A1*R{3kjETr=n=`Xlij(ZVh`dBI`lIun-SMt`s~FoAyRF43*kVX($CoIA zT0Y~H4i-fyqW2K!DjYGBds`$A zhtKo&KEU>OBkH8{ly5czDr2#*#?nD^}|pzBTle_#R-h4FaeTSn%4-PuF9u;IPecxS)_D@$v85493phooH&zBQgI4Bf zGQOVJv0koyT1g4{=%uUl_2eun?;}aff~oL$O#xlIxROAK$uu_gY;G@Gvs6w2hazuE zZzQQ!b+%$%wJ%(EXvSDDS|7$z%)accWpWYnc@^&q#4l?+`aU!a6b`apLHafvMRQjl z8H=FWuvM!?5N3k*g>zl8FSBlJmaLgLmOV%I}f)oPPJw;)}d`D6eoSe8-RZB@3JFE&pTv?_a z;YdP}U3({UAkrx>Sib~+ZaKrGhp>y}=`fAH;7f=}Y9nRhSqyh@&=<_5R9&7@{=8znDhW{l9 zUh7#h?0BZ?^QPh}bXiA=g3*yIv<@WxNqh~BLTz)zStOXVp%NO&dcpS17yz$-|5D;MpPmS1$4B#8i{Y*Q%vwDx6P&FFxLxHS&=b4Ys-? zm^VnJ+8GHnSi1CmP*$1fcJ-^lR3sBD{IwrDD~jEmtXV6_zlqI3C4h-*3rxHdAmG$* zg6P_&W!(%%BQPQn++AiiB*pF#fn)Mu6sieW5y{+C_BUHnP5#cGQ<@#FEC&=XdyOAu)xGw(%9%C(| za#%j3FkIS!4ndS(=@s_Zg-Cd8fKSLZ653?|epcSt#;a>42z;Y`*$#R(v1P#9`E~eYg9|O2 z>!UY3n8srfY7g=I)H9eDHf9G#D+=W)(I>{m(aXd05n0|V`#n%QmHftsejE&>+M|0b=F$0)f;YQ`b zV13!>@WUr6J)8CUOM2d@vC)=|uZ^RIZ1-B;DUA=9naxJJbvL@Noao?qGe>YaC7fC{ z)Gmx@_p9}3{wOaY@gm~K&&CaRUJTj5^kC!Gf*lLlHT$ddX5*R|# zALd}znp7g^16l#+_H_CBebc~ZU*@=y$$V1x%a<=%PySa{RaFI(e9$yLS^!cVwjEx= zr=hIBJgvEL7CUsO?IWPaRjz8tVoFr)d^tLIu)dj&Mi{-Jk!6qz6Icz>W}XKF~aR9Fv6@FhVgd`Ji{tokkHq(UuWO+r)iq(-RwUFToH z&aUe$RXPl0r*#XN)eFz7i1-sYZ@+my(mi+VOUvA5?=wS>wfO^X*S^yskRG|g9p!_l z+=@Bgb@*DXb5DP{_CtV2*TLVRt!S<{&sV#9_Y8h{UvL68Q>9UNA0MnW94wXsSrOZN zo0}828pODw5Z}jxP32Oi*;%?}C+%rZ#l-4wtZlx7Bd;ikn5MTz1@IcntH(=8N(9Oy zYb^P8+CS2b;~~P*CKUI1zV2}A6Zy2nB1@OR9Q`08vZj-RU67FRfG#yo3r!{kVBh|G zv09gR0_!JjI=iV+mZYi;)xJFz7i(A9#0FR6j+`+5YIpkcq*C<@?)PWe$4tKMm5@|< zmH!*96AbeMYkFj?suwC8~q^T@kw$1+;!?fuf|@ZGg9QEfmtF}`_5HrKb;sA^^DHK){b z_P>X7mjT2XvZzDE(yf7U7ii-yNlB^2Qh?0Zyy?2n;|M_`0Z9_+hxWO#0{a{|=e;RT(7jSB@=@gv9%Sj<`_#cy&5a&=S_|v9%Mp`G?~5XAAC!y)@Nq2$95xL z8G%oSCbNAt?~s$QwH;Nk-sgN}qxevk)mT(1wVjYNP4LrQQ4NL1XX6*F((sIyuo8pA zZ`P$r5NBzw!IvWY99`4j(>3v$z}H=AKMKARFb^aMvr&pSt1U@6V_)=#&yaQ1C0{nF zaAqNAk9*SIW%i`KM=cCY^7%D(tHe z{(J&#(e0=LOGY!N2_&DiFgPk2=8_v$l6hk+gMktZRadMdu*(<3PEjuuj)+|vvfbmI9xfjOnF_XW_b9MGu(B^@%A74dT=ne^yAMr zqG5FN?ybY^hC?9L((_=?sSDog#<1{nu<8L{>v4Rb8dJNfKMXEQw2Co8Ky+#@w$mF0 zjd+vtNB1Ne*cB!K=nt`TbI{k$E9S!GDyZR1N0#30mRl|K} zv3{uN&>Vb-aeJ&1Hf5g=<+wV4z&w*PIg``LVYz}WnNiH;~8V|U@AEI|DqtHDqmQv6{7MD|aRshhN9W~=k)wuMat{G|=t+^wB?E3Ut z?iY{ zln1G)yLk8FTkZpWd*l)9t1`o&H-kG zE`W6|%@FW7T%C#Do!`H3IAOTkGk@4OZH(&~W(45Wuf?4(E=0MoySlec|Pi zE7?qrD`W{j$RsHtjflwF2d}LQovly_UqMPp>q~t`aFSc?0bN)Eq)>NrOQ}-Oe6u$; zHKp*ex1^aVZY@!IF#cFa&a~*qoC@DvwKEE0Y_?IkVqsL9%47ShK=cY$Q&S)wOQ1lL zSuaWN(CSe6I^}DgzWc=9*r9XFFk}+M?GEZF$qLmKwa;|WUZH5InOP@2BMB|{XGz9Y zYc&GMVwgaf1Qe(UO1c4390j<}GHXh;Hm#!mO-#OoHUuOo?1Z^M z&^<+G6>znT@c}D1uS9)UL!tY-jn#WM#bV!j6{~m+&{TXx2~|>-wB_lY7hoNjgv8VH z(m_UL4!g@GtQJ)>s4V18g&v6RXQAkWbO5J4PWLF34#Rk`4g;?@GzOAGma{Fs)0BAl%HW~18x&1ZVMd`P@ zJQ2V@fA0ONotc@Di;4hzIC;$K77ew+pvS>lK!vZ#I~l8T=?l>j5d`cy(z~=T=qy9W z=m_eLcOI)_9A=V6OV07-iBm%Cbja;#n1GXI)bdtC43c27j$_9)y!{x-fJrqcdZeYN zpOA9XFM&T9(GRRbXj^-=`x9EFRbbRnd3gxh5%woscmQppAhNhk^T2QQW<@c?UE11`(UH`r6T?w z1FQG`+t{fIHt;0SO*1iV^INJ6HpfR(#1wvhCLc!~Bn&x7r^g~oOEY{t{+oSajuJ1l zrZIB9tp4x<2AsPW)EJD*vFp#>Dmgkp;L4UYeJjzo;FMg6$BVF!K|4P_A(HZ$3H^D4 zA~6e>r*r%C?p!g&K5U@8ixqyt9(&!FL6bZ9sTO_7HkFyN^xnQC!t*!Sv|jVR6`A);{c0HU4%r*k{QAVHPexL#*<&sispzzs;(Xh&kOCVg zZmotjD(RWr)}}{^Wrx++;QIc?AfN&16qg(VnIi$MVQuqyyTN4gpRItyw?FI;4z>=* z{3?Umc2m3l;JW6~wJQEKKx1X43cbFs@BA4}KztEeM8p-ar%T!;h=2C8rL z{0`%V>gk~Afn-;|>&J?q-G%*H?zlAC`iIsmgl}yOjAZO~PNkn+>!)6MyS7c`eN*=I z38cMmVm%IS&c@PNLmq6PU+dX<>WVLG?&{-JeT4UBQ(>zk=>z?XtHYVUpUsO@No}&~ znz5+^O)5)x=Vm=Z<;3js>=gcImW)ZCf)x$X!jbW_jU6s@DIEyax0cRmQf;$$Ul%3C(#>1WzbOan(dWM|l-S+<-gz>UHX*q1 z29dDv)oQ%_d@ZmMr?*^Ba8Ni>*}5Dz+db!0nx_>Mf@9AXzJ9KP5D0O6JjoBTDn`kZ zP@zMfk&k+4HLL$KB!X2b=E}cs!LN`_`k2|%N(ksPtqCRbsV}NzmmW|oWrZ_dHTy*b z_M00?9R$v4%AZ`AKZZH(e@S6KKNYXi<2lm+-Pq_GR^UuR)L|Ia&>hC%&2kUtlME_!@ z2C-xZM-4=;&SCw)Hg6I>t*&k#92_hqm14@A$PGot{(B0z z?q9S8ppdS=-;_;+rI1&$CV#varD>xt_--t*xN}j4#Z{eK1b?MPBG6w#W<(zZ8io|> zl&gNgJ~aYMnIs`W-H7}d&R8=wea1gsCRy*Tm=P=&W9B#dJ|og!I=R^NmZ(%4i(Y7x zC;UFEy)~CLwId6CoZmB!wM1zO^xmkXYeUb`doy1`KI$eksl+sXOk<2^Ba`a1bvXJpQzIebU=sxrHJvVhUhwfn7f zpVJi)+I+D%FZx$BS56>I^R8#~gutVQ&T#I>70<}sUrudgC%To7OE85Q7oFTO2+vQ> za+ZyBNQ$ey$g2={l6u~^w$30Sb8?~wOQKI2FXT%iCXx8w(v$}CH{gXt)`kQ4Ge`*_ z_`z8wl=he~&EHB#j52+XNcZILGm!ReY|ubg!#ehD3ZvKeR+SGFr@P ztT=ETK}C<53il7*o_<-Qxjz3q&9KkZyXqhcWF16B{o z3u01}7uVPipD|9b>y>`D2c?>PSsRMXxf>CTrm~$ud(Lq>*qI@QmCYW z!0Di@IBH*uhglh&cH2fqmM=*=@=6S%Ny)=~KA%y)1=6Y_HqY_gICr#?5)&h3JS~gy z(-8YNjAh^!v=Ex=QCmG(!8UFG8Mo(kwjxIP3ec3d@u^e%qip4_g!gl+l`#%b7~-Bj zGP}HzS`%j)dKO#b{BI5HexDQV)#7#7gNQ|fiFmG zbsZSOq7VP91(GB5b9WId^?-j5EerS`E?NsuwrIUM$tPa={Jjvh0FYSd?1A&$`Xc!UkUViRbxr zu=AqY;-%cmJ8D>n&*mU44}aTXKp_jVnL#-CWr&Nn?bausA~uwd&m8~s+IEW?1GeAZ zYmPrj{LSU;P7Q3YZPaEOgJY2%n^pNsKO)wCzvk=%W)(}G1o9S8F~(uee9J?cwG3b4 zea>C|(X8hA)@#3bck28H#5tMzJAgF5#}4$D?0Mef$M8<{q}am^f%^`ogcm< zHL}!|W*W7#D9CpyGNO)NK+QK5n>_tFEvrqFcPO=dD=1Q5?!mS1Yl>4Fa~mH#qxaV~ zj=#oB?p2>!kHDYSG*wr)!G8pi(4zF!%;3{Vri;ByH(v)}=O|p^#itNed+UcV$Lm(z zQl8R#Fwo>Q^yyH(yFh70(i<=)#pv_c?jtVy4WdU8xQ^yip|XO4*ZlCek*P-o@aUt6 z@_Nh2@TdsF`?^-~oj$-m0hlv~a^EoIB+s4bmv#q|UhoouP+_Qa3^N--@Hd*>U{0q% zwX&CfJZE(_f%rSwXUh4Bv2l_FPW_fy9Su6tI72!rdhf$y2BMG7o^4i<9-@wb z$}QN*m~VZX!6nC`rhTwk>v6{pVGwUG1Yzoi5K`0*LB%D-NX54t3m%A6$uo;|2N%X2 z#aY=`nuYnK9;X=Q3R{4A<+C-7w8A}8L-Zilx)JB zdO<7m_BWkh@fWN0&_%W@UhIx_vlj)_XbXp|`|$9<$4Yo4F*5JU)9#m98NeEcmW{Q1 z!JHFU+mc`KHL%^;$q*kVtBIrg3Z2@_0}p@vdt!TLa}_YB?FMxjwm6y<&)pldw!L!p zXo_Gj*42tf!EX#EoHMJH_(q|ZR8OetTVakjL>~y;yZ2+cCs3zIuGA)PHITt#vUU%7 Xdls?XUZs#5AmF%aW@B1!d?W7vIy4>W diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/mountain.png b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/mountain.png deleted file mode 100644 index 680f0033ef5ffb3c2b610822342ea6a31defbf61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 399205 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�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

    U%J6BP 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 z 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ⅆRe5i&Wq(^e*V8opVeb(X5+2+ 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

    EWKRG2$4 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 K#@>^#<>;l;?Bl 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

    H%MX)gv-Vmxfkqi|8 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�cZqEz6fD|YA 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 z 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�fZeetavTqOrnACCX#9Mx(eeI4= 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 diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/prepare_model.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/prepare_model.py deleted file mode 100644 index 5977c186e01..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/prepare_model.py +++ /dev/null @@ -1,337 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -import os -import shutil -from pathlib import Path - -import torch -import onnx -from diffusers import StableDiffusionPipeline -import shlex - - -@torch.no_grad() -def _export_bf16_onnx_model(fp32_model_path, bf16_model_path): - model = onnx.load(fp32_model_path) - bf16_type_list = ['MatMul', 'Gemm', 'Conv'] - bf16_tensor_name_list = [] - for node in model.graph.node: - if node.op_type in bf16_type_list: - for inp in node.input: - bf16_tensor_name_list.append(inp) - import numpy as np - from onnx import TensorProto, numpy_helper - for tensor in model.graph.initializer: - if tensor.name in bf16_tensor_name_list: - - def fp32_to_bf16(fp32_np): - assert (fp32_np.dtype == np.float32) - int32_np = fp32_np.view(dtype=np.int32) - int32_np = int32_np >> 16 - bf16_np = int32_np.astype(np.int16) - return bf16_np - - fp16_data = fp32_to_bf16(numpy_helper.to_array(tensor)) - tensor.raw_data = fp16_data.tobytes() - tensor.data_type = TensorProto.BFLOAT16 - onnx.save(model, bf16_model_path) - - -def prepare_model( - model_name: str, - output_path: Path, - opset: int, - expected_dtype: str, - fake_quant_model_qinit_path: str, - fake_quant_model_qinit_name: str -): - device = 'cpu' - dtype = torch.float32 - output_path = Path(output_path) - pipeline = StableDiffusionPipeline.from_pretrained(model_name, torch_dtype=dtype).to(device) - - # TEXT ENCODER - num_tokens = pipeline.text_encoder.config.max_position_embeddings - text_hidden_size = pipeline.text_encoder.config.hidden_size - text_input = pipeline.tokenizer( - "A sample prompt", - padding="max_length", - max_length=pipeline.tokenizer.model_max_length, - truncation=True, - return_tensors="pt", - ) - - text_encoder = output_path / "text_encoder_fp32" / "model.onnx" - text_encoder.parent.mkdir(parents=True, exist_ok=True) - - torch.onnx.export( - pipeline.text_encoder, - args=(text_input.input_ids.to(device=device, dtype=torch.int32)), - f=text_encoder.as_posix(), - input_names=["input_ids"], - output_names=["last_hidden_state", "pooler_output"], - dynamic_axes={ - "input_ids": { - 0: "batch", - 1: "sequence" - }, - }, - do_constant_folding=True, - opset_version=opset, - ) - - if expected_dtype == 'bf16' or expected_dtype == 'qat_int8': - text_encoder_bf16 = output_path / "text_encoder_bf16" / "model.onnx" - text_encoder_bf16_dir = output_path / "text_encoder_bf16" - if os.path.exists(text_encoder_bf16_dir): - shutil.rmtree(text_encoder_bf16_dir) - os.mkdir(shlex.quote(text_encoder_bf16_dir.as_posix())) - _export_bf16_onnx_model(text_encoder.as_posix(), text_encoder_bf16.as_posix()) - - del pipeline.text_encoder - - # UNET - if expected_dtype == 'qat_int8': - prepare_qat_model(model_name, output_path, fake_quant_model_qinit_path, fake_quant_model_qinit_name) - - unet_in_channels = pipeline.unet.config.in_channels - unet_sample_size = pipeline.unet.config.sample_size - unet_path = output_path / "unet_fp32" / "model.onnx" - unet_path.parent.mkdir(parents=True, exist_ok=True) - torch.onnx.export( - pipeline.unet, - args=( - torch.randn(2, unet_in_channels, unet_sample_size, unet_sample_size).to(device=device, - dtype=dtype), - torch.randn(2).to(device=device, dtype=dtype), - torch.randn(2, num_tokens, text_hidden_size).to(device=device, dtype=dtype), - False, - ), - f=unet_path.as_posix(), - input_names=["sample", "timestep", "encoder_hidden_states", "return_dict"], - output_names=["out_sample"], # has to be different from "sample" for correct tracing - dynamic_axes={ - "sample": { - 0: "batch", - 1: "channels", - 2: "height", - 3: "width" - }, - "timestep": { - 0: "batch" - }, - "encoder_hidden_states": { - 0: "batch", - 1: "sequence" - }, - }, - do_constant_folding=True, - opset_version=opset, - ) - - unet_model_path = str(unet_path.absolute().as_posix()) - - if expected_dtype == 'bf16' or expected_dtype == 'qat_int8': - unet_bf16_model_path = output_path / "unet_bf16" / "model.onnx" - unet_bf16_dir = output_path / "unet_bf16" - if os.path.exists(unet_bf16_dir): - shutil.rmtree(unet_bf16_dir) - os.mkdir(shlex.quote(unet_bf16_dir.as_posix())) - _export_bf16_onnx_model(unet_path.as_posix(), unet_bf16_model_path.as_posix()) - unet_bf16_model = onnx.load(unet_bf16_model_path) - - unet_dir = os.path.dirname(unet_model_path) - unet = onnx.load(unet_model_path) - # clean up existing tensor files - shutil.rmtree(unet_dir) - os.mkdir(shlex.quote(unet_dir)) - # collate external tensor files into one - onnx.save_model( - unet, - unet_model_path, - save_as_external_data=True, - all_tensors_to_one_file=True, - location="weights.pb", - convert_attribute=False, - ) - if expected_dtype == 'bf16' or expected_dtype == 'qat_int8': - unet_bf16_model_path = str(unet_bf16_model_path.absolute().as_posix()) - onnx.save_model( - unet_bf16_model, - unet_bf16_model_path, - save_as_external_data=True, - all_tensors_to_one_file=True, - location="weights.pb", - ) - del pipeline.unet - - # VAE DECODER - vae_decoder = pipeline.vae - vae_latent_channels = vae_decoder.config.latent_channels - # forward only through the decoder part - vae_decoder.forward = pipeline.vae.decode - - vae_decoder_path = output_path / "vae_decoder_fp32" / "model.onnx" - vae_decoder_path.parent.mkdir(parents=True, exist_ok=True) - - torch.onnx.export( - vae_decoder, - args=( - torch.randn(1, vae_latent_channels, unet_sample_size, unet_sample_size).to(device=device, - dtype=dtype), - False, - ), - f=vae_decoder_path.as_posix(), - input_names=["latent_sample", "return_dict"], - output_names=["sample"], - dynamic_axes={ - "latent_sample": { - 0: "batch", - 1: "channels", - 2: "height", - 3: "width" - }, - }, - do_constant_folding=True, - opset_version=opset, - ) - - if expected_dtype == 'bf16' or expected_dtype == 'qat_int8': - vae_decoder_bf16_model = output_path / "vae_decoder_bf16" / "model.onnx" - vae_decoder_bf16_dir = output_path / "vae_decoder_bf16" - if os.path.exists(vae_decoder_bf16_dir): - shutil.rmtree(vae_decoder_bf16_dir) - os.mkdir(shlex.quote(vae_decoder_bf16_dir.as_posix())) - _export_bf16_onnx_model(vae_decoder_path.as_posix(), vae_decoder_bf16_model.as_posix()) - del pipeline.vae - - -def prepare_qat_model( - model_name: str, - output_path: Path, - fake_quant_model_qinit_path: str = "./", - fake_quant_model_qinit_name: str = "fake_quant_model_qinit.pt" -): - device = 'cpu' - output_path = Path(output_path) - pipeline = StableDiffusionPipeline.from_pretrained(model_name).to(device) - unet = pipeline.unet - - from quantization_modules import find_and_replace, convert2quantized_model - find_and_replace(unet) - unet.load_state_dict(torch.load(os.path.join(fake_quant_model_qinit_path, fake_quant_model_qinit_name))) - unet = convert2quantized_model(unet) - unet.eval() - setattr(pipeline, "unet", unet) - - onnx_model_path = output_path / "unet_qat_int8" / "model.onnx" - os.makedirs(os.path.dirname(onnx_model_path), exist_ok=True) - if os.path.exists(os.path.dirname(onnx_model_path)): - def model_wrapper(model_fn): - # export doesn't support a dictionary output, so manually turn it into a tuple - # refer to https://discuss.tvm.apache.org/t/how-to-deal-with-prim-dictconstruct/11978 - def wrapper(*args, **kwargs): - output = model_fn(*args, **kwargs) - if isinstance(output, dict): - return tuple(v for v in output.values() if v is not None) - else: - return output - return wrapper - unet.forward = model_wrapper(unet.forward) - - torch.onnx.export( - unet, - args=( - torch.randn(2, 4, 64, 64).to(device=device,dtype=torch.float32), - torch.randn(2).to(device=device, dtype=torch.float32), - torch.randn(2, 77, 768).to(device=device, dtype=torch.float32), - ), - f=onnx_model_path, - input_names=["sample", "timestep", "encoder_hidden_states"],# "return_dict"], - output_names=["out_sample"], # has to be different from "sample" for correct tracing - dynamic_axes={ - "sample": { - 0: "batch", - 1: "channels", - 2: "height", - 3: "width" - }, - "timestep": { - 0: "batch" - }, - "encoder_hidden_states": { - 0: "batch", - 1: "sequence" - }, - }, - do_constant_folding=True, - opset_version=14, - ) - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--input_model", - type=str, - required=True, - help="Path to the `diffusers` checkpoint to convert (either a local directory or on the Hub).", - ) - parser.add_argument('--pattern_config', - default="./pattern_config", - type=str, - help="The fusion pattern config path for the nerual engine.") - parser.add_argument("--output_path", type=str, required=True, help="Path to the output model.") - parser.add_argument( - "--opset", - default=14, - type=int, - help="The version of the ONNX operator set to use.", - ) - parser.add_argument("--bf16", action="store_true", help="Export the models in `bfloat16` mode") - parser.add_argument("--qat_int8", action="store_true", help="Export the models in `bfloat16` mode") - parser.add_argument( - "--fake_quant_model_qinit_path", - type=str, - default="./", - help="Path to the fake_quant_model_qinit", - ) - parser.add_argument( - "--fake_quant_model_qinit_name", - type=str, - default="fake_quant_model_qinit.pt", - help="Name of the fake_quant_model_qinit", - ) - - args = parser.parse_args() - - expected_dtype = 'fp32' - if args.bf16: - expected_dtype = 'bf16' - elif args.qat_int8: - expected_dtype = 'qat_int8' - - prepare_model( - args.input_model, - args.output_path, - args.opset, - expected_dtype, - args.fake_quant_model_qinit_path, - args.fake_quant_model_qinit_name - ) diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/quantization_modules.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/quantization_modules.py deleted file mode 100644 index c50b20b12b3..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/quantization_modules.py +++ /dev/null @@ -1,146 +0,0 @@ -import torch -import torch.nn.functional as F -from torch.ao.quantization import FakeQuantize, FakeQuantizeBase, default_fake_quant, default_per_channel_weight_fake_quant, default_fused_act_fake_quant, default_fused_per_channel_wt_fake_quant -from torch.ao.nn.quantized import Linear, Conv2d, Quantize -try: - from peft.tuners.lora import Linear as LoRALinear - from peft.utils import transpose - peft_available = True -except: - peft_available = False - -ACT_REDUCE_RANGE = False -WEIGHT_REDUCE_RANGE = False - - -class QuantizedLinear(Linear): - def forward(self, x): - return super().forward( - self.input_quant(x) - ).dequantize() - - -class FakeQuantLinear(torch.nn.Linear): - def __init__(self, module: torch.nn.Linear): - self.__dict__.update(module.__dict__.copy()) - self.add_module('activation_pre_process', default_fake_quant(reduce_range=ACT_REDUCE_RANGE)) - self.add_module('weight_fake_quant', default_per_channel_weight_fake_quant(reduce_range=WEIGHT_REDUCE_RANGE)) - self.add_module('activation_post_process', default_fake_quant(reduce_range=ACT_REDUCE_RANGE)) - self.is_lora_layer = True if peft_available and isinstance(module, LoRALinear) else False - - def forward(self, x): - x = self.activation_pre_process(x) - weight = self.weight - if self.is_lora_layer and not self.disable_adapters and self.r[self.active_adapter] > 0: - lora_weight = transpose( - self.lora_B[self.active_adapter].weight @ self.lora_A[self.active_adapter].weight, - self.fan_in_fan_out, - ) * self.scaling[self.active_adapter] - weight = weight + lora_weight - x = F.linear(x, self.weight_fake_quant(weight), self.bias) - x = self.activation_post_process(x) - return x - - def convert(self): - if self.is_lora_layer and not self.disable_adapters and self.r[self.active_adapter] > 0: - lora_weight = transpose( - self.lora_B[self.active_adapter].weight @ self.lora_A[self.active_adapter].weight, - self.fan_in_fan_out, - ) * self.scaling[self.active_adapter] - self.weight.data += lora_weight.data - module = QuantizedLinear.from_float(self) - input_quant = torch.quantization.QuantStub() - input_quant.add_module('activation_post_process', self.activation_pre_process) - input_quant = Quantize.from_float(input_quant) - module.add_module('input_quant', input_quant) - return module - - -class QuantizedConv2d(Conv2d): - def forward(self, x): - return super().forward( - self.input_quant(x) - ).dequantize() - - -class FakeQuantConv2d(torch.nn.Conv2d): - def __init__(self, module: torch.nn.Conv2d): - self.__dict__.update(module.__dict__.copy()) - self.add_module('activation_pre_process', default_fake_quant(reduce_range=ACT_REDUCE_RANGE)) - self.add_module('weight_fake_quant', default_per_channel_weight_fake_quant(reduce_range=WEIGHT_REDUCE_RANGE)) - self.add_module('activation_post_process', default_fake_quant(reduce_range=ACT_REDUCE_RANGE)) - - def forward(self, x): - x = self.activation_pre_process(x) - x = self._conv_forward(x, self.weight_fake_quant(self.weight), self.bias) - x = self.activation_post_process(x) - return x - - def convert(self): - module = QuantizedConv2d.from_float(self) - input_quant = torch.quantization.QuantStub() - input_quant.add_module('activation_post_process', self.activation_pre_process) - input_quant = Quantize.from_float(input_quant) - module.add_module('input_quant', input_quant) - return module - - -def get_submodules(model, key): - parent = model.get_submodule(".".join(key.split(".")[:-1])) - target_name = key.split(".")[-1] - target = model.get_submodule(key) - return parent, target, target_name - -def find_and_replace(model, fake_quant=True): - assert isinstance(model, torch.nn.Module), "Only support torch Module." - key_list = [key for key, _ in model.named_modules()] - for key in key_list: - try: - parent, target, target_name = get_submodules(model, key) - except: - continue - if fake_quant: - if isinstance(target, torch.nn.Linear): - setattr(parent, target_name, FakeQuantLinear(target)) - elif isinstance(target, torch.nn.Conv2d): - setattr(parent, target_name, FakeQuantConv2d(target)) - else: - if isinstance(target, FakeQuantLinear): - setattr(parent, target_name, target.convert()) - elif isinstance(target, FakeQuantConv2d): - setattr(parent, target_name, target.convert()) - -def convert2quantized_model(model): - model.to(torch.device("cpu")) - find_and_replace(model, fake_quant=False) - return model - -def disable_all_observers(model): - assert isinstance(model, torch.nn.Module), "Only support torch Module." - for name, module in model.named_modules(): - if isinstance(module, FakeQuantizeBase): - module.disable_observer() - -def sync_all_observers(model): - assert isinstance(model, torch.nn.Module), "Only support torch Module." - for name, module in model.named_modules(): - if isinstance(module, FakeQuantize): - _scale, _zero_point = module.calculate_qparams() - _scale, _zero_point = _scale.to(module.scale.device), _zero_point.to(module.zero_point.device) - if module.scale.shape != _scale.shape: - module.scale.resize_(_scale.shape) - module.zero_point.resize_(_zero_point.shape) - module.scale.copy_(_scale) - module.zero_point.copy_(_zero_point) - -def load_int8_model(fp32_model, int8_model_path, fake_quantize_model=False): - find_and_replace(fp32_model) - if fake_quantize_model: - fp32_model.load_state_dict(torch.load(int8_model_path)) - disable_all_observers(fp32_model) - sync_all_observers(fp32_model) - int8_model = convert2quantized_model(fp32_model) - print('Converted to quantized model.') - if not fake_quantize_model: - int8_model.load_state_dict(torch.load(int8_model_path)) - return int8_model \ No newline at end of file diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/requirements.txt b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/requirements.txt deleted file mode 100644 index 7295f511f4f..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/requirements.txt +++ /dev/null @@ -1,12 +0,0 @@ -neural-compressor -transformers -accelerate -datasets >= 1.8.0 -sentencepiece != 0.1.92 -protobuf -torch==2.3.0 -onnx>=1.12 -onnxruntime==1.13.1 -diffusers==0.12.1 -pytorch_fid -optimum \ No newline at end of file diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/run_executor.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/run_executor.py deleted file mode 100644 index dbb7fd99e41..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/run_executor.py +++ /dev/null @@ -1,236 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse - -import diffusion_utils -import torch -import time -from pytorch_fid import fid_score -from diffusers import DPMSolverMultistepScheduler -import os - - -def benchmark(pipe, neural_engine_graph, generator, steps=20): - print('Benchmark start...') - warmup = 4 - total = 8 - total_time = 0 - with torch.no_grad(): - prompt = "a photo of an astronaut riding a horse on mars" - for i in range(total): - start2 = time.time() - pipe(prompt, - engine_graph=neural_engine_graph, - num_inference_steps=steps, - generator=generator).images[0] - end2 = time.time() - if i >= warmup: - total_time += end2 - start2 - print("Total inference latency: ", str(end2 - start2) + "s") - print("Average Latency: ", (total_time) / (total - warmup), "s") - print("Average Throughput: {:.5f} samples/sec".format( - (total - warmup) / (total_time))) - - -def accuracy(pipe, original_pipe, neural_engine_graph, generator): - with torch.no_grad(): - prompt = "a photo of an astronaut riding a horse on mars" - - save_time = time.strftime("_%H_%M_%S") - # Engine - engine_image = pipe(prompt, - engine_graph=neural_engine_graph, - generator=generator).images[0] - engine_image.save("astronaut_rides_horse_from_engine" + save_time + - '.png') - - engine_image_dir = "engine_image" - os.makedirs(engine_image_dir, exist_ok=True) - if os.path.isfile( - os.path.join(engine_image_dir, "astronaut_rides_horse.png")): - os.remove( - os.path.join(engine_image_dir, "astronaut_rides_horse.png")) - engine_image.save(engine_image_dir + "/astronaut_rides_horse.png") - - # Pytorch - pytorch_image = original_pipe(prompt, generator=generator).images[0] - pytorch_image.save("astronaut_rides_horse_from_pytorch" + save_time + - '.png') - - pytorch_image_dir = "pytorch_image" - os.makedirs(pytorch_image_dir, exist_ok=True) - if os.path.isfile( - os.path.join(pytorch_image_dir, "astronaut_rides_horse.png")): - os.remove( - os.path.join(pytorch_image_dir, "astronaut_rides_horse.png")) - pytorch_image.save(pytorch_image_dir + "/astronaut_rides_horse.png") - - fid = fid_score.calculate_fid_given_paths( - (pytorch_image_dir, engine_image_dir), 1, "cpu", 2048, 2) - print("Finally FID score Accuracy: {}".format(fid)) - return fid - - -def executor(pipe, neural_engine_graph, prompt, name, size, generator): - print('Executor start...') - for i in range(size): - save_time = time.strftime("_%H_%M_%S") - image = pipe(prompt, - engine_graph=neural_engine_graph, - generator=generator).images[0] - image.save(name + str(i) + save_time + '.png') - return - - -def parse_args(): - parser = argparse.ArgumentParser() - parser.add_argument( - "--input_model", - default="runwayml/stable-diffusion-v1-5", - type=str, - help= - "Path to pretrained model or model identifier from huggingface.co/models." - ) - parser.add_argument( - "--prompt", - default="a photo of an astronaut riding a horse on mars", - type=str, - help= - "The input of the model, like: 'a photo of an astronaut riding a horse on mars'." - ) - parser.add_argument("--ir_path", - default="./ir", - type=str, - help="Neural engine IR path.") - parser.add_argument("--name", - default="output_image", - type=str, - help="output image name.") - parser.add_argument("--mode", - type=str, - help="Benchmark mode of latency or accuracy.") - parser.add_argument("--seed", type=int, default=666, help="random seed") - parser.add_argument("--steps", - type=int, - default=20, - help="denoising steps") - parser.add_argument("--size", - type=int, - default=1, - help="the number of output images per prompt") - - # for img2img - parser.add_argument("--pipeline", - default="text2img", - type=str, - help="text2img or img2img pipeline.") - parser.add_argument("--prompts", - type=str, - default="Cartoonize the following image", - help="prompts for img2img") - parser.add_argument( - "--image", - type=str, - default= - "https://hf.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png", - help="the original image for the img2img pipeline") - return parser.parse_args() - - -def main(): - args = parse_args() - neural_engine_graph = diffusion_utils.neural_engine_init(args.ir_path) - if args.pipeline == "text2img": - dpm = DPMSolverMultistepScheduler.from_pretrained( - args.input_model, subfolder="scheduler") - pipe = diffusion_utils.StableDiffusionPipeline.from_pretrained( - args.input_model, scheduler=dpm) - pipe.safety_checker = lambda images, clip_input: (images, False) - generator = torch.Generator("cpu").manual_seed(args.seed) - if args.mode == "latency": - benchmark(pipe, neural_engine_graph, generator, args.steps) - return - - if args.mode == "accuracy": - from diffusers import StableDiffusionPipeline - original_pipe = StableDiffusionPipeline.from_pretrained( - args.input_model) - accuracy(pipe, original_pipe, neural_engine_graph, generator) - return - - executor(pipe, neural_engine_graph, args.prompt, args.name, args.size, - generator) - - if args.pipeline == "img2img": - from diffusion_utils_img2img import StableDiffusionImg2ImgPipeline - import requests - from PIL import Image - from io import BytesIO - pipe = StableDiffusionImg2ImgPipeline.from_pretrained(args.input_model) - url = "https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg" - response = requests.get(url) - init_image = Image.open(BytesIO(response.content)).convert("RGB") - init_image = init_image.resize((768, 512)) - - prompt = "A fantasy landscape, trending on artstation" - images = pipe(prompt=prompt, - image=init_image, - engine_graph=neural_engine_graph, - strength=0.75, - guidance_scale=7.5).images - images[0].save("fantasy_landscape.png") - - if args.pipeline == "instruction-tuning-sd": - """ - # officical Example: https://huggingface.co/instruction-tuning-sd/cartoonizer - import torch - from diffusers import StableDiffusionInstructPix2PixPipeline - from diffusers.utils import load_image - - model_id = "instruction-tuning-sd/cartoonizer" - pipeline = StableDiffusionInstructPix2PixPipeline.from_pretrained( - model_id, torch_dtype=torch.float16, use_auth_token=True - ).to("cuda") - - image_path = "https://hf.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png" - image = load_image(image_path) - - image = pipeline("Cartoonize the following image", image=image).images[0] - image.save("image.png") - """ - from ITREX_StableDiffusionInstructPix2PixPipeline import StableDiffusionInstructPix2PixPipeline - from diffusers.utils import load_image - pipeline = StableDiffusionInstructPix2PixPipeline.from_pretrained( - args.input_model, torch_dtype=torch.float32, use_auth_token=True) - - image_path = args.image - image = load_image(image_path) - image = image.resize((512, 512)) - - image = pipeline(args.prompts, - image=image, - engine_graph=neural_engine_graph, - num_inference_steps=args.steps).images[0] - save_time = time.strftime("_%H_%M_%S") - image.save("image" + save_time + '.png') - - return - - -if __name__ == '__main__': - main() diff --git a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py index 15c0929350c..d958c044670 100644 --- a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py +++ b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py @@ -319,12 +319,18 @@ def eval_func(model): accuracy_criterion=accuracy_criterion ) os.makedirs(args.output_dir, exist_ok=True) + model.config.torch_dtype = "int8" + model.config.save_pretrained(args.output_dir) model = fit(model, quantization_config, eval_func=eval_func, calib_func=calibration_func, calib_dataloader=DataLoader(CalibDataset(), batch_size=1), - ) + ) + + weights_file = os.path.join(os.path.abspath( + os.path.expanduser(args.output_dir)), WEIGHTS_NAME) + torch.save(model.quantized_state_dict(), weights_file) setattr(pipe, name, model) logger.info(f"Optimized model {name} saved to: {args.output_dir}.") From b2e0a8da397f00177d4f83b38c37841b4ee8918b Mon Sep 17 00:00:00 2001 From: changwangss Date: Fri, 21 Jun 2024 01:55:43 -0700 Subject: [PATCH 22/22] fix pokeman Signed-off-by: changwangss --- .../pytorch/text-to-image/quantization/ptq/run_diffusion.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py index d958c044670..3f4ace9720d 100644 --- a/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py +++ b/examples/huggingface/pytorch/text-to-image/quantization/ptq/run_diffusion.py @@ -319,8 +319,6 @@ def eval_func(model): accuracy_criterion=accuracy_criterion ) os.makedirs(args.output_dir, exist_ok=True) - model.config.torch_dtype = "int8" - model.config.save_pretrained(args.output_dir) model = fit(model, quantization_config, eval_func=eval_func,

    qEK!`tabj2_Kb&?p>H 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

  • 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 literal 0 HcmV?d00001 diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/prepare_model.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/prepare_model.py new file mode 100644 index 00000000000..5977c186e01 --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/prepare_model.py @@ -0,0 +1,337 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import shutil +from pathlib import Path + +import torch +import onnx +from diffusers import StableDiffusionPipeline +import shlex + + +@torch.no_grad() +def _export_bf16_onnx_model(fp32_model_path, bf16_model_path): + model = onnx.load(fp32_model_path) + bf16_type_list = ['MatMul', 'Gemm', 'Conv'] + bf16_tensor_name_list = [] + for node in model.graph.node: + if node.op_type in bf16_type_list: + for inp in node.input: + bf16_tensor_name_list.append(inp) + import numpy as np + from onnx import TensorProto, numpy_helper + for tensor in model.graph.initializer: + if tensor.name in bf16_tensor_name_list: + + def fp32_to_bf16(fp32_np): + assert (fp32_np.dtype == np.float32) + int32_np = fp32_np.view(dtype=np.int32) + int32_np = int32_np >> 16 + bf16_np = int32_np.astype(np.int16) + return bf16_np + + fp16_data = fp32_to_bf16(numpy_helper.to_array(tensor)) + tensor.raw_data = fp16_data.tobytes() + tensor.data_type = TensorProto.BFLOAT16 + onnx.save(model, bf16_model_path) + + +def prepare_model( + model_name: str, + output_path: Path, + opset: int, + expected_dtype: str, + fake_quant_model_qinit_path: str, + fake_quant_model_qinit_name: str +): + device = 'cpu' + dtype = torch.float32 + output_path = Path(output_path) + pipeline = StableDiffusionPipeline.from_pretrained(model_name, torch_dtype=dtype).to(device) + + # TEXT ENCODER + num_tokens = pipeline.text_encoder.config.max_position_embeddings + text_hidden_size = pipeline.text_encoder.config.hidden_size + text_input = pipeline.tokenizer( + "A sample prompt", + padding="max_length", + max_length=pipeline.tokenizer.model_max_length, + truncation=True, + return_tensors="pt", + ) + + text_encoder = output_path / "text_encoder_fp32" / "model.onnx" + text_encoder.parent.mkdir(parents=True, exist_ok=True) + + torch.onnx.export( + pipeline.text_encoder, + args=(text_input.input_ids.to(device=device, dtype=torch.int32)), + f=text_encoder.as_posix(), + input_names=["input_ids"], + output_names=["last_hidden_state", "pooler_output"], + dynamic_axes={ + "input_ids": { + 0: "batch", + 1: "sequence" + }, + }, + do_constant_folding=True, + opset_version=opset, + ) + + if expected_dtype == 'bf16' or expected_dtype == 'qat_int8': + text_encoder_bf16 = output_path / "text_encoder_bf16" / "model.onnx" + text_encoder_bf16_dir = output_path / "text_encoder_bf16" + if os.path.exists(text_encoder_bf16_dir): + shutil.rmtree(text_encoder_bf16_dir) + os.mkdir(shlex.quote(text_encoder_bf16_dir.as_posix())) + _export_bf16_onnx_model(text_encoder.as_posix(), text_encoder_bf16.as_posix()) + + del pipeline.text_encoder + + # UNET + if expected_dtype == 'qat_int8': + prepare_qat_model(model_name, output_path, fake_quant_model_qinit_path, fake_quant_model_qinit_name) + + unet_in_channels = pipeline.unet.config.in_channels + unet_sample_size = pipeline.unet.config.sample_size + unet_path = output_path / "unet_fp32" / "model.onnx" + unet_path.parent.mkdir(parents=True, exist_ok=True) + torch.onnx.export( + pipeline.unet, + args=( + torch.randn(2, unet_in_channels, unet_sample_size, unet_sample_size).to(device=device, + dtype=dtype), + torch.randn(2).to(device=device, dtype=dtype), + torch.randn(2, num_tokens, text_hidden_size).to(device=device, dtype=dtype), + False, + ), + f=unet_path.as_posix(), + input_names=["sample", "timestep", "encoder_hidden_states", "return_dict"], + output_names=["out_sample"], # has to be different from "sample" for correct tracing + dynamic_axes={ + "sample": { + 0: "batch", + 1: "channels", + 2: "height", + 3: "width" + }, + "timestep": { + 0: "batch" + }, + "encoder_hidden_states": { + 0: "batch", + 1: "sequence" + }, + }, + do_constant_folding=True, + opset_version=opset, + ) + + unet_model_path = str(unet_path.absolute().as_posix()) + + if expected_dtype == 'bf16' or expected_dtype == 'qat_int8': + unet_bf16_model_path = output_path / "unet_bf16" / "model.onnx" + unet_bf16_dir = output_path / "unet_bf16" + if os.path.exists(unet_bf16_dir): + shutil.rmtree(unet_bf16_dir) + os.mkdir(shlex.quote(unet_bf16_dir.as_posix())) + _export_bf16_onnx_model(unet_path.as_posix(), unet_bf16_model_path.as_posix()) + unet_bf16_model = onnx.load(unet_bf16_model_path) + + unet_dir = os.path.dirname(unet_model_path) + unet = onnx.load(unet_model_path) + # clean up existing tensor files + shutil.rmtree(unet_dir) + os.mkdir(shlex.quote(unet_dir)) + # collate external tensor files into one + onnx.save_model( + unet, + unet_model_path, + save_as_external_data=True, + all_tensors_to_one_file=True, + location="weights.pb", + convert_attribute=False, + ) + if expected_dtype == 'bf16' or expected_dtype == 'qat_int8': + unet_bf16_model_path = str(unet_bf16_model_path.absolute().as_posix()) + onnx.save_model( + unet_bf16_model, + unet_bf16_model_path, + save_as_external_data=True, + all_tensors_to_one_file=True, + location="weights.pb", + ) + del pipeline.unet + + # VAE DECODER + vae_decoder = pipeline.vae + vae_latent_channels = vae_decoder.config.latent_channels + # forward only through the decoder part + vae_decoder.forward = pipeline.vae.decode + + vae_decoder_path = output_path / "vae_decoder_fp32" / "model.onnx" + vae_decoder_path.parent.mkdir(parents=True, exist_ok=True) + + torch.onnx.export( + vae_decoder, + args=( + torch.randn(1, vae_latent_channels, unet_sample_size, unet_sample_size).to(device=device, + dtype=dtype), + False, + ), + f=vae_decoder_path.as_posix(), + input_names=["latent_sample", "return_dict"], + output_names=["sample"], + dynamic_axes={ + "latent_sample": { + 0: "batch", + 1: "channels", + 2: "height", + 3: "width" + }, + }, + do_constant_folding=True, + opset_version=opset, + ) + + if expected_dtype == 'bf16' or expected_dtype == 'qat_int8': + vae_decoder_bf16_model = output_path / "vae_decoder_bf16" / "model.onnx" + vae_decoder_bf16_dir = output_path / "vae_decoder_bf16" + if os.path.exists(vae_decoder_bf16_dir): + shutil.rmtree(vae_decoder_bf16_dir) + os.mkdir(shlex.quote(vae_decoder_bf16_dir.as_posix())) + _export_bf16_onnx_model(vae_decoder_path.as_posix(), vae_decoder_bf16_model.as_posix()) + del pipeline.vae + + +def prepare_qat_model( + model_name: str, + output_path: Path, + fake_quant_model_qinit_path: str = "./", + fake_quant_model_qinit_name: str = "fake_quant_model_qinit.pt" +): + device = 'cpu' + output_path = Path(output_path) + pipeline = StableDiffusionPipeline.from_pretrained(model_name).to(device) + unet = pipeline.unet + + from quantization_modules import find_and_replace, convert2quantized_model + find_and_replace(unet) + unet.load_state_dict(torch.load(os.path.join(fake_quant_model_qinit_path, fake_quant_model_qinit_name))) + unet = convert2quantized_model(unet) + unet.eval() + setattr(pipeline, "unet", unet) + + onnx_model_path = output_path / "unet_qat_int8" / "model.onnx" + os.makedirs(os.path.dirname(onnx_model_path), exist_ok=True) + if os.path.exists(os.path.dirname(onnx_model_path)): + def model_wrapper(model_fn): + # export doesn't support a dictionary output, so manually turn it into a tuple + # refer to https://discuss.tvm.apache.org/t/how-to-deal-with-prim-dictconstruct/11978 + def wrapper(*args, **kwargs): + output = model_fn(*args, **kwargs) + if isinstance(output, dict): + return tuple(v for v in output.values() if v is not None) + else: + return output + return wrapper + unet.forward = model_wrapper(unet.forward) + + torch.onnx.export( + unet, + args=( + torch.randn(2, 4, 64, 64).to(device=device,dtype=torch.float32), + torch.randn(2).to(device=device, dtype=torch.float32), + torch.randn(2, 77, 768).to(device=device, dtype=torch.float32), + ), + f=onnx_model_path, + input_names=["sample", "timestep", "encoder_hidden_states"],# "return_dict"], + output_names=["out_sample"], # has to be different from "sample" for correct tracing + dynamic_axes={ + "sample": { + 0: "batch", + 1: "channels", + 2: "height", + 3: "width" + }, + "timestep": { + 0: "batch" + }, + "encoder_hidden_states": { + 0: "batch", + 1: "sequence" + }, + }, + do_constant_folding=True, + opset_version=14, + ) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--input_model", + type=str, + required=True, + help="Path to the `diffusers` checkpoint to convert (either a local directory or on the Hub).", + ) + parser.add_argument('--pattern_config', + default="./pattern_config", + type=str, + help="The fusion pattern config path for the nerual engine.") + parser.add_argument("--output_path", type=str, required=True, help="Path to the output model.") + parser.add_argument( + "--opset", + default=14, + type=int, + help="The version of the ONNX operator set to use.", + ) + parser.add_argument("--bf16", action="store_true", help="Export the models in `bfloat16` mode") + parser.add_argument("--qat_int8", action="store_true", help="Export the models in `bfloat16` mode") + parser.add_argument( + "--fake_quant_model_qinit_path", + type=str, + default="./", + help="Path to the fake_quant_model_qinit", + ) + parser.add_argument( + "--fake_quant_model_qinit_name", + type=str, + default="fake_quant_model_qinit.pt", + help="Name of the fake_quant_model_qinit", + ) + + args = parser.parse_args() + + expected_dtype = 'fp32' + if args.bf16: + expected_dtype = 'bf16' + elif args.qat_int8: + expected_dtype = 'qat_int8' + + prepare_model( + args.input_model, + args.output_path, + args.opset, + expected_dtype, + args.fake_quant_model_qinit_path, + args.fake_quant_model_qinit_name + ) diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/quantization_modules.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/quantization_modules.py new file mode 100644 index 00000000000..c50b20b12b3 --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/quantization_modules.py @@ -0,0 +1,146 @@ +import torch +import torch.nn.functional as F +from torch.ao.quantization import FakeQuantize, FakeQuantizeBase, default_fake_quant, default_per_channel_weight_fake_quant, default_fused_act_fake_quant, default_fused_per_channel_wt_fake_quant +from torch.ao.nn.quantized import Linear, Conv2d, Quantize +try: + from peft.tuners.lora import Linear as LoRALinear + from peft.utils import transpose + peft_available = True +except: + peft_available = False + +ACT_REDUCE_RANGE = False +WEIGHT_REDUCE_RANGE = False + + +class QuantizedLinear(Linear): + def forward(self, x): + return super().forward( + self.input_quant(x) + ).dequantize() + + +class FakeQuantLinear(torch.nn.Linear): + def __init__(self, module: torch.nn.Linear): + self.__dict__.update(module.__dict__.copy()) + self.add_module('activation_pre_process', default_fake_quant(reduce_range=ACT_REDUCE_RANGE)) + self.add_module('weight_fake_quant', default_per_channel_weight_fake_quant(reduce_range=WEIGHT_REDUCE_RANGE)) + self.add_module('activation_post_process', default_fake_quant(reduce_range=ACT_REDUCE_RANGE)) + self.is_lora_layer = True if peft_available and isinstance(module, LoRALinear) else False + + def forward(self, x): + x = self.activation_pre_process(x) + weight = self.weight + if self.is_lora_layer and not self.disable_adapters and self.r[self.active_adapter] > 0: + lora_weight = transpose( + self.lora_B[self.active_adapter].weight @ self.lora_A[self.active_adapter].weight, + self.fan_in_fan_out, + ) * self.scaling[self.active_adapter] + weight = weight + lora_weight + x = F.linear(x, self.weight_fake_quant(weight), self.bias) + x = self.activation_post_process(x) + return x + + def convert(self): + if self.is_lora_layer and not self.disable_adapters and self.r[self.active_adapter] > 0: + lora_weight = transpose( + self.lora_B[self.active_adapter].weight @ self.lora_A[self.active_adapter].weight, + self.fan_in_fan_out, + ) * self.scaling[self.active_adapter] + self.weight.data += lora_weight.data + module = QuantizedLinear.from_float(self) + input_quant = torch.quantization.QuantStub() + input_quant.add_module('activation_post_process', self.activation_pre_process) + input_quant = Quantize.from_float(input_quant) + module.add_module('input_quant', input_quant) + return module + + +class QuantizedConv2d(Conv2d): + def forward(self, x): + return super().forward( + self.input_quant(x) + ).dequantize() + + +class FakeQuantConv2d(torch.nn.Conv2d): + def __init__(self, module: torch.nn.Conv2d): + self.__dict__.update(module.__dict__.copy()) + self.add_module('activation_pre_process', default_fake_quant(reduce_range=ACT_REDUCE_RANGE)) + self.add_module('weight_fake_quant', default_per_channel_weight_fake_quant(reduce_range=WEIGHT_REDUCE_RANGE)) + self.add_module('activation_post_process', default_fake_quant(reduce_range=ACT_REDUCE_RANGE)) + + def forward(self, x): + x = self.activation_pre_process(x) + x = self._conv_forward(x, self.weight_fake_quant(self.weight), self.bias) + x = self.activation_post_process(x) + return x + + def convert(self): + module = QuantizedConv2d.from_float(self) + input_quant = torch.quantization.QuantStub() + input_quant.add_module('activation_post_process', self.activation_pre_process) + input_quant = Quantize.from_float(input_quant) + module.add_module('input_quant', input_quant) + return module + + +def get_submodules(model, key): + parent = model.get_submodule(".".join(key.split(".")[:-1])) + target_name = key.split(".")[-1] + target = model.get_submodule(key) + return parent, target, target_name + +def find_and_replace(model, fake_quant=True): + assert isinstance(model, torch.nn.Module), "Only support torch Module." + key_list = [key for key, _ in model.named_modules()] + for key in key_list: + try: + parent, target, target_name = get_submodules(model, key) + except: + continue + if fake_quant: + if isinstance(target, torch.nn.Linear): + setattr(parent, target_name, FakeQuantLinear(target)) + elif isinstance(target, torch.nn.Conv2d): + setattr(parent, target_name, FakeQuantConv2d(target)) + else: + if isinstance(target, FakeQuantLinear): + setattr(parent, target_name, target.convert()) + elif isinstance(target, FakeQuantConv2d): + setattr(parent, target_name, target.convert()) + +def convert2quantized_model(model): + model.to(torch.device("cpu")) + find_and_replace(model, fake_quant=False) + return model + +def disable_all_observers(model): + assert isinstance(model, torch.nn.Module), "Only support torch Module." + for name, module in model.named_modules(): + if isinstance(module, FakeQuantizeBase): + module.disable_observer() + +def sync_all_observers(model): + assert isinstance(model, torch.nn.Module), "Only support torch Module." + for name, module in model.named_modules(): + if isinstance(module, FakeQuantize): + _scale, _zero_point = module.calculate_qparams() + _scale, _zero_point = _scale.to(module.scale.device), _zero_point.to(module.zero_point.device) + if module.scale.shape != _scale.shape: + module.scale.resize_(_scale.shape) + module.zero_point.resize_(_zero_point.shape) + module.scale.copy_(_scale) + module.zero_point.copy_(_zero_point) + +def load_int8_model(fp32_model, int8_model_path, fake_quantize_model=False): + find_and_replace(fp32_model) + if fake_quantize_model: + fp32_model.load_state_dict(torch.load(int8_model_path)) + disable_all_observers(fp32_model) + sync_all_observers(fp32_model) + int8_model = convert2quantized_model(fp32_model) + print('Converted to quantized model.') + if not fake_quantize_model: + int8_model.load_state_dict(torch.load(int8_model_path)) + return int8_model \ No newline at end of file diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/requirements.txt b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/requirements.txt new file mode 100644 index 00000000000..7295f511f4f --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/requirements.txt @@ -0,0 +1,12 @@ +neural-compressor +transformers +accelerate +datasets >= 1.8.0 +sentencepiece != 0.1.92 +protobuf +torch==2.3.0 +onnx>=1.12 +onnxruntime==1.13.1 +diffusers==0.12.1 +pytorch_fid +optimum \ No newline at end of file diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/run_executor.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/run_executor.py new file mode 100644 index 00000000000..dbb7fd99e41 --- /dev/null +++ b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/run_executor.py @@ -0,0 +1,236 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2023 Intel Corporation +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse + +import diffusion_utils +import torch +import time +from pytorch_fid import fid_score +from diffusers import DPMSolverMultistepScheduler +import os + + +def benchmark(pipe, neural_engine_graph, generator, steps=20): + print('Benchmark start...') + warmup = 4 + total = 8 + total_time = 0 + with torch.no_grad(): + prompt = "a photo of an astronaut riding a horse on mars" + for i in range(total): + start2 = time.time() + pipe(prompt, + engine_graph=neural_engine_graph, + num_inference_steps=steps, + generator=generator).images[0] + end2 = time.time() + if i >= warmup: + total_time += end2 - start2 + print("Total inference latency: ", str(end2 - start2) + "s") + print("Average Latency: ", (total_time) / (total - warmup), "s") + print("Average Throughput: {:.5f} samples/sec".format( + (total - warmup) / (total_time))) + + +def accuracy(pipe, original_pipe, neural_engine_graph, generator): + with torch.no_grad(): + prompt = "a photo of an astronaut riding a horse on mars" + + save_time = time.strftime("_%H_%M_%S") + # Engine + engine_image = pipe(prompt, + engine_graph=neural_engine_graph, + generator=generator).images[0] + engine_image.save("astronaut_rides_horse_from_engine" + save_time + + '.png') + + engine_image_dir = "engine_image" + os.makedirs(engine_image_dir, exist_ok=True) + if os.path.isfile( + os.path.join(engine_image_dir, "astronaut_rides_horse.png")): + os.remove( + os.path.join(engine_image_dir, "astronaut_rides_horse.png")) + engine_image.save(engine_image_dir + "/astronaut_rides_horse.png") + + # Pytorch + pytorch_image = original_pipe(prompt, generator=generator).images[0] + pytorch_image.save("astronaut_rides_horse_from_pytorch" + save_time + + '.png') + + pytorch_image_dir = "pytorch_image" + os.makedirs(pytorch_image_dir, exist_ok=True) + if os.path.isfile( + os.path.join(pytorch_image_dir, "astronaut_rides_horse.png")): + os.remove( + os.path.join(pytorch_image_dir, "astronaut_rides_horse.png")) + pytorch_image.save(pytorch_image_dir + "/astronaut_rides_horse.png") + + fid = fid_score.calculate_fid_given_paths( + (pytorch_image_dir, engine_image_dir), 1, "cpu", 2048, 2) + print("Finally FID score Accuracy: {}".format(fid)) + return fid + + +def executor(pipe, neural_engine_graph, prompt, name, size, generator): + print('Executor start...') + for i in range(size): + save_time = time.strftime("_%H_%M_%S") + image = pipe(prompt, + engine_graph=neural_engine_graph, + generator=generator).images[0] + image.save(name + str(i) + save_time + '.png') + return + + +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument( + "--input_model", + default="runwayml/stable-diffusion-v1-5", + type=str, + help= + "Path to pretrained model or model identifier from huggingface.co/models." + ) + parser.add_argument( + "--prompt", + default="a photo of an astronaut riding a horse on mars", + type=str, + help= + "The input of the model, like: 'a photo of an astronaut riding a horse on mars'." + ) + parser.add_argument("--ir_path", + default="./ir", + type=str, + help="Neural engine IR path.") + parser.add_argument("--name", + default="output_image", + type=str, + help="output image name.") + parser.add_argument("--mode", + type=str, + help="Benchmark mode of latency or accuracy.") + parser.add_argument("--seed", type=int, default=666, help="random seed") + parser.add_argument("--steps", + type=int, + default=20, + help="denoising steps") + parser.add_argument("--size", + type=int, + default=1, + help="the number of output images per prompt") + + # for img2img + parser.add_argument("--pipeline", + default="text2img", + type=str, + help="text2img or img2img pipeline.") + parser.add_argument("--prompts", + type=str, + default="Cartoonize the following image", + help="prompts for img2img") + parser.add_argument( + "--image", + type=str, + default= + "https://hf.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png", + help="the original image for the img2img pipeline") + return parser.parse_args() + + +def main(): + args = parse_args() + neural_engine_graph = diffusion_utils.neural_engine_init(args.ir_path) + if args.pipeline == "text2img": + dpm = DPMSolverMultistepScheduler.from_pretrained( + args.input_model, subfolder="scheduler") + pipe = diffusion_utils.StableDiffusionPipeline.from_pretrained( + args.input_model, scheduler=dpm) + pipe.safety_checker = lambda images, clip_input: (images, False) + generator = torch.Generator("cpu").manual_seed(args.seed) + if args.mode == "latency": + benchmark(pipe, neural_engine_graph, generator, args.steps) + return + + if args.mode == "accuracy": + from diffusers import StableDiffusionPipeline + original_pipe = StableDiffusionPipeline.from_pretrained( + args.input_model) + accuracy(pipe, original_pipe, neural_engine_graph, generator) + return + + executor(pipe, neural_engine_graph, args.prompt, args.name, args.size, + generator) + + if args.pipeline == "img2img": + from diffusion_utils_img2img import StableDiffusionImg2ImgPipeline + import requests + from PIL import Image + from io import BytesIO + pipe = StableDiffusionImg2ImgPipeline.from_pretrained(args.input_model) + url = "https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg" + response = requests.get(url) + init_image = Image.open(BytesIO(response.content)).convert("RGB") + init_image = init_image.resize((768, 512)) + + prompt = "A fantasy landscape, trending on artstation" + images = pipe(prompt=prompt, + image=init_image, + engine_graph=neural_engine_graph, + strength=0.75, + guidance_scale=7.5).images + images[0].save("fantasy_landscape.png") + + if args.pipeline == "instruction-tuning-sd": + """ + # officical Example: https://huggingface.co/instruction-tuning-sd/cartoonizer + import torch + from diffusers import StableDiffusionInstructPix2PixPipeline + from diffusers.utils import load_image + + model_id = "instruction-tuning-sd/cartoonizer" + pipeline = StableDiffusionInstructPix2PixPipeline.from_pretrained( + model_id, torch_dtype=torch.float16, use_auth_token=True + ).to("cuda") + + image_path = "https://hf.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png" + image = load_image(image_path) + + image = pipeline("Cartoonize the following image", image=image).images[0] + image.save("image.png") + """ + from ITREX_StableDiffusionInstructPix2PixPipeline import StableDiffusionInstructPix2PixPipeline + from diffusers.utils import load_image + pipeline = StableDiffusionInstructPix2PixPipeline.from_pretrained( + args.input_model, torch_dtype=torch.float32, use_auth_token=True) + + image_path = args.image + image = load_image(image_path) + image = image.resize((512, 512)) + + image = pipeline(args.prompts, + image=image, + engine_graph=neural_engine_graph, + num_inference_steps=args.steps).images[0] + save_time = time.strftime("_%H_%M_%S") + image.save("image" + save_time + '.png') + + return + + +if __name__ == '__main__': + main() diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_bert_large.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_bert_large.sh index 017b7a2efd3..5c65ca50e0b 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_bert_large.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_bert_large.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_qa.py index 39bb8c074ac..4ce35df134d 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/bert_large/run_qa.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -217,9 +211,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -652,43 +646,25 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - if optim_args.quantization_approach != "qat": - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. - ) - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=200, + metrics=[tune_metric], + ) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: @@ -698,7 +674,7 @@ def compute_metrics(p: EvalPrediction): max_eval_samples = data_args.max_eval_samples \ if data_args.max_eval_samples is not None else len(eval_dataset) eval_samples = min(max_eval_samples, len(eval_dataset)) - samples = eval_samples - (eval_samples % training_args.per_device_eval_batch_size) \ + samples = eval_samples - (eval_samples % batch_size) \ if training_args.dataloader_drop_last else eval_samples logger.info("metrics keys: {}".format(results.keys())) bert_task_acc_keys = ['eval_f1', 'eval_accuracy', 'eval_matthews_correlation', diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_bert_large.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_bert_large.sh index 0d93e12079b..7f3253746ab 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_bert_large.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_bert_large.sh @@ -121,7 +121,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'fp32' ]]; then mode_cmd=$mode_cmd" --fp32" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_qa.py index 46122402c6e..d34418e0dd8 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/bert_large/run_qa.py @@ -26,8 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel -from neural_compressor.config import PostTrainingQuantConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -212,9 +211,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -641,21 +640,27 @@ def compute_metrics(p: EvalPrediction): trainer.save_model(training_args.output_dir) trainer.calib_dataloader = trainer.get_eval_dataloader() - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - quantization_config = PostTrainingQuantConfig( - backend="ipex", + quantization_config = QuantizationConfig( approach=optim_args.quantization_approach, - excluded_precisions=["bf16"] + max_trials=200, + metrics=[tune_metric], + use_bf16=False ) + quantization_config.framework = "pytorch_ipex" model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_distilbert.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_distilbert.sh index d0d2bbb9db7..1c0ca172eba 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_distilbert.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_distilbert.sh @@ -121,7 +121,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'fp32' ]]; then mode_cmd=$mode_cmd" --fp32" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_qa.py index 46122402c6e..9417cf4f65f 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased/run_qa.py @@ -26,8 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel -from neural_compressor.config import PostTrainingQuantConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -212,9 +211,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -641,21 +640,28 @@ def compute_metrics(p: EvalPrediction): trainer.save_model(training_args.output_dir) trainer.calib_dataloader = trainer.get_eval_dataloader() - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + + elif optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - quantization_config = PostTrainingQuantConfig( - backend="ipex", + quantization_config = QuantizationConfig( approach=optim_args.quantization_approach, - excluded_precisions=["bf16"] + max_trials=200, + metrics=[tune_metric], + use_bf16=False ) + quantization_config.framework = "pytorch_ipex" model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_distilbert_sparse.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_distilbert_sparse.sh index 7621827eef9..3e82836a0d2 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_distilbert_sparse.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_distilbert_sparse.sh @@ -121,7 +121,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'fp32' ]]; then mode_cmd=$mode_cmd" --fp32" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_qa.py index 1c250201c9d..25c51b01192 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/ipex/distilbert_base_uncased_sparse/run_qa.py @@ -26,8 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel -from neural_compressor.config import PostTrainingQuantConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -212,9 +211,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -641,21 +640,27 @@ def compute_metrics(p: EvalPrediction): trainer.save_model(training_args.output_dir) trainer.calib_dataloader = trainer.get_eval_dataloader() - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + elif optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - quantization_config = PostTrainingQuantConfig( - backend="ipex", + quantization_config = QuantizationConfig( approach=optim_args.quantization_approach, - excluded_precisions=["bf16"], + max_trials=200, + metrics=[tune_metric], + use_bf16=False ) + quantization_config.framework = "pytorch_ipex" model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/README.md b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/README.md index 98f9050cdc5..d7082e1194a 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/README.md +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/README.md @@ -76,7 +76,7 @@ python run_qa.py --model_name_or_path "sguskin/dynamic-minilmv2-L6-H384-squad1.1 For INT8: ```shell -python run_qa.py --model_name_or_path "sguskin/dynamic-minilmv2-L6-H384-squad1.1" --dataset_name squad --do_train --do_eval --output_dir model_and_tokenizer --overwrite_output_dir --length_config "(269, 253, 252, 202, 104, 34)" --overwrite_cache --to_onnx --tune --quantization_approach static +python run_qa.py --model_name_or_path "sguskin/dynamic-minilmv2-L6-H384-squad1.1" --dataset_name squad --do_train --do_eval --output_dir model_and_tokenizer --overwrite_output_dir --length_config "(269, 253, 252, 202, 104, 34)" --overwrite_cache --to_onnx --tune --quantization_approach PostTrainingStatic ``` For BF16: diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_LAT.sh b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_LAT.sh index a2119fd1dc3..163c8894cf7 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_LAT.sh +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_LAT.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_qa.py b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_qa.py index 81209b7d4f7..eb41bf85a32 100644 --- a/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_qa.py +++ b/examples/huggingface/pytorch/question-answering/deployment/squad/length_adaptive_transformer/run_qa.py @@ -29,8 +29,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel, DynamicLengthConfig -from neural_compressor.config import PostTrainingQuantConfig +from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig, DynamicLengthConfig from trainer_qa import QuestionAnsweringTrainer from intel_extension_for_transformers.transformers.modeling.modeling_roberta_dynamic import RobertaForQuestionAnswering @@ -222,9 +221,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -781,20 +780,24 @@ def compute_metrics(p: EvalPrediction): trainer.save_model(training_args.output_dir) trainer.calib_dataloader = trainer.get_eval_dataloader() - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - quantization_config = PostTrainingQuantConfig( - backend="ipex", + quantization_config = QuantizationConfig( approach=optim_args.quantization_approach, - excluded_precision=["bf16"] + max_trials=200, + metrics=[tune_metric], ) model = trainer.quantize(quant_config=quantization_config) diff --git a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py index fc8b047c58d..720e4109657 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py +++ b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -204,9 +198,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -527,37 +521,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.sh b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.sh index 79c91ee5b18..57cee9c4494 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/emotion/distilbert_base_uncased/run_emotion.sh @@ -121,7 +121,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_bert_base.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_bert_base.sh index d1648a0c661..f2e133f1d9e 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_bert_base.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_bert_base.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_glue.py index 7267b845f98..eb8e47583e0 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base/run_glue.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,9 +197,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -530,37 +524,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_bert_base_cased.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_bert_base_cased.sh index cca1268e646..4daabbfe41a 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_bert_base_cased.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_bert_base_cased.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_glue.py index c68d3527abc..9374620302a 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_base_cased/run_glue.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,9 +197,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -530,37 +524,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_bert_mini.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_bert_mini.sh index fa9f005fa54..6e9db50fddd 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_bert_mini.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_bert_mini.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_glue.py index 6e3bc04cd0d..eb8e47583e0 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/bert_mini/run_glue.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,9 +197,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -530,36 +524,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) + tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_distilbert_base.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_distilbert_base.sh index b20cffed3b5..8c75385ea5b 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_distilbert_base.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_distilbert_base.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_glue.py index 6e3bc04cd0d..eb8e47583e0 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/distilbert_base_uncased/run_glue.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,9 +197,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -530,36 +524,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) + tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_glue.py index 6f899f98ed4..efc762b5c59 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_glue.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,9 +197,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -530,36 +524,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) + tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_roberta_base.sh b/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_roberta_base.sh index 4228e299003..37110ee356c 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_roberta_base.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/mrpc/roberta_base/run_roberta_base.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_bert_mini.sh b/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_bert_mini.sh index 4e36c1330a1..48b24477a34 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_bert_mini.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_bert_mini.sh @@ -128,7 +128,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_glue.py index b5c05350e84..4400593f0c2 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sparse/bert_mini/run_glue.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,9 +197,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -530,38 +524,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric objective = objectives.performance - tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) - accuracy_criterion = AccuracyCriterion( - higher_is_better=True, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_distilbert.sh b/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_distilbert.sh index 43d99aa3419..53c694f0a89 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_distilbert.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_distilbert.sh @@ -128,7 +128,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_qa.py b/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_qa.py index af1e10149f3..373669fb338 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_qa.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sparse/distilbert_base_uncased/run_qa.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics , OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics , OptimizedModel, QuantizationConfig from trainer_qa import QuestionAnsweringTrainer from transformers import ( AutoConfig, @@ -217,9 +211,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default="eval_f1", @@ -652,38 +646,25 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - objective = objectives.performance - tuning_criterion = TuningCriterion(max_trials=600, objective=[objective.name]) - accuracy_criterion = AccuracyCriterion( - higher_is_better=True, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=200, + metrics=[tune_metric], ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_bert_mini.sh b/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_bert_mini.sh index d756a945cf6..4a5a986fdc1 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_bert_mini.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_bert_mini.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_glue.py index 6f899f98ed4..efc762b5c59 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/bert_mini/run_glue.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,9 +197,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -530,36 +524,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) + tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_distilbert_base.sh b/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_distilbert_base.sh index 962a0044ca0..d2be2d43c50 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_distilbert_base.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_distilbert_base.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_glue.py index 6e3bc04cd0d..eb8e47583e0 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/distilbert_base_uncased/run_glue.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,9 +197,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -530,36 +524,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) + tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_glue.py b/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_glue.py index 9eaa0cb0ecd..4400593f0c2 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_glue.py +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_glue.py @@ -26,13 +26,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( AutoConfig, @@ -203,9 +197,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -530,37 +524,27 @@ def compute_metrics(p: EvalPrediction): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective] ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) model = trainer.quantize(quant_config=quantization_config) if optim_args.benchmark or optim_args.accuracy_only: diff --git a/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_minilm.sh b/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_minilm.sh index 31f6033ce6e..20417a96738 100644 --- a/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_minilm.sh +++ b/examples/huggingface/pytorch/text-classification/deployment/sst2/minilm_l6_h384_uncased/run_minilm.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_bge.sh b/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_bge.sh index 5b62734d906..8c24dbcffef 100644 --- a/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_bge.sh +++ b/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_bge.sh @@ -123,7 +123,7 @@ else echo "========== Prepare Model ${MODEL_NAME_OR_PATH} with Precision ${PRECISION} ========" mode_cmd="" if [[ ${PRECISION} = 'int8' ]]; then - mode_cmd=$mode_cmd" --tune --quantization_approach static" + mode_cmd=$mode_cmd" --tune --quantization_approach PostTrainingStatic" elif [[ ${PRECISION} = 'bf16' ]]; then mode_cmd=$mode_cmd" --enable_bf16" fi diff --git a/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_mteb.py b/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_mteb.py index 225c8012b34..557524c6590 100644 --- a/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_mteb.py +++ b/examples/huggingface/pytorch/text-embedding/deployment/mteb/bge/run_mteb.py @@ -28,13 +28,7 @@ import transformers from dataclasses import dataclass, field from datasets import load_dataset, load_metric -from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel -from neural_compressor.config import ( - PostTrainingQuantConfig, - QuantizationAwareTrainingConfig, - TuningCriterion, - AccuracyCriterion -) +from intel_extension_for_transformers.transformers import metrics, objectives, OptimizedModel, QuantizationConfig from intel_extension_for_transformers.transformers.trainer import NLPTrainer from transformers import ( @@ -207,9 +201,9 @@ class OptimizationArguments: metadata={"help": "Whether or not to apply quantization."}, ) quantization_approach: Optional[str] = field( - default="static", - metadata={"help": "Quantization approach. Supported approach are static, " - "dynamic and qat."}, + default="PostTrainingStatic", + metadata={"help": "Quantization approach. Supported approach are PostTrainingStatic, " + "PostTrainingDynamic and QuantizationAwareTraining."}, ) metric_name: Optional[str] = field( default=None, @@ -577,36 +571,28 @@ def preprocess_function(example): if not training_args.do_eval: raise ValueError("do_eval must be set to True for quantization.") - if optim_args.quantization_approach != "dynamic": + if optim_args.quantization_approach != "PostTrainingDynamic": if not training_args.do_train: raise ValueError( "do_train must be set to True for static and aware training quantization." ) + if optim_args.quantization_approach == "QuantizationAwareTraining": + early_stopping_patience = 6 + early_stopping_threshold = 0.001 # optional + trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, + early_stopping_threshold)) + tune_metric = metrics.Metric( name=metric_name, is_relative=optim_args.is_relative, criterion=optim_args.perf_tol ) - trainer.metrics = tune_metric - tuning_criterion = TuningCriterion(max_trials=600) - accuracy_criterion = AccuracyCriterion( - higher_is_better=False, # optional. - criterion="relative" if optim_args.is_relative else "absolute", # optional. Available values are "relative" and "absolute". - tolerable_loss=optim_args.perf_tol, # optional. + objective = objectives.performance + quantization_config = QuantizationConfig( + approach=optim_args.quantization_approach, + max_trials=600, + metrics=[tune_metric], + objectives=[objective], + sampling_size = len(train_dataset)//20 ) - if optim_args.quantization_approach != "qat": - quantization_config = PostTrainingQuantConfig( - approach=optim_args.quantization_approach, - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - else: - quantization_config = QuantizationAwareTrainingConfig( - tuning_criterion=tuning_criterion, - accuracy_criterion=accuracy_criterion - ) - early_stopping_patience = 2 - early_stopping_threshold = 0.001 # optional - trainer.add_callback(transformers.EarlyStoppingCallback(early_stopping_patience, \ - early_stopping_threshold)) stmodel = SentenceTransformer(model_args.model_name_or_path) def eval_func(model): From 3aac3a4352075f910b6e8e43b54df32cd86f6104 Mon Sep 17 00:00:00 2001 From: changwangss Date: Fri, 21 Jun 2024 01:21:21 -0700 Subject: [PATCH 21/22] fix pokeman Signed-off-by: changwangss --- ..._StableDiffusionInstructPix2PixPipeline.py | 738 ----------------- .../deployment/stable_diffusion/README.md | 290 ------- .../stable_diffusion/diffusion_utils.py | 696 ---------------- .../diffusion_utils_img2img.py | 755 ------------------ .../deployment/stable_diffusion/export_ir.py | 311 -------- .../stable_diffusion/export_model.sh | 77 -- .../images/astronaut_rides_horse.png | Bin 464344 -> 0 bytes .../astronaut_rides_horse_from_engine_1.png | Bin 256718 -> 0 bytes .../stable_diffusion/images/mountain.png | Bin 399205 -> 0 bytes .../images/mountain_cartoonized.png | Bin 381908 -> 0 bytes .../stable_diffusion/prepare_model.py | 337 -------- .../stable_diffusion/quantization_modules.py | 146 ---- .../stable_diffusion/requirements.txt | 12 - .../stable_diffusion/run_executor.py | 236 ------ .../quantization/ptq/run_diffusion.py | 8 +- 15 files changed, 7 insertions(+), 3599 deletions(-) delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/ITREX_StableDiffusionInstructPix2PixPipeline.py delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/README.md delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils.py delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils_img2img.py delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_ir.py delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_model.sh delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse.png delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse_from_engine_1.png delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/mountain.png delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/mountain_cartoonized.png delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/prepare_model.py delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/quantization_modules.py delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/requirements.txt delete mode 100644 examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/run_executor.py diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/ITREX_StableDiffusionInstructPix2PixPipeline.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/ITREX_StableDiffusionInstructPix2PixPipeline.py deleted file mode 100644 index a00ccb896cb..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/ITREX_StableDiffusionInstructPix2PixPipeline.py +++ /dev/null @@ -1,738 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Pipeline Modificaiton based from the diffusers 0.12.1 StableDiffusionInstructPix2PixPipeline""" - -import inspect -from typing import Callable, List, Optional, Union - -import numpy as np -import torch -import copy -import PIL -from transformers import CLIPFeatureExtractor, CLIPTextModel, CLIPTokenizer - -from diffusers.models import AutoencoderKL, UNet2DConditionModel -from diffusers.schedulers import KarrasDiffusionSchedulers -from diffusers.utils import ( - PIL_INTERPOLATION, - deprecate, - is_accelerate_available, - logging, - randn_tensor, - replace_example_docstring, -) -from diffusers.pipeline_utils import DiffusionPipeline -from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput -from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker - - -logger = logging.get_logger(__name__) # pylint: disable=invalid-name - - -# Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_img2img.preprocess -def preprocess(image): - if isinstance(image, torch.Tensor): - return image - elif isinstance(image, PIL.Image.Image): - image = [image] - - if isinstance(image[0], PIL.Image.Image): - w, h = image[0].size - w, h = map(lambda x: x - x % 8, (w, h)) # resize to integer multiple of 8 - - image = [np.array(i.resize((w, h), resample=PIL_INTERPOLATION["lanczos"]))[None, :] for i in image] - image = np.concatenate(image, axis=0) - image = np.array(image).astype(np.float32) / 255.0 - image = image.transpose(0, 3, 1, 2) - image = 2.0 * image - 1.0 - image = torch.from_numpy(image) - elif isinstance(image[0], torch.Tensor): - image = torch.cat(image, dim=0) - return image - - -class StableDiffusionInstructPix2PixPipeline(DiffusionPipeline): - r""" - Pipeline for pixel-level image editing by following text instructions. Based on Stable Diffusion. - - This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods the - library implements for all the pipelines (such as downloading or saving, running on a particular device, etc.) - - Args: - vae ([`AutoencoderKL`]): - Variational Auto-Encoder (VAE) Model to encode and decode images to and from latent representations. - text_encoder ([`CLIPTextModel`]): - Frozen text-encoder. Stable Diffusion uses the text portion of - [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPTextModel), specifically - the [clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14) variant. - tokenizer (`CLIPTokenizer`): - Tokenizer of class - [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer). - unet ([`UNet2DConditionModel`]): Conditional U-Net architecture to denoise the encoded image latents. - scheduler ([`SchedulerMixin`]): - A scheduler to be used in combination with `unet` to denoise the encoded image latents. Can be one of - [`DDIMScheduler`], [`LMSDiscreteScheduler`], or [`PNDMScheduler`]. - safety_checker ([`StableDiffusionSafetyChecker`]): - Classification module that estimates whether generated images could be considered offensive or harmful. - Please, refer to the [model card](https://huggingface.co/runwayml/stable-diffusion-v1-5) for details. - feature_extractor ([`CLIPFeatureExtractor`]): - Model that extracts features from generated images to be used as inputs for the `safety_checker`. - """ - _optional_components = ["safety_checker", "feature_extractor"] - - def __init__( - self, - vae: AutoencoderKL, - text_encoder: CLIPTextModel, - tokenizer: CLIPTokenizer, - unet: UNet2DConditionModel, - scheduler: KarrasDiffusionSchedulers, - safety_checker: StableDiffusionSafetyChecker, - feature_extractor: CLIPFeatureExtractor, - requires_safety_checker: bool = True, - ): - super().__init__() - - if safety_checker is None and requires_safety_checker: - logger.warning( - f"You have disabled the safety checker for {self.__class__} by passing `safety_checker=None`. Ensure" - " that you abide to the conditions of the Stable Diffusion license and do not expose unfiltered" - " results in services or applications open to the public. Both the diffusers team and Hugging Face" - " strongly recommend to keep the safety filter enabled in all public facing circumstances, disabling" - " it only for use-cases that involve analyzing network behavior or auditing its results. For more" - " information, please have a look at https://github.com/huggingface/diffusers/pull/254 ." - ) - - if safety_checker is not None and feature_extractor is None: - raise ValueError( - "Make sure to define a feature extractor when loading {self.__class__} if you want to use the safety" - " checker. If you do not want to use the safety checker, you can pass `'safety_checker=None'` instead." - ) - - self.register_modules( - vae=vae, - text_encoder=text_encoder, - tokenizer=tokenizer, - unet=unet, - scheduler=scheduler, - safety_checker=safety_checker, - feature_extractor=feature_extractor, - ) - self.vae_scale_factor = 2 ** (len(self.vae.config.block_out_channels) - 1) - self.register_to_config(requires_safety_checker=requires_safety_checker) - - @torch.no_grad() - def __call__( - self, - prompt: Union[str, List[str]] = None, - image: Union[torch.FloatTensor, PIL.Image.Image] = None, - num_inference_steps: int = 100, - guidance_scale: float = 7.5, - image_guidance_scale: float = 1.5, - negative_prompt: Optional[Union[str, List[str]]] = None, - num_images_per_prompt: Optional[int] = 1, - eta: float = 0.0, - generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, - latents: Optional[torch.FloatTensor] = None, - prompt_embeds: Optional[torch.FloatTensor] = None, - negative_prompt_embeds: Optional[torch.FloatTensor] = None, - output_type: Optional[str] = "pil", - return_dict: bool = True, - callback: Optional[Callable[[int, int, torch.FloatTensor], None]] = None, - callback_steps: Optional[int] = 1, - engine_graph: Optional[list] = [], - ): - r""" - Function invoked when calling the pipeline for generation. - - Args: - prompt (`str` or `List[str]`, *optional*): - The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`. - instead. - image (`PIL.Image.Image`): - `Image`, or tensor representing an image batch which will be repainted according to `prompt`. - num_inference_steps (`int`, *optional*, defaults to 100): - The number of denoising steps. More denoising steps usually lead to a higher quality image at the - expense of slower inference. - guidance_scale (`float`, *optional*, defaults to 7.5): - Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598). - `guidance_scale` is defined as `w` of equation 2. of [Imagen - Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale > - 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, - usually at the expense of lower image quality. This pipeline requires a value of at least `1`. - image_guidance_scale (`float`, *optional*, defaults to 1.5): - Image guidance scale is to push the generated image towards the initial image `image`. Image guidance - scale is enabled by setting `image_guidance_scale > 1`. Higher image guidance scale encourages to - generate images that are closely linked to the source image `image`, usually at the expense of lower - image quality. This pipeline requires a value of at least `1`. - negative_prompt (`str` or `List[str]`, *optional*): - The prompt or prompts not to guide the image generation. If not defined, one has to pass - `negative_prompt_embeds`. instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` - is less than `1`). - num_images_per_prompt (`int`, *optional*, defaults to 1): - The number of images to generate per prompt. - eta (`float`, *optional*, defaults to 0.0): - Corresponds to parameter eta (η) in the DDIM paper: https://arxiv.org/abs/2010.02502. Only applies to - [`schedulers.DDIMScheduler`], will be ignored for others. - generator (`torch.Generator`, *optional*): - One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html) - to make generation deterministic. - latents (`torch.FloatTensor`, *optional*): - Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image - generation. Can be used to tweak the same generation with different prompts. If not provided, a latents - tensor will ge generated by sampling using the supplied random `generator`. - prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not - provided, text embeddings will be generated from `prompt` input argument. - negative_prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt - weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input - argument. - output_type (`str`, *optional*, defaults to `"pil"`): - The output format of the generate image. Choose between - [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` or `np.array`. - return_dict (`bool`, *optional*, defaults to `True`): - Whether or not to return a [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] instead of a - plain tuple. - callback (`Callable`, *optional*): - A function that will be called every `callback_steps` steps during inference. The function will be - called with the following arguments: `callback(step: int, timestep: int, latents: torch.FloatTensor)`. - callback_steps (`int`, *optional*, defaults to 1): - The frequency at which the `callback` function will be called. If not specified, the callback will be - called at every step. - - Examples: - - ```py - >>> import PIL - >>> import requests - >>> import torch - >>> from io import BytesIO - - >>> from diffusers import StableDiffusionInstructPix2PixPipeline - - - >>> def download_image(url): - ... response = requests.get(url) - ... return PIL.Image.open(BytesIO(response.content)).convert("RGB") - - - >>> img_url = "https://huggingface.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png" - - >>> image = download_image(img_url).resize((512, 512)) - - >>> pipe = StableDiffusionInstructPix2PixPipeline.from_pretrained( - ... "timbrooks/instruct-pix2pix", torch_dtype=torch.float16 - ... ) - >>> pipe = pipe.to("cuda") - - >>> prompt = "make the mountains snowy" - >>> image = pipe(prompt=prompt, image=image).images[0] - ``` - - Returns: - [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] or `tuple`: - [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] if `return_dict` is True, otherwise a `tuple. - When returning a tuple, the first element is a list with the generated images, and the second element is a - list of `bool`s denoting whether the corresponding generated image likely represents "not-safe-for-work" - (nsfw) content, according to the `safety_checker`. - """ - # 0. Check inputs - self.check_inputs(prompt, callback_steps) - - if image is None: - raise ValueError("`image` input cannot be undefined.") - - # 1. Define call parameters - batch_size = 1 if isinstance(prompt, str) else len(prompt) - device = self._execution_device - # here `guidance_scale` is defined analog to the guidance weight `w` of equation (2) - # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . `guidance_scale = 1` - # corresponds to doing no classifier free guidance. - do_classifier_free_guidance = guidance_scale > 1.0 and image_guidance_scale >= 1.0 - # check if scheduler is in sigmas space - scheduler_is_in_sigma_space = hasattr(self.scheduler, "sigmas") - - # 2. Encode input prompt - prompt_embeds = self._encode_prompt( - engine_graph[0], - prompt, - device, - num_images_per_prompt, - do_classifier_free_guidance, - negative_prompt, - prompt_embeds=prompt_embeds, - negative_prompt_embeds=negative_prompt_embeds, - ) - - # 3. Preprocess image - image = preprocess(image) - height, width = image.shape[-2:] - - # 4. set timesteps - self.scheduler.set_timesteps(num_inference_steps, device=device) - timesteps = self.scheduler.timesteps - - # 5. Prepare Image latents - image_latents = self.prepare_image_latents( - image, - batch_size, - num_images_per_prompt, - prompt_embeds.dtype, - device, - do_classifier_free_guidance, - generator, - ) - - # 6. Prepare latent variables - num_channels_latents = self.vae.config.latent_channels - latents = self.prepare_latents( - batch_size * num_images_per_prompt, - num_channels_latents, - height, - width, - prompt_embeds.dtype, - device, - generator, - latents, - ) - - # 7. Check that shapes of latents and image match the UNet channels - num_channels_image = image_latents.shape[1] - if num_channels_latents + num_channels_image != self.unet.config.in_channels: - raise ValueError( - f"Incorrect configuration settings! The config of `pipeline.unet`: {self.unet.config} expects" - f" {self.unet.config.in_channels} but received `num_channels_latents`: {num_channels_latents} +" - f" `num_channels_image`: {num_channels_image} " - f" = {num_channels_latents+num_channels_image}. Please verify the config of" - " `pipeline.unet` or your `image` input." - ) - - # 8. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline - extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) - - # 9. Denoising loop - num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order - with self.progress_bar(total=num_inference_steps) as progress_bar: - for i, t in enumerate(timesteps): - # Expand the latents if we are doing classifier free guidance. - # The latents are expanded 3 times because for pix2pix the guidance\ - # is applied for both the text and the input image. - latent_model_input = torch.cat([latents] * 3) if do_classifier_free_guidance else latents - - # concat latents, image_latents in the channel dimension - scaled_latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) - scaled_latent_model_input = torch.cat([scaled_latent_model_input, image_latents], dim=1) - - # Original Pytorch Diffuser Unet Code: predict the noise residual - #noise_pred = self.unet(scaled_latent_model_input, t, encoder_hidden_states=prompt_embeds).sample - - # The ITREX Unet Code - scaled_latent_model_input = scaled_latent_model_input.contiguous() - prompt_embeds = prompt_embeds.contiguous() - t_1d = torch.tensor([t], dtype=torch.float32).contiguous() - engine_output = engine_graph[1].inference([scaled_latent_model_input, t_1d, prompt_embeds]) - noise_pred = torch.from_numpy(engine_output['out_sample:0']) - - # Hack: - # For karras style schedulers the model does classifier free guidance using the - # predicted_original_sample instead of the noise_pred. So we need to compute the - # predicted_original_sample here if we are using a karras style scheduler. - if scheduler_is_in_sigma_space: - step_index = (self.scheduler.timesteps == t).nonzero().item() - sigma = self.scheduler.sigmas[step_index] - noise_pred = latent_model_input - sigma * noise_pred - - # perform guidance - if do_classifier_free_guidance: - noise_pred_text, noise_pred_image, noise_pred_uncond = noise_pred.chunk(3) - noise_pred = ( - noise_pred_uncond - + guidance_scale * (noise_pred_text - noise_pred_image) - + image_guidance_scale * (noise_pred_image - noise_pred_uncond) - ) - - # Hack: - # For karras style schedulers the model does classifier free guidance using the - # predicted_original_sample instead of the noise_pred. But the scheduler.step function - # expects the noise_pred and computes the predicted_original_sample internally. So we - # need to overwrite the noise_pred here such that the value of the computed - # predicted_original_sample is correct. - if scheduler_is_in_sigma_space: - noise_pred = (noise_pred - latents) / (-sigma) - - # compute the previous noisy sample x_t -> x_t-1 - latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample - - # call the callback, if provided - if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0): - progress_bar.update() - if callback is not None and i % callback_steps == 0: - callback(i, t, latents) - - # 10. Post-processing - image = self.decode_latents(latents, engine_graph[2]) - - # 11. Run safety checker - image, has_nsfw_concept = self.run_safety_checker(image, device, prompt_embeds.dtype) - - # 12. Convert to PIL - if output_type == "pil": - image = self.numpy_to_pil(image) - - if not return_dict: - return (image, has_nsfw_concept) - - return StableDiffusionPipelineOutput(images=image, nsfw_content_detected=has_nsfw_concept) - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.enable_sequential_cpu_offload - def enable_sequential_cpu_offload(self, gpu_id=0): - r""" - Offloads all models to CPU using accelerate, significantly reducing memory usage. When called, unet, - text_encoder, vae and safety checker have their state dicts saved to CPU and then are moved to a - `torch.device('meta') and loaded to GPU only when their specific submodule has its `forward` method called. - """ - if is_accelerate_available(): - from accelerate import cpu_offload - else: - raise ImportError("Please install accelerate via `pip install accelerate`") - - device = torch.device(f"cuda:{gpu_id}") - - for cpu_offloaded_model in [self.unet, self.text_encoder, self.vae]: - cpu_offload(cpu_offloaded_model, device) - - if self.safety_checker is not None: - cpu_offload(self.safety_checker, execution_device=device, offload_buffers=True) - - @property - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._execution_device - def _execution_device(self): - r""" - Returns the device on which the pipeline's models will be executed. After calling - `pipeline.enable_sequential_cpu_offload()` the execution device can only be inferred from Accelerate's module - hooks. - """ - if self.device != torch.device("meta") or not hasattr(self.unet, "_hf_hook"): - return self.device - for module in self.unet.modules(): - if ( - hasattr(module, "_hf_hook") - and hasattr(module._hf_hook, "execution_device") - and module._hf_hook.execution_device is not None - ): - return torch.device(module._hf_hook.execution_device) - return self.device - - def _encode_prompt( - self, - text_encoder_graph, - prompt, - device, - num_images_per_prompt, - do_classifier_free_guidance, - negative_prompt=None, - prompt_embeds: Optional[torch.FloatTensor] = None, - negative_prompt_embeds: Optional[torch.FloatTensor] = None, - ): - r""" - Encodes the prompt into text encoder hidden states. - - Args: - prompt (`str` or `List[str]`, *optional*): - prompt to be encoded - device: (`torch.device`): - torch device - num_images_per_prompt (`int`): - number of images that should be generated per prompt - do_classifier_free_guidance (`bool`): - whether to use classifier free guidance or not - negative_ prompt (`str` or `List[str]`, *optional*): - The prompt or prompts not to guide the image generation. If not defined, one has to pass - `negative_prompt_embeds`. instead. If not defined, one has to pass `negative_prompt_embeds`. instead. - Ignored when not using guidance (i.e., ignored if `guidance_scale` is less than `1`). - prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not - provided, text embeddings will be generated from `prompt` input argument. - negative_prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt - weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input - argument. - """ - if prompt is not None and isinstance(prompt, str): - batch_size = 1 - elif prompt is not None and isinstance(prompt, list): - batch_size = len(prompt) - else: - batch_size = prompt_embeds.shape[0] - - if prompt_embeds is None: - text_inputs = self.tokenizer( - prompt, - padding="max_length", - max_length=self.tokenizer.model_max_length, - truncation=True, - return_tensors="pt", - ) - text_input_ids = text_inputs.input_ids - untruncated_ids = self.tokenizer(prompt, padding="longest", return_tensors="pt").input_ids - - if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal( - text_input_ids, untruncated_ids - ): - removed_text = self.tokenizer.batch_decode( - untruncated_ids[:, self.tokenizer.model_max_length - 1 : -1] - ) - logger.warning( - "The following part of your input was truncated because CLIP can only handle sequences up to" - f" {self.tokenizer.model_max_length} tokens: {removed_text}" - ) - - if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: - attention_mask = text_inputs.attention_mask.to(device) - else: - attention_mask = None - - # The ITREX Text Encdoer Code - # prompt_embeds = text_encoder_graph.inference([text_input_ids]) - # bsz, seq_length = text_input_ids.shape - # encoder_hidden_state = prompt_embeds['last_hidden_state:0'] - # if encoder_hidden_state.dtype == np.int16: - # prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) - # prompt_embeds = torch.from_numpy(prompt_embeds['last_hidden_state:0']).reshape( - # bsz, seq_length, -1) - - #Original Pytorch Diffuser Text Encoder Code - prompt_embeds = self.text_encoder( - text_input_ids.to(device), - attention_mask=attention_mask, - ) - prompt_embeds = prompt_embeds[0] - - prompt_embeds = prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) - - bs_embed, seq_len, _ = prompt_embeds.shape - # duplicate text embeddings for each generation per prompt, using mps friendly method - prompt_embeds = prompt_embeds.repeat(1, num_images_per_prompt, 1) - prompt_embeds = prompt_embeds.view(bs_embed * num_images_per_prompt, seq_len, -1) - - # get unconditional embeddings for classifier free guidance - if do_classifier_free_guidance and negative_prompt_embeds is None: - uncond_tokens: List[str] - if negative_prompt is None: - uncond_tokens = [""] * batch_size - elif type(prompt) is not type(negative_prompt): - raise TypeError( - f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !=" - f" {type(prompt)}." - ) - elif isinstance(negative_prompt, str): - uncond_tokens = [negative_prompt] - elif batch_size != len(negative_prompt): - raise ValueError( - f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:" - f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches" - " the batch size of `prompt`." - ) - else: - uncond_tokens = negative_prompt - - max_length = prompt_embeds.shape[1] - uncond_input = self.tokenizer( - uncond_tokens, - padding="max_length", - max_length=max_length, - truncation=True, - return_tensors="pt", - ) - - if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: - attention_mask = uncond_input.attention_mask.to(device) - else: - attention_mask = None - - # The ITREX Text Encdoer Code - negative_prompt_embeds = text_encoder_graph.inference([uncond_input.input_ids]) - bsz, seq_length = uncond_input.input_ids.shape - encoder_hidden_state = negative_prompt_embeds['last_hidden_state:0'] - if encoder_hidden_state.dtype == np.int16: - negative_prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) - negative_prompt_embeds = torch.from_numpy(negative_prompt_embeds['last_hidden_state:0']).reshape( - bsz, seq_length, -1) - - # Original Pytorch Diffuser Text Encoder Code - # negative_prompt_embeds = self.text_encoder( - # uncond_input.input_ids.to(device), - # attention_mask=attention_mask, - # ) - # negative_prompt_embeds = negative_prompt_embeds[0] - - if do_classifier_free_guidance: - # duplicate unconditional embeddings for each generation per prompt, using mps friendly method - seq_len = negative_prompt_embeds.shape[1] - - negative_prompt_embeds = negative_prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) - - negative_prompt_embeds = negative_prompt_embeds.repeat(1, num_images_per_prompt, 1) - negative_prompt_embeds = negative_prompt_embeds.view(batch_size * num_images_per_prompt, seq_len, -1) - - # For classifier free guidance, we need to do two forward passes. - # Here we concatenate the unconditional and text embeddings into a single batch - # to avoid doing two forward passes - # pix2pix has two negative embeddings, and unlike in other pipelines latents are ordered [prompt_embeds, negative_prompt_embeds, negative_prompt_embeds] - prompt_embeds = torch.cat([prompt_embeds, negative_prompt_embeds, negative_prompt_embeds]) - - return prompt_embeds - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.run_safety_checker - def run_safety_checker(self, image, device, dtype): - if self.safety_checker is not None: - safety_checker_input = self.feature_extractor(self.numpy_to_pil(image), return_tensors="pt").to(device) - image, has_nsfw_concept = self.safety_checker( - images=image, clip_input=safety_checker_input.pixel_values.to(dtype) - ) - else: - has_nsfw_concept = None - return image, has_nsfw_concept - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.prepare_extra_step_kwargs - def prepare_extra_step_kwargs(self, generator, eta): - # prepare extra kwargs for the scheduler step, since not all schedulers have the same signature - # eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers. - # eta corresponds to η in DDIM paper: https://arxiv.org/abs/2010.02502 - # and should be between [0, 1] - - accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys()) - extra_step_kwargs = {} - if accepts_eta: - extra_step_kwargs["eta"] = eta - - # check if the scheduler accepts generator - accepts_generator = "generator" in set(inspect.signature(self.scheduler.step).parameters.keys()) - if accepts_generator: - extra_step_kwargs["generator"] = generator - return extra_step_kwargs - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.decode_latents - def decode_latents(self, latents, vae_decoder_graph): - latents = 1 / 0.18215 * latents - - # Original Pytorch Diffuser Vae Code - image = self.vae.decode(latents).sample - - # The ITREX Vae Codes - latents = latents.contiguous() - output = vae_decoder_graph.inference([latents]) - image = torch.from_numpy(output['sample:0']) - - image = (image / 2 + 0.5).clamp(0, 1) - # we always cast to float32 as this does not cause significant overhead and is compatible with bfloa16 - image = image.cpu().permute(0, 2, 3, 1).float().numpy() - return image - - def check_inputs(self, prompt, callback_steps): - if not isinstance(prompt, str) and not isinstance(prompt, list): - raise ValueError(f"`prompt` has to be of type `str` or `list` but is {type(prompt)}") - - if (callback_steps is None) or ( - callback_steps is not None and (not isinstance(callback_steps, int) or callback_steps <= 0) - ): - raise ValueError( - f"`callback_steps` has to be a positive integer but is {callback_steps} of type" - f" {type(callback_steps)}." - ) - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.prepare_latents - def prepare_latents(self, batch_size, num_channels_latents, height, width, dtype, device, generator, latents=None): - shape = (batch_size, num_channels_latents, height // self.vae_scale_factor, width // self.vae_scale_factor) - if isinstance(generator, list) and len(generator) != batch_size: - raise ValueError( - f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" - f" size of {batch_size}. Make sure the batch size matches the length of the generators." - ) - - if latents is None: - latents = randn_tensor(shape, generator=generator, device=device, dtype=dtype) - else: - latents = latents.to(device) - - # scale the initial noise by the standard deviation required by the scheduler - latents = latents * self.scheduler.init_noise_sigma - return latents - - def prepare_image_latents( - self, image, batch_size, num_images_per_prompt, dtype, device, do_classifier_free_guidance, generator=None - ): - if not isinstance(image, (torch.Tensor, PIL.Image.Image, list)): - raise ValueError( - f"`image` has to be of type `torch.Tensor`, `PIL.Image.Image` or list but is {type(image)}" - ) - - image = image.to(device=device, dtype=dtype) - - batch_size = batch_size * num_images_per_prompt - if isinstance(generator, list) and len(generator) != batch_size: - raise ValueError( - f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" - f" size of {batch_size}. Make sure the batch size matches the length of the generators." - ) - - if isinstance(generator, list): - image_latents = [self.vae.encode(image[i : i + 1]).latent_dist.mode() for i in range(batch_size)] - image_latents = torch.cat(image_latents, dim=0) - else: - image_latents = self.vae.encode(image).latent_dist.mode() - - if batch_size > image_latents.shape[0] and batch_size % image_latents.shape[0] == 0: - # expand image_latents for batch_size - deprecation_message = ( - f"You have passed {batch_size} text prompts (`prompt`), but only {image_latents.shape[0]} initial" - " images (`image`). Initial images are now duplicating to match the number of text prompts. Note" - " that this behavior is deprecated and will be removed in a version 1.0.0. Please make sure to update" - " your script to pass as many initial images as text prompts to suppress this warning." - ) - deprecate("len(prompt) != len(image)", "1.0.0", deprecation_message, standard_warn=False) - additional_image_per_prompt = batch_size // image_latents.shape[0] - image_latents = torch.cat([image_latents] * additional_image_per_prompt, dim=0) - elif batch_size > image_latents.shape[0] and batch_size % image_latents.shape[0] != 0: - raise ValueError( - f"Cannot duplicate `image` of batch size {image_latents.shape[0]} to {batch_size} text prompts." - ) - else: - image_latents = torch.cat([image_latents], dim=0) - - if do_classifier_free_guidance: - uncond_image_latents = torch.zeros_like(image_latents) - image_latents = torch.cat([image_latents, image_latents, uncond_image_latents], dim=0) - - return image_latents - -def fp32_to_bf16(fp32_np): - assert(fp32_np.dtype==np.float32) - temp = copy.deepcopy(fp32_np) - int32_np = temp.view(dtype=np.int32) - int32_np = int32_np >> 16 - bf16_np = int32_np.astype(np.uint16) - return bf16_np - -def bf16_to_fp32(bf16_np): - assert(bf16_np.dtype==np.int16) - temp = copy.deepcopy(bf16_np) - int32_np = temp.astype(dtype=np.int32) - int32_np = int32_np << 16 - fp32_np = int32_np.view(np.float32) - return fp32_np diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/README.md b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/README.md deleted file mode 100644 index ade21d9086b..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/README.md +++ /dev/null @@ -1,290 +0,0 @@ -Step-by-Step -========= -This document describes the end-to-end workflow for Text-to-image generative AI models across the Neural Engine backend. - -Supported Text-to-image Generative AI models: -1. [CompVis/stable-diffusion-v1-4](https://huggingface.co/CompVis/stable-diffusion-v1-4) -2. [runwayml/stable-diffusion-v1-5](https://github.com/runwayml/stable-diffusion) -3. [stabilityai/stable-diffusion-2-1](https://huggingface.co/stabilityai/stable-diffusion-2-1) -4. [instruction-tuning-sd](https://huggingface.co/instruction-tuning-sd) - * [scratch-low-level-img-proc](https://huggingface.co/instruction-tuning-sd/scratch-low-level-img-proc) - * [scratch-cartoonizer](https://huggingface.co/instruction-tuning-sd/scratch-cartoonizer) - * [cartoonizer](https://huggingface.co/instruction-tuning-sd/cartoonizer) - * [low-level-img-proc](https://huggingface.co/instruction-tuning-sd/low-level-img-proc) - -The inference and accuracy of the above pretrained models are verified in the default configs. - -# Prerequisite - -## Prepare Python Environment -Create a python environment, optionally with autoconf for jemalloc support. -```shell -conda create -n python=3.10 [autoconf] -conda activate -``` ->**Note**: Make sure pip <=23.2.2 - -Check that `gcc` version is higher than 9.0. -```shell -gcc -v -``` - -Install Intel® Extension for Transformers, please refer to [installation](/docs/installation.md). -```shell -# Install from pypi -pip install intel-extension-for-transformers - -# Or, install from source code -cd -pip install -r requirements.txt -pip install -v . -``` - -Install required dependencies for this example -```shell -cd /examples/huggingface/pytorch/text-to-image/deployment/stable_diffusion - -pip install -r requirements.txt -pip install transformers==4.34.1 -pip install diffusers==0.12.1 -``` ->**Note**: Please use transformers no higher than 4.34.1 - -## Environment Variables (Optional) -```shell -# Preload libjemalloc.so may improve the performance when inference under multi instance. -conda install jemalloc==5.2.1 -c conda-forge -y -export LD_PRELOAD=${LD_PRELOAD}:${CONDA_PREFIX}/lib/libjemalloc.so - -# Using weight sharing can save memory and may improve the performance when multi instances. -export WEIGHT_SHARING=1 -export INST_NUM= -``` ->**Note**: This step is optional. -# End-to-End Workflow -## 1. Prepare Models - -The stable diffusion mainly includes three sub models: -1. Text Encoder -2. Unet -3. Vae Decoder. - -Here we take the [CompVis/stable-diffusion-v1-4](https://huggingface.co/CompVis/stable-diffusion-v1-4) as an example. - -### 1.1 Download Models -Export FP32 ONNX models from the hugginface diffusers module, command as follows: - -```python -python prepare_model.py --input_model=CompVis/stable-diffusion-v1-4 --output_path=./model -``` - -By setting --bf16 to export FP32 and BF16 models. -```python -python prepare_model.py --input_model=CompVis/stable-diffusion-v1-4 --output_path=./model --bf16 -``` - -For INT8 quantized mode, we **only support runwayml/stable-diffusion-v1-5** for now. -You need to get a quantized INT8 model first through QAT, Please refer the [link](https://github.com/intel/intel-extension-for-transformers/blob/main/examples/huggingface/pytorch/text-to-image/quantization/qat/README.md). -Then by setting --qat_int8 to export INT8 models, to export INT8 model. -```python -python prepare_model.py --input_model=runwayml/stable-diffusion-v1-5 --output_path=./model --qat_int8 -``` - -### 1.2 Compile Models - -Export three FP32 onnx sub models of the stable diffusion to Nerual Engine IR. - -```bash -# running the follow bash command to get all IR. -bash export_model.sh --input_model=model --precision=fp32 -``` - -Export three BF16 onnx sub models of the stable diffusion to Nerual Engine IR. - -```bash -# running the follow bash command to get all IR. -bash export_model.sh --input_model=model --precision=bf16 -``` - -Export mixed FP32 & dynamic quantized Int8 IR. - -```bash -bash export_model.sh --input_model=model --precision=fp32 --cast_type=dynamic_int8 -``` - -Export mixed BF16 & QAT quantized Int8 IR. -```bash -bash export_model.sh --input_model=model --precision=qat_int8 -``` - -## 2. Performance - -Python API command as follows: -```python -# FP32 IR -python run_executor.py --ir_path=./fp32_ir --mode=latency --input_model=CompVis/stable-diffusion-v1-4 - -# Mixed FP32 & dynamic quantized Int8 IR. -python run_executor.py --ir_path=./fp32_dynamic_int8_ir --mode=latency --input_model=CompVis/stable-diffusion-v1-4 - -# BF16 IR -python run_executor.py --ir_path=./bf16_ir --mode=latency --input_model=CompVis/stable-diffusion-v1-4 - -# QAT INT8 IR -python run_executor.py --ir_path=./qat_int8_ir --mode=latency --input_model=runwayml/stable-diffusion-v1-5 -``` - -## 3. Accuracy -Frechet Inception Distance(FID) metric is used to evaluate the accuracy. This case we check the FID scores between the pytorch image and engine image. - -By setting --accuracy to check FID socre. -Python API command as follows: -```python -# FP32 IR -python run_executor.py --ir_path=./fp32_ir --mode=accuracy --input_model=CompVis/stable-diffusion-v1-4 - -# Mixed FP32 & dynamic quantized Int8 IR -python run_executor.py --ir_path=./fp32_dynamic_int8_ir --mode=accuracy --input_model=CompVis/stable-diffusion-v1-4 - -# BF16 IR -python run_executor.py --ir_path=./bf16_ir --mode=accuracy --input_model=CompVis/stable-diffusion-v1-4 - -# QAT INT8 IR -python run_executor.py --ir_path=./qat_int8_ir --mode=accuracy --input_model=runwayml/stable-diffusion-v1-5 -``` - -## 4. Try Text to Image - -### 4.1 Text2Img - -Try using one sentence to create a picture! - -```python -# Running FP32 models or BF16 models, just import different IR. -# FP32 models -# Note: -# 1. Using --image to set the path of your image, here we use the default download link. -# 2. The default image is "https://hf.co/datasets/diffusers/diffusers-images-docs/resolve/main/mountain.png". -# 3. The default prompt is "Cartoonize the following image". - -python run_executor.py --ir_path=./fp32_ir --input_model=CompVis/stable-diffusion-v1-4 -``` -![picture1](./images/astronaut_rides_horse.png) - -```python -# BF16 models -python run_executor.py --ir_path=./bf16_ir --input_model=CompVis/stable-diffusion-v1-4 -``` -![picture2](./images/astronaut_rides_horse_from_engine_1.png) - - -### 4.2 Img2Img: instruction-tuning-sd - -Try using one image and prompts to create a new picture! - -```python -# Running FP32 models or BF16 models, just import different IR. -# BF16 models -python run_executor.py --ir_path=./bf16_ir --input_model=instruction-tuning-sd/cartoonizer --pipeline=instruction-tuning-sd --prompts="Cartoonize the following image" --steps=100 -``` - -Original image: - -![picture3](./images/mountain.png) - -Cartoonized image: - -![picture4](./images/mountain_cartoonized.png) - - -## 5. Validated Result - - -### 5.1 Latency (s) - - -Input: a photo of an astronaut riding a horse on mars - -Batch Size: 1 - - -| Model | FP32 | BF16 | -|---------------------|:----------------------:|-----------------------| -| [CompVis/stable-diffusion-v1-4](https://huggingface.co/CompVis/stable-diffusion-v1-4) | 10.33 (s) | 3.02 (s) | - -> Note: Performance results test on ​​06/09/2023 with Intel(R) Xeon(R) Platinum 8480+. -Performance varies by use, configuration and other factors. See platform configuration for configuration details. For more complete information about performance and benchmark results, visit www.intel.com/benchmarks - - - -### 5.2 Platform Configuration - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ManufacturerQuanta Cloud Technology Inc
    Product NameQuantaGrid D54Q-2U
    OSCentOS Stream 8
    Kernel5.16.0-rc1-intel-next-00543-g5867b0a2a125
    Microcode0x2b000111
    IRQ BalanceEnabled
    CPU ModelIntel(R) Xeon(R) Platinum 8480+
    Base Frequency2.0GHz
    Maximum Frequency3.8GHz
    CPU(s)224
    Thread(s) per Core2
    Core(s) per Socket56
    Socket(s)2
    NUMA Node(s)2
    TurboEnabled
    FrequencyGovernerPerformance
    diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils.py deleted file mode 100644 index f7e7b0ddd6d..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils.py +++ /dev/null @@ -1,696 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import inspect -from typing import Callable, List, Optional, Union -import torch -import numpy as np -import copy - -from packaging import version -from transformers import CLIPFeatureExtractor, CLIPTextModel, CLIPTokenizer - -from intel_extension_for_transformers.transformers.runtime.compile.graph import Graph - -from diffusers.configuration_utils import FrozenDict -from diffusers.models import AutoencoderKL, UNet2DConditionModel -from diffusers.schedulers import KarrasDiffusionSchedulers -from diffusers.utils import deprecate, is_accelerate_available, logging, randn_tensor, replace_example_docstring -from diffusers.pipeline_utils import DiffusionPipeline -from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput -from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker - -logger = logging.get_logger(__name__) # pylint: disable=invalid-name - -EXAMPLE_DOC_STRING = """ - Examples: - ```py - >>> import torch - >>> from diffusers import StableDiffusionPipeline - - >>> pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16) - >>> pipe = pipe.to("cuda") - - >>> prompt = "a photo of an astronaut riding a horse on mars" - >>> image = pipe(prompt).images[0] - ``` -""" - - -class StableDiffusionPipeline(DiffusionPipeline): - r""" - Pipeline for text-to-image generation using Stable Diffusion. - - This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods the - library implements for all the pipelines (such as downloading or saving, running on a particular device, etc.) - - Args: - vae ([`AutoencoderKL`]): - Variational Auto-Encoder (VAE) Model to encode and decode images to and from latent representations. - text_encoder ([`CLIPTextModel`]): - Frozen text-encoder. Stable Diffusion uses the text portion of - [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPTextModel), specifically - the [clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14) variant. - tokenizer (`CLIPTokenizer`): - Tokenizer of class - [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer). - unet ([`UNet2DConditionModel`]): Conditional U-Net architecture to denoise the encoded image latents. - scheduler ([`SchedulerMixin`]): - A scheduler to be used in combination with `unet` to denoise the encoded image latents. Can be one of - [`DDIMScheduler`], [`LMSDiscreteScheduler`], or [`PNDMScheduler`]. - safety_checker ([`StableDiffusionSafetyChecker`]): - Classification module that estimates whether generated images could be considered offensive or harmful. - Please, refer to the [model card](https://huggingface.co/runwayml/stable-diffusion-v1-5) for details. - feature_extractor ([`CLIPFeatureExtractor`]): - Model that extracts features from generated images to be used as inputs for the `safety_checker`. - """ - _optional_components = ["safety_checker", "feature_extractor"] - - def __init__( - self, - vae: AutoencoderKL, - text_encoder: CLIPTextModel, - tokenizer: CLIPTokenizer, - unet: UNet2DConditionModel, - scheduler: KarrasDiffusionSchedulers, - safety_checker: StableDiffusionSafetyChecker, - feature_extractor: CLIPFeatureExtractor, - requires_safety_checker: bool = True, - ): - super().__init__() - - if hasattr(scheduler.config, "steps_offset") and scheduler.config.steps_offset != 1: - deprecation_message = ( - f"The configuration file of this scheduler: {scheduler} is outdated. `steps_offset`" - f" should be set to 1 instead of {scheduler.config.steps_offset}. Please make sure " - "to update the config accordingly as leaving `steps_offset` might led to incorrect results" - " in future versions. If you have downloaded this checkpoint from the Hugging Face Hub," - " it would be very nice if you could open a Pull request for the `scheduler/scheduler_config.json`" - " file") - deprecate("steps_offset!=1", "1.0.0", deprecation_message, standard_warn=False) - new_config = dict(scheduler.config) - new_config["steps_offset"] = 1 - scheduler._internal_dict = FrozenDict(new_config) - - if hasattr(scheduler.config, "clip_sample") and scheduler.config.clip_sample is True: - deprecation_message = ( - f"The configuration file of this scheduler: {scheduler} has not set the configuration `clip_sample`." - " `clip_sample` should be set to False in the configuration file. Please make sure to update the" - " config accordingly as not setting `clip_sample` in the config might lead to incorrect results in" - " future versions. If you have downloaded this checkpoint from the Hugging Face Hub, it would be very" - " nice if you could open a Pull request for the `scheduler/scheduler_config.json` file") - deprecate("clip_sample not set", "1.0.0", deprecation_message, standard_warn=False) - new_config = dict(scheduler.config) - new_config["clip_sample"] = False - scheduler._internal_dict = FrozenDict(new_config) - - if safety_checker is None and requires_safety_checker: - logger.warning( - f"You have disabled the safety checker for {self.__class__} by passing `safety_checker=None`. Ensure" - " that you abide to the conditions of the Stable Diffusion license and do not expose unfiltered" - " results in services or applications open to the public. Both the diffusers team and Hugging Face" - " strongly recommend to keep the safety filter enabled in all public facing circumstances, disabling" - " it only for use-cases that involve analyzing network behavior or auditing its results. For more" - " information, please have a look at https://github.com/huggingface/diffusers/pull/254 .") - - if safety_checker is not None and feature_extractor is None: - raise ValueError( - "Make sure to define a feature extractor when loading {self.__class__} if you want to use the safety" - " checker. If you do not want to use the safety checker, you can pass `'safety_checker=None'` instead." - ) - - is_unet_version_less_0_9_0 = hasattr(unet.config, "_diffusers_version") and version.parse( - version.parse(unet.config._diffusers_version).base_version) < version.parse("0.9.0.dev0") - is_unet_sample_size_less_64 = hasattr(unet.config, "sample_size") and unet.config.sample_size < 64 - if is_unet_version_less_0_9_0 and is_unet_sample_size_less_64: - deprecation_message = ( - "The configuration file of the unet has set the default `sample_size` to smaller than" - " 64 which seems highly unlikely. If your checkpoint is a fine-tuned version of any of the" - " following: \n- CompVis/stable-diffusion-v1-4 \n- CompVis/stable-diffusion-v1-3 \n-" - " CompVis/stable-diffusion-v1-2 \n- CompVis/stable-diffusion-v1-1 \n- runwayml/stable-diffusion-v1-5" - " \n- runwayml/stable-diffusion-inpainting \n you should change 'sample_size' to 64 in the" - " configuration file. Please make sure to update the config accordingly as leaving `sample_size=32`" - " in the config might lead to incorrect results in future versions. If you have downloaded this" - " checkpoint from the Hugging Face Hub, it would be very nice if you could open a Pull request for" - " the `unet/config.json` file") - deprecate("sample_size<64", "1.0.0", deprecation_message, standard_warn=False) - new_config = dict(unet.config) - new_config["sample_size"] = 64 - unet._internal_dict = FrozenDict(new_config) - - self.register_modules( - vae=vae, - text_encoder=text_encoder, - tokenizer=tokenizer, - unet=unet, - scheduler=scheduler, - safety_checker=safety_checker, - feature_extractor=feature_extractor, - ) - self.vae_scale_factor = 2**(len(self.vae.config.block_out_channels) - 1) - self.register_to_config(requires_safety_checker=requires_safety_checker) - - def enable_vae_slicing(self): - r""" - Enable sliced VAE decoding. - - When this option is enabled, the VAE will split the input tensor in slices to compute decoding in several - steps. This is useful to save some memory and allow larger batch sizes. - """ - self.vae.enable_slicing() - - def disable_vae_slicing(self): - r""" - Disable sliced VAE decoding. If `enable_vae_slicing` was previously invoked, this method will go back to - computing decoding in one step. - """ - self.vae.disable_slicing() - - def enable_sequential_cpu_offload(self, gpu_id=0): - r""" - Offloads all models to CPU using accelerate, significantly reducing memory usage. When called, unet, - text_encoder, vae and safety checker have their state dicts saved to CPU and then are moved to a - `torch.device('meta') and loaded to GPU only when their specific submodule has its `forward` method called. - """ - if is_accelerate_available(): - from accelerate import cpu_offload - else: - raise ImportError("Please install accelerate via `pip install accelerate`") - - device = torch.device(f"cuda:{gpu_id}") - - for cpu_offloaded_model in [self.unet, self.text_encoder, self.vae]: - cpu_offload(cpu_offloaded_model, device) - - if self.safety_checker is not None: - cpu_offload(self.safety_checker, execution_device=device, offload_buffers=True) - - @property - def _execution_device(self): - r""" - Returns the device on which the pipeline's models will be executed. After calling - `pipeline.enable_sequential_cpu_offload()` the execution device can only be inferred from Accelerate's module - hooks. - """ - if self.device != torch.device("meta") or not hasattr(self.unet, "_hf_hook"): - return self.device - for module in self.unet.modules(): - if (hasattr(module, "_hf_hook") and hasattr(module._hf_hook, "execution_device") - and module._hf_hook.execution_device is not None): - return torch.device(module._hf_hook.execution_device) - return self.device - - def _encode_prompt( - self, - text_encoder_graph, - prompt, - device, - num_images_per_prompt, - do_classifier_free_guidance, - negative_prompt=None, - prompt_embeds: Optional[torch.FloatTensor] = None, - negative_prompt_embeds: Optional[torch.FloatTensor] = None, - ): - r""" - Encodes the prompt into text encoder hidden states. - - Args: - prompt (`str` or `List[str]`, *optional*): - prompt to be encoded - device: (`torch.device`): - torch device - num_images_per_prompt (`int`): - number of images that should be generated per prompt - do_classifier_free_guidance (`bool`): - whether to use classifier free guidance or not - negative_ prompt (`str` or `List[str]`, *optional*): - The prompt or prompts not to guide the image generation. If not defined, one has to pass - `negative_prompt_embeds`. instead. If not defined, one has to pass `negative_prompt_embeds`. instead. - Ignored when not using guidance (i.e., ignored if `guidance_scale` is less than `1`). - prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not - provided, text embeddings will be generated from `prompt` input argument. - negative_prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt - weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input - argument. - """ - if prompt is not None and isinstance(prompt, str): - batch_size = 1 - elif prompt is not None and isinstance(prompt, list): - batch_size = len(prompt) - else: - batch_size = prompt_embeds.shape[0] - - if prompt_embeds is None: - text_inputs = self.tokenizer( - prompt, - padding="max_length", - max_length=self.tokenizer.model_max_length, - truncation=True, - return_tensors="pt", - ) - text_input_ids = text_inputs.input_ids - untruncated_ids = self.tokenizer(prompt, padding="longest", return_tensors="pt").input_ids - - if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal( - text_input_ids, untruncated_ids): - removed_text = self.tokenizer.batch_decode( - untruncated_ids[:, self.tokenizer.model_max_length - 1:-1]) - logger.warning( - "The following part of your input was truncated because CLIP can only handle sequences up to" - f" {self.tokenizer.model_max_length} tokens: {removed_text}") - - if hasattr(self.text_encoder.config, - "use_attention_mask") and self.text_encoder.config.use_attention_mask: - attention_mask = text_inputs.attention_mask.to(device) - else: - attention_mask = None - - # The ITREX Text Encdoer Code - prompt_embeds = text_encoder_graph.inference([text_input_ids]) - bsz, seq_length = text_input_ids.shape - encoder_hidden_state = prompt_embeds['last_hidden_state:0'] - if encoder_hidden_state.dtype == np.int16: - prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) - prompt_embeds = torch.from_numpy(prompt_embeds['last_hidden_state:0']).reshape( - bsz, seq_length, -1) - - # Original Pytorch Diffuser Text Encoder Code - # prompt_embeds = self.text_encoder( - # text_input_ids.to(device), - # attention_mask=attention_mask, - # ) - # prompt_embeds = prompt_embeds[0] - - prompt_embeds = prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) - - bs_embed, seq_len, _ = prompt_embeds.shape - # duplicate text embeddings for each generation per prompt, using mps friendly method - prompt_embeds = prompt_embeds.repeat(1, num_images_per_prompt, 1) - prompt_embeds = prompt_embeds.view(bs_embed * num_images_per_prompt, seq_len, -1) - - # get unconditional embeddings for classifier free guidance - if do_classifier_free_guidance and negative_prompt_embeds is None: - uncond_tokens: List[str] - if negative_prompt is None: - uncond_tokens = [""] * batch_size - elif type(prompt) is not type(negative_prompt): - raise TypeError( - f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !=" - f" {type(prompt)}.") - elif isinstance(negative_prompt, str): - uncond_tokens = [negative_prompt] - elif batch_size != len(negative_prompt): - raise ValueError( - f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:" - f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches" - " the batch size of `prompt`.") - else: - uncond_tokens = negative_prompt - - max_length = prompt_embeds.shape[1] - uncond_input = self.tokenizer( - uncond_tokens, - padding="max_length", - max_length=max_length, - truncation=True, - return_tensors="pt", - ) - - if hasattr(self.text_encoder.config, - "use_attention_mask") and self.text_encoder.config.use_attention_mask: - attention_mask = uncond_input.attention_mask.to(device) - else: - attention_mask = None - - # The ITREX Text Encdoer Code - negative_prompt_embeds = text_encoder_graph.inference([uncond_input.input_ids]) - bsz, seq_length = uncond_input.input_ids.shape - encoder_hidden_state = negative_prompt_embeds['last_hidden_state:0'] - if encoder_hidden_state.dtype == np.int16: - negative_prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) - negative_prompt_embeds = torch.from_numpy(negative_prompt_embeds['last_hidden_state:0']).reshape( - bsz, seq_length, -1) - - if do_classifier_free_guidance: - # duplicate unconditional embeddings for each generation per prompt, using mps friendly method - seq_len = negative_prompt_embeds.shape[1] - - negative_prompt_embeds = negative_prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) - - negative_prompt_embeds = negative_prompt_embeds.repeat(1, num_images_per_prompt, 1) - negative_prompt_embeds = negative_prompt_embeds.view(batch_size * num_images_per_prompt, seq_len, - -1) - - # For classifier free guidance, we need to do two forward passes. - # Here we concatenate the unconditional and text embeddings into a single batch - # to avoid doing two forward passes - prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds]) - - return prompt_embeds - - def run_safety_checker(self, image, device, dtype): - if self.safety_checker is not None: - safety_checker_input = self.feature_extractor(self.numpy_to_pil(image), - return_tensors="pt").to(device) - image, has_nsfw_concept = self.safety_checker( - images=image, clip_input=safety_checker_input.pixel_values.to(dtype)) - else: - has_nsfw_concept = None - return image, has_nsfw_concept - - def decode_latents(self, latents, vae_decoder_graph): - latents = 1 / 0.18215 * latents - # Original Pytorch Diffuser Vae Code - # image = self.vae.decode(latents).sample - - # The ITREX Vae Codes - output = vae_decoder_graph.inference([latents]) - image = torch.from_numpy(output['sample:0']) - - image = (image / 2 + 0.5).clamp(0, 1) - # we always cast to float32 as this does not cause significant overhead and is compatible with bfloa16 - image = image.cpu().permute(0, 2, 3, 1).float().numpy() - return image - - def prepare_extra_step_kwargs(self, generator, eta): - # prepare extra kwargs for the scheduler step, since not all schedulers have the same signature - # eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers. - # eta corresponds to η in DDIM paper: https://arxiv.org/abs/2010.02502 - # and should be between [0, 1] - - accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys()) - extra_step_kwargs = {} - if accepts_eta: - extra_step_kwargs["eta"] = eta - - # check if the scheduler accepts generator - accepts_generator = "generator" in set(inspect.signature(self.scheduler.step).parameters.keys()) - if accepts_generator: - extra_step_kwargs["generator"] = generator - return extra_step_kwargs - - def check_inputs( - self, - prompt, - height, - width, - callback_steps, - negative_prompt=None, - prompt_embeds=None, - negative_prompt_embeds=None, - ): - if height % 8 != 0 or width % 8 != 0: - raise ValueError(f"`height` and `width` have to be divisible by 8 but are {height} and {width}.") - - if (callback_steps is None) or (callback_steps is not None and - (not isinstance(callback_steps, int) or callback_steps <= 0)): - raise ValueError(f"`callback_steps` has to be a positive integer but is {callback_steps} of type" - f" {type(callback_steps)}.") - - if prompt is not None and prompt_embeds is not None: - raise ValueError( - f"Cannot forward both `prompt`: {prompt} and `prompt_embeds`: {prompt_embeds}. Please make sure to" - " only forward one of the two.") - elif prompt is None and prompt_embeds is None: - raise ValueError( - "Provide either `prompt` or `prompt_embeds`. Cannot leave both `prompt` and `prompt_embeds` undefined." - ) - elif prompt is not None and (not isinstance(prompt, str) and not isinstance(prompt, list)): - raise ValueError(f"`prompt` has to be of type `str` or `list` but is {type(prompt)}") - - if negative_prompt is not None and negative_prompt_embeds is not None: - raise ValueError( - f"Cannot forward both `negative_prompt`: {negative_prompt} and `negative_prompt_embeds`:" - f" {negative_prompt_embeds}. Please make sure to only forward one of the two.") - - if prompt_embeds is not None and negative_prompt_embeds is not None: - if prompt_embeds.shape != negative_prompt_embeds.shape: - raise ValueError( - "`prompt_embeds` and `negative_prompt_embeds` must have the same shape when passed directly, but" - f" got: `prompt_embeds` {prompt_embeds.shape} != `negative_prompt_embeds`" - f" {negative_prompt_embeds.shape}.") - - def prepare_latents(self, - batch_size, - num_channels_latents, - height, - width, - dtype, - device, - generator, - latents=None): - shape = (batch_size, num_channels_latents, height // self.vae_scale_factor, - width // self.vae_scale_factor) - if isinstance(generator, list) and len(generator) != batch_size: - raise ValueError( - f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" - f" size of {batch_size}. Make sure the batch size matches the length of the generators.") - - if latents is None: - latents = randn_tensor(shape, generator=generator, device=device, dtype=dtype) - else: - latents = latents.to(device) - - # scale the initial noise by the standard deviation required by the scheduler - latents = latents * self.scheduler.init_noise_sigma - return latents - - @torch.no_grad() - @replace_example_docstring(EXAMPLE_DOC_STRING) - def __call__( - self, - prompt: Union[str, List[str]] = None, - height: Optional[int] = None, - width: Optional[int] = None, - num_inference_steps: int = 50, - guidance_scale: float = 7.5, - negative_prompt: Optional[Union[str, List[str]]] = None, - num_images_per_prompt: Optional[int] = 1, - eta: float = 0.0, - generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, - latents: Optional[torch.FloatTensor] = None, - prompt_embeds: Optional[torch.FloatTensor] = None, - negative_prompt_embeds: Optional[torch.FloatTensor] = None, - output_type: Optional[str] = "pil", - return_dict: bool = True, - callback: Optional[Callable[[int, int, torch.FloatTensor], None]] = None, - callback_steps: Optional[int] = 1, - engine_graph: Optional[list] = [], - ): - r""" - Function invoked when calling the pipeline for generation. - - Args: - prompt (`str` or `List[str]`, *optional*): - The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`. - instead. - height (`int`, *optional*, defaults to self.unet.config.sample_size * self.vae_scale_factor): - The height in pixels of the generated image. - width (`int`, *optional*, defaults to self.unet.config.sample_size * self.vae_scale_factor): - The width in pixels of the generated image. - num_inference_steps (`int`, *optional*, defaults to 50): - The number of denoising steps. More denoising steps usually lead to a higher quality image at the - expense of slower inference. - guidance_scale (`float`, *optional*, defaults to 7.5): - Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598). - `guidance_scale` is defined as `w` of equation 2. of [Imagen - Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale > - 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, - usually at the expense of lower image quality. - negative_prompt (`str` or `List[str]`, *optional*): - The prompt or prompts not to guide the image generation. If not defined, one has to pass - `negative_prompt_embeds`. instead. If not defined, one has to pass `negative_prompt_embeds`. instead. - Ignored when not using guidance (i.e., ignored if `guidance_scale` is less than `1`). - num_images_per_prompt (`int`, *optional*, defaults to 1): - The number of images to generate per prompt. - eta (`float`, *optional*, defaults to 0.0): - Corresponds to parameter eta (η) in the DDIM paper: https://arxiv.org/abs/2010.02502. Only applies to - [`schedulers.DDIMScheduler`], will be ignored for others. - generator (`torch.Generator` or `List[torch.Generator]`, *optional*): - One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html) - to make generation deterministic. - latents (`torch.FloatTensor`, *optional*): - Pre-generated noisy latents, sampled from a Gaussian distribution, to be used as inputs for image - generation. Can be used to tweak the same generation with different prompts. If not provided, a latents - tensor will ge generated by sampling using the supplied random `generator`. - prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not - provided, text embeddings will be generated from `prompt` input argument. - negative_prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt - weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input - argument. - output_type (`str`, *optional*, defaults to `"pil"`): - The output format of the generate image. Choose between - [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` or `np.array`. - return_dict (`bool`, *optional*, defaults to `True`): - Whether or not to return a [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] instead of a - plain tuple. - callback (`Callable`, *optional*): - A function that will be called every `callback_steps` steps during inference. The function will be - called with the following arguments: `callback(step: int, timestep: int, latents: torch.FloatTensor)`. - callback_steps (`int`, *optional*, defaults to 1): - The frequency at which the `callback` function will be called. If not specified, the callback will be - called at every step. - - Examples: - - Returns: - [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] or `tuple`: - [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] if `return_dict` is True, otherwise a `tuple. - When returning a tuple, the first element is a list with the generated images, and the second element is a - list of `bool`s denoting whether the corresponding generated image likely represents "not-safe-for-work" - (nsfw) content, according to the `safety_checker`. - """ - # 0. Default height and width to unet - height = height or self.unet.config.sample_size * self.vae_scale_factor - width = width or self.unet.config.sample_size * self.vae_scale_factor - - # 1. Check inputs. Raise error if not correct - self.check_inputs(prompt, height, width, callback_steps, negative_prompt, prompt_embeds, - negative_prompt_embeds) - - # 2. Define call parameters - if prompt is not None and isinstance(prompt, str): - batch_size = 1 - elif prompt is not None and isinstance(prompt, list): - batch_size = len(prompt) - else: - batch_size = prompt_embeds.shape[0] - - device = self._execution_device - # here `guidance_scale` is defined analog to the guidance weight `w` of equation (2) - # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . `guidance_scale = 1` - # corresponds to doing no classifier free guidance. - do_classifier_free_guidance = guidance_scale > 1.0 - - # 3. Encode input prompt - prompt_embeds = self._encode_prompt( - engine_graph[0], - prompt, - device, - num_images_per_prompt, - do_classifier_free_guidance, - negative_prompt, - prompt_embeds=prompt_embeds, - negative_prompt_embeds=negative_prompt_embeds, - ) - - # 4. Prepare timesteps - self.scheduler.set_timesteps(num_inference_steps, device=device) - timesteps = self.scheduler.timesteps - # 5. Prepare latent variables - num_channels_latents = self.unet.in_channels - latents = self.prepare_latents( - batch_size * num_images_per_prompt, - num_channels_latents, - height, - width, - prompt_embeds.dtype, - device, - generator, - latents, - ) - - # 6. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline - extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) - - # 7. Denoising loop - num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order - with self.progress_bar(total=num_inference_steps) as progress_bar: - for i, t in enumerate(timesteps): - # expand the latents if we are doing classifier free guidance - latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents - latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) - - # Original Pytorch Diffuser Unet Code: predict the noise residual - # noise_pred = self.unet(latent_model_input, t, encoder_hidden_states=prompt_embeds).sample - - # The ITREX Unet Code - t_1d = torch.tensor([t], dtype=torch.float32) - engine_output = engine_graph[1].inference([latent_model_input, t_1d, prompt_embeds]) - noise_pred = torch.from_numpy(engine_output['out_sample:0']) - - # perform guidance - if do_classifier_free_guidance: - noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) - noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) - - # compute the previous noisy sample x_t -> x_t-1 - latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample - - # call the callback, if provided - if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and - (i + 1) % self.scheduler.order == 0): - progress_bar.update() - if callback is not None and i % callback_steps == 0: - callback(i, t, latents) - - # 8. Post-processing - image = self.decode_latents(latents, engine_graph[2]) - - # 9. Run safety checker - image, has_nsfw_concept = self.run_safety_checker(image, device, prompt_embeds.dtype) - - # 10. Convert to PIL - if output_type == "pil": - image = self.numpy_to_pil(image) - - if not return_dict: - return (image, has_nsfw_concept) - - return StableDiffusionPipelineOutput(images=image, nsfw_content_detected=has_nsfw_concept) - - -def neural_engine_init(ir_path): - text_encoder_graph = Graph() - text_encoder_path = ir_path + '/text_encoder/' - text_encoder_conf = text_encoder_path + 'conf.yaml' - text_encoder_bin = text_encoder_path + 'model.bin' - text_encoder_graph.graph_init(text_encoder_conf, text_encoder_bin) - - unet_graph = Graph() - uent_path = ir_path + '/unet/' - unet_conf = uent_path + 'conf.yaml' - unet_bin = uent_path + 'model.bin' - unet_graph.graph_init(unet_conf, unet_bin, True) - - vae_decoder_graph = Graph() - vae_decoder_path = ir_path + '/vae_decoder/' - vae_decoder_conf = vae_decoder_path + 'conf.yaml' - vae_decoder_bin = vae_decoder_path + 'model.bin' - vae_decoder_graph.graph_init(vae_decoder_conf, vae_decoder_bin) - - return [text_encoder_graph, unet_graph, vae_decoder_graph] - -def fp32_to_bf16(fp32_np): - assert(fp32_np.dtype==np.float32) - temp = copy.deepcopy(fp32_np) - int32_np = temp.view(dtype=np.int32) - int32_np = int32_np >> 16 - bf16_np = int32_np.astype(np.uint16) - return bf16_np - -def bf16_to_fp32(bf16_np): - assert(bf16_np.dtype==np.int16) - temp = copy.deepcopy(bf16_np) - int32_np = temp.astype(dtype=np.int32) - int32_np = int32_np << 16 - fp32_np = int32_np.view(np.float32) - return fp32_np diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils_img2img.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils_img2img.py deleted file mode 100644 index e464b07acef..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/diffusion_utils_img2img.py +++ /dev/null @@ -1,755 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Pipeline Modificaiton based from the diffusers 0.12.1 StableDiffusionImg2ImgPipeline""" - -import inspect -from typing import Callable, List, Optional, Union - -import numpy as np -import torch -import copy -import PIL -from packaging import version -from transformers import CLIPFeatureExtractor, CLIPTextModel, CLIPTokenizer - -from diffusers.configuration_utils import FrozenDict -from diffusers.models import AutoencoderKL, UNet2DConditionModel -from diffusers.schedulers import KarrasDiffusionSchedulers -from diffusers.utils import ( - PIL_INTERPOLATION, - deprecate, - is_accelerate_available, - logging, - randn_tensor, - replace_example_docstring, -) -from diffusers.pipeline_utils import DiffusionPipeline -from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput -from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker - - -logger = logging.get_logger(__name__) # pylint: disable=invalid-name - -EXAMPLE_DOC_STRING = """ - Examples: - ```py - >>> import requests - >>> import torch - >>> from PIL import Image - >>> from io import BytesIO - - >>> from diffusers import StableDiffusionImg2ImgPipeline - - >>> device = "cuda" - >>> model_id_or_path = "runwayml/stable-diffusion-v1-5" - >>> pipe = StableDiffusionImg2ImgPipeline.from_pretrained(model_id_or_path, torch_dtype=torch.float16) - >>> pipe = pipe.to(device) - - >>> url = "https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg" - - >>> response = requests.get(url) - >>> init_image = Image.open(BytesIO(response.content)).convert("RGB") - >>> init_image = init_image.resize((768, 512)) - - >>> prompt = "A fantasy landscape, trending on artstation" - - >>> images = pipe(prompt=prompt, image=init_image, strength=0.75, guidance_scale=7.5).images - >>> images[0].save("fantasy_landscape.png") - ``` -""" - - -def preprocess(image): - if isinstance(image, torch.Tensor): - return image - elif isinstance(image, PIL.Image.Image): - image = [image] - - if isinstance(image[0], PIL.Image.Image): - w, h = image[0].size - w, h = map(lambda x: x - x % 8, (w, h)) # resize to integer multiple of 8 - - image = [np.array(i.resize((w, h), resample=PIL_INTERPOLATION["lanczos"]))[None, :] for i in image] - image = np.concatenate(image, axis=0) - image = np.array(image).astype(np.float32) / 255.0 - image = image.transpose(0, 3, 1, 2) - image = 2.0 * image - 1.0 - image = torch.from_numpy(image) - elif isinstance(image[0], torch.Tensor): - image = torch.cat(image, dim=0) - return image - - -class StableDiffusionImg2ImgPipeline(DiffusionPipeline): - r""" - Pipeline for text-guided image to image generation using Stable Diffusion. - - This model inherits from [`DiffusionPipeline`]. Check the superclass documentation for the generic methods the - library implements for all the pipelines (such as downloading or saving, running on a particular device, etc.) - - Args: - vae ([`AutoencoderKL`]): - Variational Auto-Encoder (VAE) Model to encode and decode images to and from latent representations. - text_encoder ([`CLIPTextModel`]): - Frozen text-encoder. Stable Diffusion uses the text portion of - [CLIP](https://huggingface.co/docs/transformers/model_doc/clip#transformers.CLIPTextModel), specifically - the [clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14) variant. - tokenizer (`CLIPTokenizer`): - Tokenizer of class - [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer). - unet ([`UNet2DConditionModel`]): Conditional U-Net architecture to denoise the encoded image latents. - scheduler ([`SchedulerMixin`]): - A scheduler to be used in combination with `unet` to denoise the encoded image latents. Can be one of - [`DDIMScheduler`], [`LMSDiscreteScheduler`], or [`PNDMScheduler`]. - safety_checker ([`StableDiffusionSafetyChecker`]): - Classification module that estimates whether generated images could be considered offensive or harmful. - Please, refer to the [model card](https://huggingface.co/runwayml/stable-diffusion-v1-5) for details. - feature_extractor ([`CLIPFeatureExtractor`]): - Model that extracts features from generated images to be used as inputs for the `safety_checker`. - """ - _optional_components = ["safety_checker", "feature_extractor"] - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.__init__ - def __init__( - self, - vae: AutoencoderKL, - text_encoder: CLIPTextModel, - tokenizer: CLIPTokenizer, - unet: UNet2DConditionModel, - scheduler: KarrasDiffusionSchedulers, - safety_checker: StableDiffusionSafetyChecker, - feature_extractor: CLIPFeatureExtractor, - requires_safety_checker: bool = True, - ): - super().__init__() - - if hasattr(scheduler.config, "steps_offset") and scheduler.config.steps_offset != 1: - deprecation_message = ( - f"The configuration file of this scheduler: {scheduler} is outdated. `steps_offset`" - f" should be set to 1 instead of {scheduler.config.steps_offset}. Please make sure " - "to update the config accordingly as leaving `steps_offset` might led to incorrect results" - " in future versions. If you have downloaded this checkpoint from the Hugging Face Hub," - " it would be very nice if you could open a Pull request for the `scheduler/scheduler_config.json`" - " file" - ) - deprecate("steps_offset!=1", "1.0.0", deprecation_message, standard_warn=False) - new_config = dict(scheduler.config) - new_config["steps_offset"] = 1 - scheduler._internal_dict = FrozenDict(new_config) - - if hasattr(scheduler.config, "clip_sample") and scheduler.config.clip_sample is True: - deprecation_message = ( - f"The configuration file of this scheduler: {scheduler} has not set the configuration `clip_sample`." - " `clip_sample` should be set to False in the configuration file. Please make sure to update the" - " config accordingly as not setting `clip_sample` in the config might lead to incorrect results in" - " future versions. If you have downloaded this checkpoint from the Hugging Face Hub, it would be very" - " nice if you could open a Pull request for the `scheduler/scheduler_config.json` file" - ) - deprecate("clip_sample not set", "1.0.0", deprecation_message, standard_warn=False) - new_config = dict(scheduler.config) - new_config["clip_sample"] = False - scheduler._internal_dict = FrozenDict(new_config) - - if safety_checker is None and requires_safety_checker: - logger.warning( - f"You have disabled the safety checker for {self.__class__} by passing `safety_checker=None`. Ensure" - " that you abide to the conditions of the Stable Diffusion license and do not expose unfiltered" - " results in services or applications open to the public. Both the diffusers team and Hugging Face" - " strongly recommend to keep the safety filter enabled in all public facing circumstances, disabling" - " it only for use-cases that involve analyzing network behavior or auditing its results. For more" - " information, please have a look at https://github.com/huggingface/diffusers/pull/254 ." - ) - - if safety_checker is not None and feature_extractor is None: - raise ValueError( - "Make sure to define a feature extractor when loading {self.__class__} if you want to use the safety" - " checker. If you do not want to use the safety checker, you can pass `'safety_checker=None'` instead." - ) - - is_unet_version_less_0_9_0 = hasattr(unet.config, "_diffusers_version") and version.parse( - version.parse(unet.config._diffusers_version).base_version - ) < version.parse("0.9.0.dev0") - is_unet_sample_size_less_64 = hasattr(unet.config, "sample_size") and unet.config.sample_size < 64 - if is_unet_version_less_0_9_0 and is_unet_sample_size_less_64: - deprecation_message = ( - "The configuration file of the unet has set the default `sample_size` to smaller than" - " 64 which seems highly unlikely. If your checkpoint is a fine-tuned version of any of the" - " following: \n- CompVis/stable-diffusion-v1-4 \n- CompVis/stable-diffusion-v1-3 \n-" - " CompVis/stable-diffusion-v1-2 \n- CompVis/stable-diffusion-v1-1 \n- runwayml/stable-diffusion-v1-5" - " \n- runwayml/stable-diffusion-inpainting \n you should change 'sample_size' to 64 in the" - " configuration file. Please make sure to update the config accordingly as leaving `sample_size=32`" - " in the config might lead to incorrect results in future versions. If you have downloaded this" - " checkpoint from the Hugging Face Hub, it would be very nice if you could open a Pull request for" - " the `unet/config.json` file" - ) - deprecate("sample_size<64", "1.0.0", deprecation_message, standard_warn=False) - new_config = dict(unet.config) - new_config["sample_size"] = 64 - unet._internal_dict = FrozenDict(new_config) - - self.register_modules( - vae=vae, - text_encoder=text_encoder, - tokenizer=tokenizer, - unet=unet, - scheduler=scheduler, - safety_checker=safety_checker, - feature_extractor=feature_extractor, - ) - self.vae_scale_factor = 2 ** (len(self.vae.config.block_out_channels) - 1) - self.register_to_config(requires_safety_checker=requires_safety_checker) - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.enable_sequential_cpu_offload - def enable_sequential_cpu_offload(self, gpu_id=0): - r""" - Offloads all models to CPU using accelerate, significantly reducing memory usage. When called, unet, - text_encoder, vae and safety checker have their state dicts saved to CPU and then are moved to a - `torch.device('meta') and loaded to GPU only when their specific submodule has its `forward` method called. - """ - if is_accelerate_available(): - from accelerate import cpu_offload - else: - raise ImportError("Please install accelerate via `pip install accelerate`") - - device = torch.device(f"cuda:{gpu_id}") - - for cpu_offloaded_model in [self.unet, self.text_encoder, self.vae]: - cpu_offload(cpu_offloaded_model, device) - - if self.safety_checker is not None: - cpu_offload(self.safety_checker, execution_device=device, offload_buffers=True) - - @property - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._execution_device - def _execution_device(self): - r""" - Returns the device on which the pipeline's models will be executed. After calling - `pipeline.enable_sequential_cpu_offload()` the execution device can only be inferred from Accelerate's module - hooks. - """ - if self.device != torch.device("meta") or not hasattr(self.unet, "_hf_hook"): - return self.device - for module in self.unet.modules(): - if ( - hasattr(module, "_hf_hook") - and hasattr(module._hf_hook, "execution_device") - and module._hf_hook.execution_device is not None - ): - return torch.device(module._hf_hook.execution_device) - return self.device - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline._encode_prompt - def _encode_prompt( - self, - text_encoder_graph, - prompt, - device, - num_images_per_prompt, - do_classifier_free_guidance, - negative_prompt=None, - prompt_embeds: Optional[torch.FloatTensor] = None, - negative_prompt_embeds: Optional[torch.FloatTensor] = None, - ): - r""" - Encodes the prompt into text encoder hidden states. - - Args: - prompt (`str` or `List[str]`, *optional*): - prompt to be encoded - device: (`torch.device`): - torch device - num_images_per_prompt (`int`): - number of images that should be generated per prompt - do_classifier_free_guidance (`bool`): - whether to use classifier free guidance or not - negative_ prompt (`str` or `List[str]`, *optional*): - The prompt or prompts not to guide the image generation. If not defined, one has to pass - `negative_prompt_embeds`. instead. If not defined, one has to pass `negative_prompt_embeds`. instead. - Ignored when not using guidance (i.e., ignored if `guidance_scale` is less than `1`). - prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not - provided, text embeddings will be generated from `prompt` input argument. - negative_prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt - weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input - argument. - """ - if prompt is not None and isinstance(prompt, str): - batch_size = 1 - elif prompt is not None and isinstance(prompt, list): - batch_size = len(prompt) - else: - batch_size = prompt_embeds.shape[0] - - if prompt_embeds is None: - text_inputs = self.tokenizer( - prompt, - padding="max_length", - max_length=self.tokenizer.model_max_length, - truncation=True, - return_tensors="pt", - ) - text_input_ids = text_inputs.input_ids - untruncated_ids = self.tokenizer(prompt, padding="longest", return_tensors="pt").input_ids - - if untruncated_ids.shape[-1] >= text_input_ids.shape[-1] and not torch.equal( - text_input_ids, untruncated_ids - ): - removed_text = self.tokenizer.batch_decode( - untruncated_ids[:, self.tokenizer.model_max_length - 1 : -1] - ) - logger.warning( - "The following part of your input was truncated because CLIP can only handle sequences up to" - f" {self.tokenizer.model_max_length} tokens: {removed_text}" - ) - - if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: - attention_mask = text_inputs.attention_mask.to(device) - else: - attention_mask = None - - # The ITREX Text Encdoer Code - prompt_embeds = text_encoder_graph.inference([text_input_ids]) - bsz, seq_length = text_input_ids.shape - encoder_hidden_state = prompt_embeds['last_hidden_state:0'] - if encoder_hidden_state.dtype == np.int16: - prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) - prompt_embeds = torch.from_numpy(prompt_embeds['last_hidden_state:0']).reshape( - bsz, seq_length, -1) - - # Original Pytorch Diffuser Text Encoder Code - # prompt_embeds = self.text_encoder( - # text_input_ids.to(device), - # attention_mask=attention_mask, - # ) - # prompt_embeds = prompt_embeds[0] - - prompt_embeds = prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) - - bs_embed, seq_len, _ = prompt_embeds.shape - # duplicate text embeddings for each generation per prompt, using mps friendly method - prompt_embeds = prompt_embeds.repeat(1, num_images_per_prompt, 1) - prompt_embeds = prompt_embeds.view(bs_embed * num_images_per_prompt, seq_len, -1) - - # get unconditional embeddings for classifier free guidance - if do_classifier_free_guidance and negative_prompt_embeds is None: - uncond_tokens: List[str] - if negative_prompt is None: - uncond_tokens = [""] * batch_size - elif type(prompt) is not type(negative_prompt): - raise TypeError( - f"`negative_prompt` should be the same type to `prompt`, but got {type(negative_prompt)} !=" - f" {type(prompt)}." - ) - elif isinstance(negative_prompt, str): - uncond_tokens = [negative_prompt] - elif batch_size != len(negative_prompt): - raise ValueError( - f"`negative_prompt`: {negative_prompt} has batch size {len(negative_prompt)}, but `prompt`:" - f" {prompt} has batch size {batch_size}. Please make sure that passed `negative_prompt` matches" - " the batch size of `prompt`." - ) - else: - uncond_tokens = negative_prompt - - max_length = prompt_embeds.shape[1] - uncond_input = self.tokenizer( - uncond_tokens, - padding="max_length", - max_length=max_length, - truncation=True, - return_tensors="pt", - ) - - if hasattr(self.text_encoder.config, "use_attention_mask") and self.text_encoder.config.use_attention_mask: - attention_mask = uncond_input.attention_mask.to(device) - else: - attention_mask = None - - # The ITREX Text Encdoer Code - negative_prompt_embeds = text_encoder_graph.inference([uncond_input.input_ids]) - bsz, seq_length = uncond_input.input_ids.shape - encoder_hidden_state = negative_prompt_embeds['last_hidden_state:0'] - if encoder_hidden_state.dtype == np.int16: - negative_prompt_embeds['last_hidden_state:0'] = bf16_to_fp32(encoder_hidden_state) - negative_prompt_embeds = torch.from_numpy(negative_prompt_embeds['last_hidden_state:0']).reshape( - bsz, seq_length, -1) - - # Original Pytorch Diffuser Text Encoder Code - # negative_prompt_embeds = self.text_encoder( - # uncond_input.input_ids.to(device), - # attention_mask=attention_mask, - # ) - # negative_prompt_embeds = negative_prompt_embeds[0] - - if do_classifier_free_guidance: - # duplicate unconditional embeddings for each generation per prompt, using mps friendly method - seq_len = negative_prompt_embeds.shape[1] - - negative_prompt_embeds = negative_prompt_embeds.to(dtype=self.text_encoder.dtype, device=device) - - negative_prompt_embeds = negative_prompt_embeds.repeat(1, num_images_per_prompt, 1) - negative_prompt_embeds = negative_prompt_embeds.view(batch_size * num_images_per_prompt, seq_len, -1) - - # For classifier free guidance, we need to do two forward passes. - # Here we concatenate the unconditional and text embeddings into a single batch - # to avoid doing two forward passes - prompt_embeds = torch.cat([negative_prompt_embeds, prompt_embeds]) - - return prompt_embeds - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.run_safety_checker - def run_safety_checker(self, image, device, dtype): - if self.safety_checker is not None: - safety_checker_input = self.feature_extractor(self.numpy_to_pil(image), return_tensors="pt").to(device) - image, has_nsfw_concept = self.safety_checker( - images=image, clip_input=safety_checker_input.pixel_values.to(dtype) - ) - else: - has_nsfw_concept = None - return image, has_nsfw_concept - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.decode_latents - def decode_latents(self, latents, vae_decoder_graph): - latents = 1 / 0.18215 * latents - # Original Pytorch Diffuser Vae Code - # image = self.vae.decode(latents).sample - - # The ITREX Vae Codes - latents = latents.contiguous() - output = vae_decoder_graph.inference([latents]) - image = torch.from_numpy(output['sample:0']) - - image = (image / 2 + 0.5).clamp(0, 1) - # we always cast to float32 as this does not cause significant overhead and is compatible with bfloa16 - image = image.cpu().permute(0, 2, 3, 1).float().numpy() - return image - - # Copied from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion.StableDiffusionPipeline.prepare_extra_step_kwargs - def prepare_extra_step_kwargs(self, generator, eta): - # prepare extra kwargs for the scheduler step, since not all schedulers have the same signature - # eta (η) is only used with the DDIMScheduler, it will be ignored for other schedulers. - # eta corresponds to η in DDIM paper: https://arxiv.org/abs/2010.02502 - # and should be between [0, 1] - - accepts_eta = "eta" in set(inspect.signature(self.scheduler.step).parameters.keys()) - extra_step_kwargs = {} - if accepts_eta: - extra_step_kwargs["eta"] = eta - - # check if the scheduler accepts generator - accepts_generator = "generator" in set(inspect.signature(self.scheduler.step).parameters.keys()) - if accepts_generator: - extra_step_kwargs["generator"] = generator - return extra_step_kwargs - - def check_inputs( - self, prompt, strength, callback_steps, negative_prompt=None, prompt_embeds=None, negative_prompt_embeds=None - ): - if not isinstance(prompt, str) and not isinstance(prompt, list): - raise ValueError(f"`prompt` has to be of type `str` or `list` but is {type(prompt)}") - - if strength < 0 or strength > 1: - raise ValueError(f"The value of strength should in [0.0, 1.0] but is {strength}") - - if (callback_steps is None) or ( - callback_steps is not None and (not isinstance(callback_steps, int) or callback_steps <= 0) - ): - raise ValueError( - f"`callback_steps` has to be a positive integer but is {callback_steps} of type" - f" {type(callback_steps)}." - ) - - if prompt is not None and prompt_embeds is not None: - raise ValueError( - f"Cannot forward both `prompt`: {prompt} and `prompt_embeds`: {prompt_embeds}. Please make sure to" - " only forward one of the two." - ) - elif prompt is None and prompt_embeds is None: - raise ValueError( - "Provide either `prompt` or `prompt_embeds`. Cannot leave both `prompt` and `prompt_embeds` undefined." - ) - elif prompt is not None and (not isinstance(prompt, str) and not isinstance(prompt, list)): - raise ValueError(f"`prompt` has to be of type `str` or `list` but is {type(prompt)}") - - if negative_prompt is not None and negative_prompt_embeds is not None: - raise ValueError( - f"Cannot forward both `negative_prompt`: {negative_prompt} and `negative_prompt_embeds`:" - f" {negative_prompt_embeds}. Please make sure to only forward one of the two." - ) - - if prompt_embeds is not None and negative_prompt_embeds is not None: - if prompt_embeds.shape != negative_prompt_embeds.shape: - raise ValueError( - "`prompt_embeds` and `negative_prompt_embeds` must have the same shape when passed directly, but" - f" got: `prompt_embeds` {prompt_embeds.shape} != `negative_prompt_embeds`" - f" {negative_prompt_embeds.shape}." - ) - - def get_timesteps(self, num_inference_steps, strength, device): - # get the original timestep using init_timestep - init_timestep = min(int(num_inference_steps * strength), num_inference_steps) - - t_start = max(num_inference_steps - init_timestep, 0) - timesteps = self.scheduler.timesteps[t_start:] - - return timesteps, num_inference_steps - t_start - - def prepare_latents(self, image, timestep, batch_size, num_images_per_prompt, dtype, device, generator=None): - if not isinstance(image, (torch.Tensor, PIL.Image.Image, list)): - raise ValueError( - f"`image` has to be of type `torch.Tensor`, `PIL.Image.Image` or list but is {type(image)}" - ) - - image = image.to(device=device, dtype=dtype) - - batch_size = batch_size * num_images_per_prompt - if isinstance(generator, list) and len(generator) != batch_size: - raise ValueError( - f"You have passed a list of generators of length {len(generator)}, but requested an effective batch" - f" size of {batch_size}. Make sure the batch size matches the length of the generators." - ) - - if isinstance(generator, list): - init_latents = [ - self.vae.encode(image[i : i + 1]).latent_dist.sample(generator[i]) for i in range(batch_size) - ] - init_latents = torch.cat(init_latents, dim=0) - else: - init_latents = self.vae.encode(image).latent_dist.sample(generator) - - init_latents = 0.18215 * init_latents - - if batch_size > init_latents.shape[0] and batch_size % init_latents.shape[0] == 0: - # expand init_latents for batch_size - deprecation_message = ( - f"You have passed {batch_size} text prompts (`prompt`), but only {init_latents.shape[0]} initial" - " images (`image`). Initial images are now duplicating to match the number of text prompts. Note" - " that this behavior is deprecated and will be removed in a version 1.0.0. Please make sure to update" - " your script to pass as many initial images as text prompts to suppress this warning." - ) - deprecate("len(prompt) != len(image)", "1.0.0", deprecation_message, standard_warn=False) - additional_image_per_prompt = batch_size // init_latents.shape[0] - init_latents = torch.cat([init_latents] * additional_image_per_prompt, dim=0) - elif batch_size > init_latents.shape[0] and batch_size % init_latents.shape[0] != 0: - raise ValueError( - f"Cannot duplicate `image` of batch size {init_latents.shape[0]} to {batch_size} text prompts." - ) - else: - init_latents = torch.cat([init_latents], dim=0) - - shape = init_latents.shape - noise = randn_tensor(shape, generator=generator, device=device, dtype=dtype) - - # get latents - init_latents = self.scheduler.add_noise(init_latents, noise, timestep) - latents = init_latents - - return latents - - @torch.no_grad() - @replace_example_docstring(EXAMPLE_DOC_STRING) - def __call__( - self, - prompt: Union[str, List[str]] = None, - image: Union[torch.FloatTensor, PIL.Image.Image] = None, - strength: float = 0.8, - num_inference_steps: Optional[int] = 50, - guidance_scale: Optional[float] = 7.5, - negative_prompt: Optional[Union[str, List[str]]] = None, - num_images_per_prompt: Optional[int] = 1, - eta: Optional[float] = 0.0, - generator: Optional[Union[torch.Generator, List[torch.Generator]]] = None, - prompt_embeds: Optional[torch.FloatTensor] = None, - negative_prompt_embeds: Optional[torch.FloatTensor] = None, - output_type: Optional[str] = "pil", - return_dict: bool = True, - callback: Optional[Callable[[int, int, torch.FloatTensor], None]] = None, - callback_steps: Optional[int] = 1, - engine_graph: Optional[list] = [], - **kwargs, - ): - r""" - Function invoked when calling the pipeline for generation. - - Args: - prompt (`str` or `List[str]`, *optional*): - The prompt or prompts to guide the image generation. If not defined, one has to pass `prompt_embeds`. - instead. - image (`torch.FloatTensor` or `PIL.Image.Image`): - `Image`, or tensor representing an image batch, that will be used as the starting point for the - process. - strength (`float`, *optional*, defaults to 0.8): - Conceptually, indicates how much to transform the reference `image`. Must be between 0 and 1. `image` - will be used as a starting point, adding more noise to it the larger the `strength`. The number of - denoising steps depends on the amount of noise initially added. When `strength` is 1, added noise will - be maximum and the denoising process will run for the full number of iterations specified in - `num_inference_steps`. A value of 1, therefore, essentially ignores `image`. - num_inference_steps (`int`, *optional*, defaults to 50): - The number of denoising steps. More denoising steps usually lead to a higher quality image at the - expense of slower inference. This parameter will be modulated by `strength`. - guidance_scale (`float`, *optional*, defaults to 7.5): - Guidance scale as defined in [Classifier-Free Diffusion Guidance](https://arxiv.org/abs/2207.12598). - `guidance_scale` is defined as `w` of equation 2. of [Imagen - Paper](https://arxiv.org/pdf/2205.11487.pdf). Guidance scale is enabled by setting `guidance_scale > - 1`. Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, - usually at the expense of lower image quality. - negative_prompt (`str` or `List[str]`, *optional*): - The prompt or prompts not to guide the image generation. If not defined, one has to pass - `negative_prompt_embeds`. instead. Ignored when not using guidance (i.e., ignored if `guidance_scale` - is less than `1`). - num_images_per_prompt (`int`, *optional*, defaults to 1): - The number of images to generate per prompt. - eta (`float`, *optional*, defaults to 0.0): - Corresponds to parameter eta (η) in the DDIM paper: https://arxiv.org/abs/2010.02502. Only applies to - [`schedulers.DDIMScheduler`], will be ignored for others. - generator (`torch.Generator`, *optional*): - One or a list of [torch generator(s)](https://pytorch.org/docs/stable/generated/torch.Generator.html) - to make generation deterministic. - prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt weighting. If not - provided, text embeddings will be generated from `prompt` input argument. - negative_prompt_embeds (`torch.FloatTensor`, *optional*): - Pre-generated negative text embeddings. Can be used to easily tweak text inputs, *e.g.* prompt - weighting. If not provided, negative_prompt_embeds will be generated from `negative_prompt` input - argument. - output_type (`str`, *optional*, defaults to `"pil"`): - The output format of the generate image. Choose between - [PIL](https://pillow.readthedocs.io/en/stable/): `PIL.Image.Image` or `np.array`. - return_dict (`bool`, *optional*, defaults to `True`): - Whether or not to return a [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] instead of a - plain tuple. - callback (`Callable`, *optional*): - A function that will be called every `callback_steps` steps during inference. The function will be - called with the following arguments: `callback(step: int, timestep: int, latents: torch.FloatTensor)`. - callback_steps (`int`, *optional*, defaults to 1): - The frequency at which the `callback` function will be called. If not specified, the callback will be - called at every step. - Examples: - - Returns: - [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] or `tuple`: - [`~pipelines.stable_diffusion.StableDiffusionPipelineOutput`] if `return_dict` is True, otherwise a `tuple. - When returning a tuple, the first element is a list with the generated images, and the second element is a - list of `bool`s denoting whether the corresponding generated image likely represents "not-safe-for-work" - (nsfw) content, according to the `safety_checker`. - """ - message = "Please use `image` instead of `init_image`." - init_image = deprecate("init_image", "0.13.0", message, take_from=kwargs) - image = init_image or image - - # 1. Check inputs. Raise error if not correct - self.check_inputs(prompt, strength, callback_steps, negative_prompt, prompt_embeds, negative_prompt_embeds) - - # 2. Define call parameters - batch_size = 1 if isinstance(prompt, str) else len(prompt) - device = self._execution_device - # here `guidance_scale` is defined analog to the guidance weight `w` of equation (2) - # of the Imagen paper: https://arxiv.org/pdf/2205.11487.pdf . `guidance_scale = 1` - # corresponds to doing no classifier free guidance. - do_classifier_free_guidance = guidance_scale > 1.0 - - # 3. Encode input prompt - prompt_embeds = self._encode_prompt( - engine_graph[0], - prompt, - device, - num_images_per_prompt, - do_classifier_free_guidance, - negative_prompt, - prompt_embeds=prompt_embeds, - negative_prompt_embeds=negative_prompt_embeds, - ) - - # 4. Preprocess image - image = preprocess(image) - - # 5. set timesteps - self.scheduler.set_timesteps(num_inference_steps, device=device) - timesteps, num_inference_steps = self.get_timesteps(num_inference_steps, strength, device) - latent_timestep = timesteps[:1].repeat(batch_size * num_images_per_prompt) - - # 6. Prepare latent variables - latents = self.prepare_latents( - image, latent_timestep, batch_size, num_images_per_prompt, prompt_embeds.dtype, device, generator - ) - - # 7. Prepare extra step kwargs. TODO: Logic should ideally just be moved out of the pipeline - extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta) - - # 8. Denoising loop - num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order - with self.progress_bar(total=num_inference_steps) as progress_bar: - for i, t in enumerate(timesteps): - # expand the latents if we are doing classifier free guidance - latent_model_input = torch.cat([latents] * 2) if do_classifier_free_guidance else latents - latent_model_input = self.scheduler.scale_model_input(latent_model_input, t) - - # Original Pytorch Diffuser Unet Code: predict the noise residual - # noise_pred = self.unet(latent_model_input, t, encoder_hidden_states=prompt_embeds).sample - - # The ITREX Unet Code - latent_model_input = latent_model_input.contiguous() - prompt_embeds = prompt_embeds.contiguous() - t_1d = torch.tensor([t], dtype=torch.float32).contiguous() - engine_output = engine_graph[1].inference([latent_model_input, t_1d, prompt_embeds]) - noise_pred = torch.from_numpy(engine_output['out_sample:0']) - - # perform guidance - if do_classifier_free_guidance: - noise_pred_uncond, noise_pred_text = noise_pred.chunk(2) - noise_pred = noise_pred_uncond + guidance_scale * (noise_pred_text - noise_pred_uncond) - - # compute the previous noisy sample x_t -> x_t-1 - latents = self.scheduler.step(noise_pred, t, latents, **extra_step_kwargs).prev_sample - - # call the callback, if provided - if i == len(timesteps) - 1 or ((i + 1) > num_warmup_steps and (i + 1) % self.scheduler.order == 0): - progress_bar.update() - if callback is not None and i % callback_steps == 0: - callback(i, t, latents) - - # 9. Post-processing - image = self.decode_latents(latents, engine_graph[2]) - - # 10. Run safety checker - image, has_nsfw_concept = self.run_safety_checker(image, device, prompt_embeds.dtype) - - # 11. Convert to PIL - if output_type == "pil": - image = self.numpy_to_pil(image) - - if not return_dict: - return (image, has_nsfw_concept) - - return StableDiffusionPipelineOutput(images=image, nsfw_content_detected=has_nsfw_concept) - -def fp32_to_bf16(fp32_np): - assert(fp32_np.dtype==np.float32) - temp = copy.deepcopy(fp32_np) - int32_np = temp.view(dtype=np.int32) - int32_np = int32_np >> 16 - bf16_np = int32_np.astype(np.uint16) - return bf16_np - -def bf16_to_fp32(bf16_np): - assert(bf16_np.dtype==np.int16) - temp = copy.deepcopy(bf16_np) - int32_np = temp.astype(dtype=np.int32) - int32_np = int32_np << 16 - fp32_np = int32_np.view(np.float32) - return fp32_np diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_ir.py b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_ir.py deleted file mode 100644 index 35cf29d247d..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_ir.py +++ /dev/null @@ -1,311 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -from intel_extension_for_transformers.transformers.runtime.compile import compile, autocast - -text_encoder_pattern_config = { - 'pattern_switch': { - # General Pattern - 'PaddingSequence': False, - 'AttentionReshape': False, - 'QKVReshape': False, - 'ReshapeFusion': False, - 'InsertBF16Node': False, - 'OperatorAdaptor': False, - - # transpose_int8 - 'QKVMerge': False, - - # 'TextEncoder - 'TextEncoder_WordEmbedding': True, - 'TextEncoder_QReshape': True, - 'TextEncoder_KVReshape': True, - 'TextEncoder_AttentionMaskAddReshape': True, - 'TextEncoder_SoftmaxReshape': True, - 'TextEncoder_MulReshape': True, - 'TextEncoder_AttentionReshape': True, - 'TextEncoder_CasualAttentionMask': True, - - # for unet and vae decoder - 'GroupNorm': False, - - # vae decoder & Transformer2Dmodel - 'AttentionBlock_Resize2Gather': False, - 'AttentionBlock_QKVPreReshape': False, - 'AttentionBlock_AttentionMaskAddReshape': False, - 'AttentionBlock_ConstantOfShapeWithMul': False, - - 'Transformer2Dmodel_GetSampleBatch': False, - 'Transformer2Dmodel_SampleSlice': False, - 'Transformer2Dmodel_EncoderHiddenStatesReshape': False, - 'Transformer2Dmodel_ConstantOfShapeWithMul': False, - 'Transformer2Dmodel_QKVPreReshape': False, - 'Transformer2Dmodel_QKVReshape': False, - 'AttentionBlock_QKVReshape': False, - 'Transformer2Dmodel_QKVReshapeTo4D': False, - 'Transformer2Dmodel_AttentionMaskAddReshape': False, - 'Transformer2Dmodel_FFNInputSlice': False, - 'Transformer2Dmodel_FFNInputSlice_1': False, - 'Transformer2DModel_UpBlockResize': False, - - # for all stable diffusion models - 'StableDiffusion_bf16Convert': True, - 'StableDiffusion_ReshapeFusion': True, - - # MHA - 'TorchInsertBF16Node': False, - 'StableDiffusion_MHAReshape': True, - 'StableDiffusion_MHA': False, - 'ExplicitNHWCTransposeForConv': True, - 'ExplicitNHWCTransposeForConvQAT': False, - 'MultiHeadAttention': False, - - # Channel_last - 'ConvReshape': False - } -} - -unet_pattern_config = { - 'pattern_switch': { - # General Pattern - 'PaddingSequence': False, - 'AttentionReshape': False, - 'QKVReshape': False, - 'ReshapeFusion': False, - 'InsertBF16Node': False, - 'OperatorAdaptor': False, - - # transpose_int8 - 'QKVMerge': False, - - # 'TextEncoder - 'TextEncoder_WordEmbedding': False, - 'TextEncoder_QReshape': False, - 'TextEncoder_KVReshape': False, - 'TextEncoder_AttentionMaskAddReshape': False, - 'TextEncoder_SoftmaxReshape': False, - 'TextEncoder_MulReshape': False, - 'TextEncoder_AttentionReshape': False, - 'TextEncoder_CasualAttentionMask': False, - - # for unet and vae decoder - 'GroupNorm': True, - - # vae decoder & Transformer2Dmodel - 'AttentionBlock_Resize2Gather': True, - 'AttentionBlock_QKVPreReshape': True, - 'AttentionBlock_AttentionMaskAddReshape': True, - 'AttentionBlock_ConstantOfShapeWithMul': True, - - 'Transformer2Dmodel_GetSampleBatch': True, - 'Transformer2Dmodel_SampleSlice': True, - 'Transformer2Dmodel_EncoderHiddenStatesReshape': True, - 'Transformer2Dmodel_ConstantOfShapeWithMul': True, - 'Transformer2Dmodel_QKVPreReshape': True, - 'Transformer2Dmodel_QKVReshape': True, - 'AttentionBlock_QKVReshape': False, - 'Transformer2Dmodel_QKVReshapeTo4D': True, - 'Transformer2Dmodel_AttentionMaskAddReshape': True, - 'Transformer2Dmodel_FFNInputSlice': True, - 'Transformer2Dmodel_FFNInputSlice_1': True, - 'Transformer2DModel_UpBlockResize': True, - - # for all stable diffusion models - 'StableDiffusion_bf16Convert': True, - 'StableDiffusion_ReshapeFusion': True, - - # MHA - 'TorchInsertBF16Node': False, - 'StableDiffusion_MHAReshape': True, - 'StableDiffusion_MHA': False, - 'ExplicitNHWCTransposeForConv': True, - 'ExplicitNHWCTransposeForConvQAT': False, - 'MultiHeadAttention': False, - - # Channel_last - 'ConvReshape': False - } -} - -qat_unet_pattern_config = { - 'pattern_switch': { - # General Pattern - 'PaddingSequence': False, - 'AttentionReshape': False, - 'QKVReshape': False, - 'ReshapeFusion': False, - 'InsertBF16Node': False, - 'OperatorAdaptor': False, - - # transpose_int8 - 'QKVMerge': False, - - # 'TextEncoder - 'TextEncoder_WordEmbedding': False, - 'TextEncoder_QReshape': False, - 'TextEncoder_KVReshape': False, - 'TextEncoder_AttentionMaskAddReshape': False, - 'TextEncoder_SoftmaxReshape': False, - 'TextEncoder_MulReshape': False, - 'TextEncoder_AttentionReshape': False, - 'TextEncoder_CasualAttentionMask': False, - - # for unet and vae decoder - 'GroupNorm': True, - - # vae decoder & Transformer2Dmodel - 'AttentionBlock_Resize2Gather': True, - 'AttentionBlock_QKVPreReshape': True, - 'AttentionBlock_AttentionMaskAddReshape': True, - 'AttentionBlock_ConstantOfShapeWithMul': True, - - 'Transformer2Dmodel_GetSampleBatch': True, - 'Transformer2Dmodel_SampleSlice': True, - 'Transformer2Dmodel_EncoderHiddenStatesReshape': True, - 'Transformer2Dmodel_ConstantOfShapeWithMul': True, - 'Transformer2Dmodel_QKVPreReshape': True, - 'Transformer2Dmodel_QKVReshape': True, - 'AttentionBlock_QKVReshape': False, - 'Transformer2Dmodel_QKVReshapeTo4D': True, - 'Transformer2Dmodel_AttentionMaskAddReshape': True, - 'Transformer2Dmodel_FFNInputSlice': True, - 'Transformer2Dmodel_FFNInputSlice_1': True, - 'Transformer2DModel_UpBlockResize': True, - - # for all stable diffusion models - 'StableDiffusion_bf16Convert': True, - 'StableDiffusion_ReshapeFusion': True, - - # MHA - 'TorchInsertBF16Node': False, - 'StableDiffusion_MHAReshape': True, - 'StableDiffusion_MHA': True, - 'ExplicitNHWCTransposeForConv': False, - 'ExplicitNHWCTransposeForConvQAT': True, - 'MultiHeadAttention': False, - - # QAT for the stable diffusion - 'StableDiffusion_InsertQuantNode': True, - 'StableDiffusion_CollectQuantInfo': True, - 'CollectQuantInfo': False, - 'InsertQuantNode': False, - 'QuantizeFusion': False, - 'StableDiffusion_QuantizeFusion': True, - - # Channel_last - 'ConvReshape': False - } -} - -vae_decoder_pattern_config = { - 'pattern_switch': { - # General Pattern - 'PaddingSequence': False, - 'AttentionReshape': False, - 'QKVReshape': False, - 'ReshapeFusion': False, - 'InsertBF16Node': False, - 'OperatorAdaptor': False, - - # transpose_int8 - 'QKVMerge': False, - - # 'TextEncoder - 'TextEncoder_WordEmbedding': False, - 'TextEncoder_QReshape': False, - 'TextEncoder_KVReshape': False, - 'TextEncoder_AttentionMaskAddReshape': False, - 'TextEncoder_SoftmaxReshape': False, - 'TextEncoder_MulReshape': False, - 'TextEncoder_AttentionReshape': False, - 'TextEncoder_CasualAttentionMask': False, - - # for unet and vae decoder - 'GroupNorm': True, - - # vae decoder & Transformer2Dmodel - 'AttentionBlock_Resize2Gather': True, - 'AttentionBlock_QKVPreReshape': True, - 'AttentionBlock_AttentionMaskAddReshape': True, - 'AttentionBlock_ConstantOfShapeWithMul': True, - - 'Transformer2Dmodel_GetSampleBatch': True, - 'Transformer2Dmodel_SampleSlice': True, - 'Transformer2Dmodel_EncoderHiddenStatesReshape': True, - 'Transformer2Dmodel_ConstantOfShapeWithMul': True, - 'Transformer2Dmodel_QKVPreReshape': True, - 'Transformer2Dmodel_QKVReshape': True, - 'AttentionBlock_QKVReshape': True, - 'Transformer2Dmodel_QKVReshapeTo4D': False, - 'Transformer2Dmodel_AttentionMaskAddReshape': True, - 'Transformer2Dmodel_FFNInputSlice': True, - 'Transformer2Dmodel_FFNInputSlice_1': True, - 'Transformer2DModel_UpBlockResize': True, - - # for all stable diffusion models - 'StableDiffusion_bf16Convert': True, - 'StableDiffusion_ReshapeFusion': True, - - # MHA - 'TorchInsertBF16Node': False, - 'StableDiffusion_MHAReshape': True, - 'StableDiffusion_MHA': False, - 'ExplicitNHWCTransposeForConv': True, - 'ExplicitNHWCTransposeForConvQAT': False, - 'MultiHeadAttention': False, - - # Channel_last - 'ConvReshape': False - } -} - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument("--onnx_model", default="./model", - type=str, help="onnx model path.") - parser.add_argument("--pattern_config", default="./", - type=str, help="pattern graph path.") - parser.add_argument("--output_path", default="./ir", - type=str, help="pattern graph path.") - parser.add_argument("--dtype", default="fp32", type=str) - args = parser.parse_args() - - if args.pattern_config == 'text_encoder': - args.pattern_config = text_encoder_pattern_config - if args.pattern_config == 'unet': - args.pattern_config = unet_pattern_config - if args.pattern_config == 'vae_decoder': - args.pattern_config = vae_decoder_pattern_config - - if args.dtype == "bf16": - args.pattern_config['pattern_switch']['StableDiffusion_MHA'] = True - with autocast(args.dtype): - graph = compile(args.onnx_model, args.pattern_config) - graph.save(args.output_path) - elif args.dtype == "dynamic_int8": - with autocast(args.dtype): - graph = compile(args.onnx_model, args.pattern_config) - graph.save(args.output_path) - elif args.dtype == "qat_int8": - args.pattern_config = qat_unet_pattern_config - with autocast(args.dtype): - graph = compile(args.onnx_model, args.pattern_config) - graph.save(args.output_path) - else: - graph = compile(args.onnx_model, args.pattern_config) - graph.save(args.output_path) diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_model.sh b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_model.sh deleted file mode 100644 index d6b74e204d9..00000000000 --- a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/export_model.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -for var in "$@" - do - case $var in - --input_model=*) - input_model=$(echo $var |cut -f2 -d=) - ;; - --precision=*) - precision=$(echo $var |cut -f2 -d=) - ;; - --cast_type=*) - cast_type=$(echo $var |cut -f2 -d=) - ;; - esac - done - -if [[ ${cast_type} == 'dynamic_int8' ]]; then - echo "[INFO] cast_type is dynamic int8 and model will be dynamic quantized based on $precision" -# 1. text encoder -echo "[INFO] Text encoder ir will be $precision ..." -echo "[INFO] Start to export text encoder ir..." -python export_ir.py --onnx_model=${input_model}/text_encoder_fp32/model.onnx --pattern_config=text_encoder --output_path=./${precision}_${cast_type}_ir/text_encoder/ --dtype=${precision} - -# 2. unet -echo "[INFO] Start to export unet ir..." -python export_ir.py --onnx_model=${input_model}/unet_fp32/model.onnx --pattern_config=unet --output_path=./${precision}_${cast_type}_ir/unet/ --dtype=${cast_type} - -# 3. vae_decoder -echo "[INFO] start to export vae_decoder ir..." -python export_ir.py --onnx_model=${input_model}/vae_decoder_fp32/model.onnx --pattern_config=vae_decoder --output_path=./${precision}_${cast_type}_ir/vae_decoder/ --dtype=${cast_type} -exit -fi - -if [[ ${precision} == 'qat_int8' ]]; then -cast_type=qat_int8 -echo "[INFO] cast_type is qat int8" -# 1. text encoder -echo "[INFO] Start to export text encoder bf16 ir..." -python export_ir.py --onnx_model=${input_model}/text_encoder_bf16/model.onnx --pattern_config=text_encoder --output_path=./${cast_type}_ir/text_encoder/ --dtype=bf16 - -# 2. unet -echo "[INFO] Start to export unet qat int8 ir..." -python export_ir.py --onnx_model=${input_model}/unet_${cast_type}/model.onnx --pattern_config=unet --output_path=./${cast_type}_ir/unet/ --dtype=${cast_type} - -# 3. vae_decoder -echo "[INFO] start to export vae_decoder bf16 ir..." -python export_ir.py --onnx_model=${input_model}/vae_decoder_bf16/model.onnx --pattern_config=vae_decoder --output_path=./${cast_type}_ir/vae_decoder/ --dtype=bf16 -exit -fi - -# 1. text encoder -echo "[INFO] Start to export text encoder ir..." -python export_ir.py --onnx_model=${input_model}/text_encoder_${precision}/model.onnx --pattern_config=text_encoder --output_path=./${precision}_ir/text_encoder/ --dtype=${precision} - -# 2. unet -echo "[INFO] Start to export unet ir..." -python export_ir.py --onnx_model=${input_model}/unet_${precision}/model.onnx --pattern_config=unet --output_path=./${precision}_ir/unet/ --dtype=${precision} - -# 3. vae_decoder -echo "[INFO] start to export vae_decoder ir..." -python export_ir.py --onnx_model=${input_model}/vae_decoder_${precision}/model.onnx --pattern_config=vae_decoder --output_path=./${precision}_ir/vae_decoder/ --dtype=${precision} diff --git a/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse.png b/examples/huggingface/pytorch/image-classification/deployment/stable_diffusion/images/astronaut_rides_horse.png deleted file mode 100644 index 0374ac3d663fc49e2d6b466389fc7bbcf16b9a58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464344 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
    *G$IIosESQMu&BhR^ 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

    qEK!`tabj2_Kb&?p>H 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