From 09fb25e339b3babf282a35d4a3bd67fafe6955c3 Mon Sep 17 00:00:00 2001 From: abdessaied Date: Wed, 25 Oct 2023 15:38:09 +0200 Subject: [PATCH] Code release --- README.md | 277 ++++ ckpt/.gitkeep | 0 config/bert_base_6layer_6conect.json | 40 + config/ensemble.conf | 33 + config/vdgr.conf | 188 +++ data/.gitkeep | 0 dataloader/__init__.py | 0 dataloader/dataloader_base.py | 269 ++++ dataloader/dataloader_visdial.py | 615 +++++++ dataloader/dataloader_visdial_dense.py | 313 ++++ ensemble.py | 114 ++ main.py | 199 +++ misc/.gitkeep | 0 misc/teaser_1.png | Bin 0 -> 2289522 bytes misc/teaser_2.png | Bin 0 -> 3780953 bytes misc/usa.png | Bin 0 -> 11719 bytes models/__init__.py | 0 models/runner.py | 830 ++++++++++ models/vdgr.py | 379 +++++ models/vilbert_dialog.py | 2021 ++++++++++++++++++++++++ setup_data.sh | 18 + utils/__init__.py | 0 utils/data_utils.py | 290 ++++ utils/image_features_reader.py | 192 +++ utils/init_utils.py | 176 +++ utils/model_utils.py | 456 ++++++ utils/modules.py | 41 + utils/optim_utils.py | 389 +++++ utils/visdial_metrics.py | 322 ++++ 29 files changed, 7162 insertions(+) create mode 100644 README.md create mode 100644 ckpt/.gitkeep create mode 100644 config/bert_base_6layer_6conect.json create mode 100644 config/ensemble.conf create mode 100644 config/vdgr.conf create mode 100644 data/.gitkeep create mode 100644 dataloader/__init__.py create mode 100644 dataloader/dataloader_base.py create mode 100644 dataloader/dataloader_visdial.py create mode 100644 dataloader/dataloader_visdial_dense.py create mode 100644 ensemble.py create mode 100644 main.py create mode 100644 misc/.gitkeep create mode 100644 misc/teaser_1.png create mode 100644 misc/teaser_2.png create mode 100644 misc/usa.png create mode 100644 models/__init__.py create mode 100644 models/runner.py create mode 100644 models/vdgr.py create mode 100644 models/vilbert_dialog.py create mode 100644 setup_data.sh create mode 100644 utils/__init__.py create mode 100644 utils/data_utils.py create mode 100644 utils/image_features_reader.py create mode 100644 utils/init_utils.py create mode 100644 utils/model_utils.py create mode 100644 utils/modules.py create mode 100644 utils/optim_utils.py create mode 100644 utils/visdial_metrics.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..6ccab22 --- /dev/null +++ b/README.md @@ -0,0 +1,277 @@ +
+

VD-GR: Boosting Visual Dialog with Cascaded Spatial-Temporal Multi-Modal GRaphs

+ +**[Adnen Abdessaied][5],   [Lei Shi][6],   [Andreas Bulling][7]**

+**WACV'24, Hawaii, USA**
+**[[Paper][8]]** + +------------------- +

+ +
+ +# Table of Contents +* [Setup and Dependencies](#Setup-and-Dependencies) +* [Download Data](#Download-Data) +* [Pre-trained Checkpoints](#Pre-trained-Checkpoints) +* [Training](#Training) +* [Results](#Results) + +# Setup and Dependencies +We implemented our model using Python 3.7 and PyTorch 1.11.0 (CUDA 11.3, CuDNN 8.2.0). We recommend to setup a virtual environment using Anaconda.
+1. Install [git lfs][1] on your system +2. Clone our repository to download the data, checkpoints, and code + ```shell + git lfs install + git clone this_repo.git + ``` +3. Create a conda environment and install dependencies + ```shell + conda create -n vdgr python=3.7 + conda activate vdgr + conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch + conda install pyg -c pyg # 2.1.0 + pip install pytorch-transformers + pip install pytorch_pretrained_bert + pip install pyhocon glog wandb lmdb + ``` +4. If you wish to speed-up training, we recommend installing [apex][2] + ```shell + git clone https://github.com/NVIDIA/apex + cd apex + # if pip >= 23.1 (ref: https://pip.pypa.io/en/stable/news/#v23-1) which supports multiple `--config-settings` with the same key... + pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --config-settings "--build-option=--cpp_ext" --config-settings "--build-option=--cuda_ext" ./ + # otherwise + pip install -v --disable-pip-version-check --no-cache-dir --no-build-isolation --global-option="--cpp_ext" --global-option="--cuda_ext" ./ + cd .. + ``` + +# Download Data +1. Download the extacted visual features of [VisDial][3] and setup all files we used in our work. We provide a shell script for convenience: +```shell +./setup_data.sh # Please make sure you have enough disk space +``` +If everything was correctly setup, the ```data/``` folder should look like this +``` +├── history_adj_matrices +│ ├── test +│ ├── *.pkl +│ ├── train +│ ├── *.pkl +│ ├── val +│ ├── *.pkl +├── question_adj_matrices +│ ├── test +│ ├── *.pkl +│ ├── train +│ ├── *.pkl +│ ├── val +│ ├── *.pkl +├── img_adj_matrices +│ ├── *.pkl +├── parse_vocab.pkl +├── test_dense_mapping.json +├── tr_dense_mapping.json +├── val_dense_mapping.json +├── visdial_0.9_test.json +├── visdial_0.9_train.json +├── visdial_0.9_val.json +├── visdial_1.0_test.json +├── visdial_1.0_train_dense_annotations.json +├── visdial_1.0_train_dense.json +├── visdial_1.0_train.json +├── visdial_1.0_val_dense_annotations.json +├── visdial_1.0_val.json +├── visdialconv_dense_annotations.json +├── visdialconv.json +├── vispro_dense_annotations.json +└── vispro.json +``` +# Pre-trained Checkpoints +For convenience, we provide checkpoints of our model after the warm-up training stage in ```ckpt/``` for both VisDial v1.0 and VisDial v0.9.
+These checkpoints will be downloaded with the code if you use ```git lfs```. + +# Training +We trained our model on 8 Nvidia Tesla V100-32GB GPUs. The default hyperparameters in ```config/vdgr.conf``` and ```config/bert_base_6layer_6conect.json``` need to be adjusted if your setup differs from ours. + +## Phase 1 +### Training +1. In this phase, we train our model on VisDial v1.0 via +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ +--model vdgr/P1 \ +--mode train \ +--tag K2_v1.0 \ +--wandb_mode online \ +--wandb_project your_wandb_project_name +``` +⚠️ On a similar setup to ours, this will take roughly 20h to complete using apex for training. + +2. To train on VisDial v0.9: + * Set ```visdial_version = 0.9``` in ```config/vdgr.conf``` + * Set ```start_path = ckpt/vdgr_visdial_v0.9_after_warmup_K2.ckpt``` in ```config/vdgr.conf``` + * Run + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ + --model vdgr/P1 \ + --mode train \ + --tag K2_v0.9 \ + --wandb_mode online \ + --wandb_project your_wandb_project_name + ``` +### Inference +1. For inference on VisDial v1.0 val, VisDialConv, or VisPro: + * Set ```eval_dataset = {visdial, visdial_conv, visdial_vispro}``` in ```logs/vdgr/P1_K2_v1.0/code/config/vdgr.conf``` + * Run + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ + --model vdgr/P1 \ + --mode eval \ + --eval_dir logs/vdgr/P1_K2_v1.0 \ + --wandb_mode offline \ + ``` +2. For inference on VisDial v0.9: + * Set ```eval_dataset = visdial``` in ```logs/vdgr/P1_K2_v0.9/code/config/vdgr.conf``` + * Run + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ + --model vdgr/P1 \ + --mode eval \ + --eval_dir logs/vdgr/P1_K2_v0.9 \ + --wandb_mode offline \ + ``` +⚠️ This might take some time to finish as the testing data of VisDial v0.9 is large. + +3. For inference on the ```visdial_v1.0 test```: + * Run + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ + --model vdgr/P1 \ + --mode predict \ + --eval_dir logs/vdgr/P1_K2_v1.0 \ + --wandb_mode offline \ + ``` + * The output file will be saved in ```output/``` + +## Phase 2 +In this phase, we finetune on dense annotations to improve the NDCG score (Only supported for VisDial v1.0.) +1. Run +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ +--model vdgr/P2_CE \ +--mode train \ +--tag K2_v1.0_CE \ +--wandb_mode online \ +--wandb_project your_wandb_project_name +``` +⚠️This will take roughly 3-4 hours to complete using the same setup as before and [DP][4] for training. + +2. For inference on VisDial v1.0: + * Run: + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ + --model vdgr/P2_CE \ + --mode predict \ + --eval_dir logs/vdgr/P1_K2_v1.0_CE \ + --wandb_mode offline \ + ``` + * The output file will be saved in ```output/``` + +## Phase 3 +### Training +In the final phase, we train an ensemble method comprising of 8 models using ```K={1,2,3,4}``` and ```dense_loss={ce, listnet}```. +For ```K=k```: +1. Set the value of ```num_v_gnn_layers, num_q_gnn_layers, num_h_gnn_layers``` to ```k``` +2. Set ```start_path = ckpt/vdgr_visdial_v1.0_after_warmup_K[k].ckpt``` in ```config/vdgr.conf``` (P1) +3. Phase 1 training: +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ +--model vdgr/P1 \ +--mode train \ +--tag K[k]_v1.0 \ +--wandb_mode online \ +--wandb_project your_wandb_project_name +``` +3. Set ```start_path = logs/vdgr/P1_K[k]_v1.0/epoch_best.ckpt``` in ```config/vdgr.conf``` (P2) +4. Phase 2 training: +* Fine-tune with CE: + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ + --model vdgr/P2_CE \ + --mode train \ + --tag K[k]_v1.0_CE \ + --wandb_mode online \ + --wandb_project your_wandb_project_name +``` +* Fine-tune with LISTNET: + ```shell + CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ + --model vdgr/P2_LISTNET \ + --mode train \ + --tag K[k]_v1.0_LISTNET \ + --wandb_mode online \ + --wandb_project your_wandb_project_name +``` +### Inference +1. For inference on VisDial v1.0 test: +```shell +CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python main.py \ +--model vdgr/P2_[CE,LISTNET] \ +--mode predict \ +--eval_dir logs/vdgr/P2_K[1,2,3,4]_v1.0_[CE,LISTNET] \ +--wandb_mode offline \ +``` +2. Finally, merge the outputs of all models +```shell + python ensemble.py \ +--exp test \ +--mode predict \ +``` +The output file will be saved in ```output/``` + +# Results +## VisDial v0.9 +| Model | MRR | R@1 | R@5 | R@10 | Mean | +|:--------:|:---:|:---:|:---:|:----:|:----:| +| Prev. SOTA | 71.99 | 59.41 | 87.92 | 94.59 | 2.87 | +| VD-GR | **74.50** | **62.10** | **90.49** | **96.37** | **2.45** | + +## VisDialConv +| Model | NDCG | MRR | R@1 | R@5 | R@10 | Mean | +|:--------:|:----:|:---:|:---:|:---:|:----:|:----:| +| Prev. SOTA | 61.72 | 61.79 | 48.95 | 77.50 | 86.71 | 4.72 | +| VD-GR | **67.09** | **66.82** | **54.47** | **81.71** | **91.44** | **3.54** | + +## VisPro +| Model | NDCG | MRR | R@1 | R@5 | R@10 | Mean | +|:--------:|:----:|:---:|:---:|:---:|:----:|:----:| +| Prev. SOTA | 59.30 | 62.29 | 48.35 | 80.10 | 88.87 | 4.37 | +| VD-GR | **60.35** | **69.89** | **57.21** | **85.97** | **92.68** | **3.15** | + +## VisDial V1.0 Val +| Model | NDCG | MRR | R@1 | R@5 | R@10 | Mean | +|:--------:|:----:|:---:|:---:|:---:|:----:|:----:| +| Prev. SOTA | 65.47 | 69.71 | 56.79 | 85.82 | 93.64 | 3.15 | +| VD-GR | 64.32 | **69.91** | **57.01** | **86.14** | **93.74** | **3.13** | + +## VisDial V1.0 Test +| Model | NDCG | MRR | R@1 | R@5 | R@10 | Mean | +|:--------:|:----:|:---:|:---:|:---:|:----:|:----:| +| Prev. SOTA | 64.91 | 68.73 | 55.73 | 85.38 | 93.53 | 3.21 | +| VD-GR | 63.49 | 68.65 | 55.33 | **85.58** | **93.85** | **3.20** | +| ♣️ Prev. SOTA | 75.92 | 56.18 | 45.32 | 68.05 | 80.98 | 5.42 | +| ♣️ VD-GR | **75.95** | **58.30** | **46.55** | **71.45** | 84.52 | **5.32** | +| ♣️♦️ Prev. SOTA | 76.17 | 56.42 | 44.75 | 70.23 | 84.52 | 5.47 | +| ♣️♦️ VD-GR | **76.43** | 56.35 | **45.18** | 68.13 | 82.18 | 5.79 | + +♣️ = Finetuning on dense annotations, ♦️ = Ensemble model + + +[1]: https://git-lfs.com/ +[2]: https://github.com/NVIDIA/apex +[3]: https://visualdialog.org/ +[4]: https://pytorch.org/tutorials/beginner/blitz/data_parallel_tutorial.html +[5]: https://adnenabdessaied.de +[6]: https://www.perceptualui.org/people/shi/ +[7]: https://www.perceptualui.org/people/bulling/ +[8]: https://drive.google.com/file/d/1GT0WDinA_z5FdwVc_bWtyB-cwQkGIf7C/view?usp=sharing diff --git a/ckpt/.gitkeep b/ckpt/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/config/bert_base_6layer_6conect.json b/config/bert_base_6layer_6conect.json new file mode 100644 index 0000000..f8e3563 --- /dev/null +++ b/config/bert_base_6layer_6conect.json @@ -0,0 +1,40 @@ +{ + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 768, + "initializer_range": 0.02, + "intermediate_size": 3072, + "max_position_embeddings": 512, + "num_attention_heads": 12, + "num_hidden_layers": 12, + "type_vocab_size": 2, + "vocab_size": 30522, + "v_feature_size": 2048, + "v_target_size": 1601, + "v_hidden_size": 1024, + "v_num_hidden_layers": 6, + "v_num_attention_heads": 8, + "v_intermediate_size": 1024, + "bi_hidden_size": 1024, + "bi_num_attention_heads": 8, + "bi_intermediate_size": 1024, + "bi_attention_type": 1, + "v_attention_probs_dropout_prob": 0.1, + "v_hidden_act": "gelu", + "v_hidden_dropout_prob": 0.1, + "v_initializer_range": 0.02, + "pooling_method": "mul", + "v_biattention_id": [0, 1, 2, 3, 4, 5], + "t_biattention_id": [6, 7, 8, 9, 10, 11], + "gnn_act": "gelu", + "num_v_gnn_layers": 2, + "num_q_gnn_layers": 2, + "num_h_gnn_layers": 2, + "num_gnn_attention_heads": 4, + "gnn_dropout_prob": 0.1, + "v_gnn_edge_dim": 12, + "q_gnn_edge_dim": 48, + "v_gnn_ids": [0, 1, 2, 3, 4, 5], + "t_gnn_ids": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +} \ No newline at end of file diff --git a/config/ensemble.conf b/config/ensemble.conf new file mode 100644 index 0000000..f3844c2 --- /dev/null +++ b/config/ensemble.conf @@ -0,0 +1,33 @@ +test = { + split = test + skip_mrr_eval = true + # data + visdial_test_data = data/visdial_1.0_test.json + + # directory + log_dir = logs/vdgr_ensemble + pred_dir = logs/vdgr + visdial_output_dir = visdial_output + + processed = [ + false, + false, + false, + false, + false, + false, + false, + false + ] + + models = [ + "P2_K1_v1.0_CE", + "P2_K2_v1.0_CE", + "P2_K3_v1.0_CE", + "P2_K4_v1.0_CE", + "P2_K1_v1.0_LISTNET", + "P2_K2_v1.0_LISTNET", + "P2_K3_v1.0_LISTNET", + "P2_K4_v1.0_LISTNET", + ] +} diff --git a/config/vdgr.conf b/config/vdgr.conf new file mode 100644 index 0000000..6ef305c --- /dev/null +++ b/config/vdgr.conf @@ -0,0 +1,188 @@ +# Phase 1 +P1 { + use_cpu = false + visdial_version = 1.0 + train_on_dense = false + metrics_to_maximize = mrr + + # visdial data + visdial_image_feats = data/visdial_img_feat.lmdb + + visdial_image_adj_matrices = data/img_adj_matrices + visdial_question_adj_matrices = data/question_adj_matrices + visdial_history_adj_matrices = data/history_adj_matrices + + visdial_train = data/visdial_1.0_train.json + visdial_val = data/visdial_1.0_val.json + visdial_test = data/visdial_1.0_test.json + visdial_val_dense_annotations = data/visdial_1.0_val_dense_annotations.json + + visdial_train_09 = data/visdial_0.9_train.json + visdial_val_09 = data/visdial_0.9_val.json + visdial_test_09 = data/visdial_0.9_test.json + + visdialconv_val = data/visdial_conv.json + visdialconv_val_dense_annotations = data/visdialconv_dense_annotations.json + + visdialvispro_val = data/vispro.json + visdialvispro_val_dense_annotations = data/vispro_dense_annotations.json + + visdial_question_parse_vocab = data/parse_vocab.pkl + + # init + start_path = ckpt/vdgr_visdial_v1.0_after_warmup_K2.ckpt + model_config = config/bert_base_6layer_6conect.json + + # visdial training + freeze_vilbert = false + visdial_tot_rounds = 11 + num_negative_samples = 1 + sequences_per_image = 2 + batch_size = 8 + lm_loss_coeff = 1 + nsp_loss_coeff = 1 + img_loss_coeff = 1 + batch_multiply = 1 + use_trainval = false + dense_loss = ce + dense_loss_coeff = 0 + dataloader_text_only = false + rlv_hst_only = false + rlv_hst_dense_round = false + + # visdial model + mask_prob = 0.1 + image_mask_prob = 0.1 + max_seq_len = 256 + num_options = 100 + num_options_dense = 100 + use_embedding = joint + + # visdial evaluation + eval_visdial_on_test = true + eval_batch_size = 1 + eval_line_batch_size = 200 + skip_mrr_eval = false + skip_ndcg_eval = false + skip_visdial_eval = false + eval_visdial_every = 1 + eval_dataset = visdial # visdial_vispro # choices = [visdial, visdial_conv, visdial_vispro ] + + continue_evaluation = false + eval_at_start = false + eval_before_training = false + initializer = normal + bert_cased = false + + # restore ckpt + loads_best_ckpt = false + loads_ckpt = false + restarts = false + resets_max_metric = false + uses_new_optimizer = false + sets_new_lr = false + loads_start_path = false + + # logging + random_seed = 42 + next_logging_pct = 1.0 + next_evaluating_pct = 50.0 + max_ckpt_to_keep = 1 + num_epochs = 20 + early_stop_epoch = 5 + skip_saving_ckpt = false + dp_type = apex + stack_gr_data = false + master_port = 5122 + stop_epochs = -1 + train_each_round = false + drop_last_answer = false + num_samples = -1 + + # predicting + predict_split = test + predict_each_round = false + predict_dense_round = false + num_test_dialogs = 8000 + num_val_dialogs = 2064 + save_score = false + + # optimizer + reset_optim = none + learning_rate_bert = 5e-6 + learning_rate_gnn = 2e-4 + gnn_weight_decay = 0.01 + use_diff_lr_gnn = true + min_lr = 0 + decay_method_bert = linear + decay_method_gnn = linear + decay_exp = 2 + max_grad_norm = 1.0 + task_optimizer = adam + warmup_ratio = 0.1 + + # directory + log_dir = logs/vdgr + data_dir = data + visdial_output_dir = visdial_output + bert_cache_dir = transformers + + # keep track of other hparams in bert json + v_gnn_edge_dim = 12 # 11 classes + hub_node + q_gnn_edge_dim = 48 # 47 classes + hub_node + num_v_gnn_layers = 2 + num_q_gnn_layers = 2 + num_h_gnn_layers = 2 + num_gnn_attention_heads = 4 + v_gnn_ids = [0, 1, 2, 3, 4, 5] + t_gnn_ids = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] +} + +# Phase 2 +P2_CE = ${P1} { + # basic + train_on_dense = true + use_trainval = true + metrics_to_maximize = ndcg + + visdial_train_dense = data/visdial_1.0_train_dense.json + visdial_train_dense_annotations = data/visdial_1.0_train_dense_annotations.json + visdial_val_dense = data/visdial_1.0_val.json + + tr_graph_idx_mapping = data/tr_dense_mapping.json + val_graph_idx_mapping = data/val_dense_mapping.json + test_graph_idx_mapping = data/test_dense_mapping.json + + visdial_val = data/visdial_1.0_val.json + visdial_val_dense_annotations = data/visdial_1.0_val_dense_annotations.json + + # data + start_path = logs/vdgr/P1_K2_v1.0/epoch_best.ckpt + rlv_hst_only = false + + # visdial training + nsp_loss_coeff = 0 + dense_loss_coeff = 1 + batch_multiply = 10 + batch_size = 1 + + # visdial model + num_options_dense = 100 + + # visdial evaluation + eval_batch_size = 1 + eval_line_batch_size = 100 + skip_mrr_eval = true + + # training + stop_epochs = 3 + dp_type = dp + dense_loss = ce + + # optimizer + learning_rate_bert = 1e-4 +} + +P2_LISTNET = ${P2_CE} { + dense_loss = listnet +} diff --git a/data/.gitkeep b/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/dataloader/__init__.py b/dataloader/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dataloader/dataloader_base.py b/dataloader/dataloader_base.py new file mode 100644 index 0000000..41c78da --- /dev/null +++ b/dataloader/dataloader_base.py @@ -0,0 +1,269 @@ +import torch +from torch.utils import data +import json +import os +import glog as log +import pickle + +import torch.utils.data as tud +from pytorch_transformers.tokenization_bert import BertTokenizer + +from utils.image_features_reader import ImageFeaturesH5Reader + + +class DatasetBase(data.Dataset): + + def __init__(self, config): + + if config['display']: + log.info('Initializing dataset') + + # Fetch the correct dataset for evaluation + if config['validating']: + assert config.eval_dataset in ['visdial', 'visdial_conv', 'visdial_vispro', 'visdial_v09'] + if config.eval_dataset == 'visdial_conv': + config['visdial_val'] = config.visdialconv_val + config['visdial_val_dense_annotations'] = config.visdialconv_val_dense_annotations + elif config.eval_dataset == 'visdial_vispro': + config['visdial_val'] = config.visdialvispro_val + config['visdial_val_dense_annotations'] = config.visdialvispro_val_dense_annotations + elif config.eval_dataset == 'visdial_v09': + config['visdial_val_09'] = config.visdial_test_09 + config['visdial_val_dense_annotations'] = None + + self.config = config + self.numDataPoints = {} + + if not config['dataloader_text_only']: + self._image_features_reader = ImageFeaturesH5Reader( + config['visdial_image_feats'], + config['visdial_image_adj_matrices'] + ) + + if self.config['training'] or self.config['validating'] or self.config['predicting']: + split2data = {'train': 'train', 'val': 'val', 'test': 'test'} + elif self.config['debugging']: + split2data = {'train': 'val', 'val': 'val', 'test': 'test'} + elif self.config['visualizing']: + split2data = {'train': 'train', 'val': 'train', 'test': 'test'} + + filename = f'visdial_{split2data["train"]}' + if config['train_on_dense']: + filename += '_dense' + if self.config['visdial_version'] == 0.9: + filename += '_09' + + with open(config[filename]) as f: + self.visdial_data_train = json.load(f) + if self.config.num_samples > 0: + self.visdial_data_train['data']['dialogs'] = self.visdial_data_train['data']['dialogs'][:self.config.num_samples] + self.numDataPoints['train'] = len(self.visdial_data_train['data']['dialogs']) + + filename = f'visdial_{split2data["val"]}' + if config['train_on_dense'] and config['training']: + filename += '_dense' + if self.config['visdial_version'] == 0.9: + filename += '_09' + + with open(config[filename]) as f: + self.visdial_data_val = json.load(f) + if self.config.num_samples > 0: + self.visdial_data_val['data']['dialogs'] = self.visdial_data_val['data']['dialogs'][:self.config.num_samples] + self.numDataPoints['val'] = len(self.visdial_data_val['data']['dialogs']) + + if config['train_on_dense']: + self.numDataPoints['trainval'] = self.numDataPoints['train'] + self.numDataPoints['val'] + with open(config[f'visdial_{split2data["test"]}']) as f: + self.visdial_data_test = json.load(f) + self.numDataPoints['test'] = len(self.visdial_data_test['data']['dialogs']) + + self.rlv_hst_train = None + self.rlv_hst_val = None + self.rlv_hst_test = None + + if config['train_on_dense'] or config['predict_dense_round']: + with open(config[f'visdial_{split2data["train"]}_dense_annotations']) as f: + self.visdial_data_train_dense = json.load(f) + if config['train_on_dense']: + self.subsets = ['train', 'val', 'trainval', 'test'] + else: + self.subsets = ['train','val','test'] + self.num_options = config["num_options"] + self.num_options_dense = config["num_options_dense"] + if config['visdial_version'] != 0.9: + with open(config[f'visdial_{split2data["val"]}_dense_annotations']) as f: + self.visdial_data_val_dense = json.load(f) + else: + self.visdial_data_val_dense = None + self._split = 'train' + self.tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', cache_dir=config['bert_cache_dir']) + # fetching token indicecs of [CLS] and [SEP] + tokens = ['[CLS]','[MASK]','[SEP]'] + indexed_tokens = self.tokenizer.convert_tokens_to_ids(tokens) + self.CLS = indexed_tokens[0] + self.MASK = indexed_tokens[1] + self.SEP = indexed_tokens[2] + self._max_region_num = 37 + self.predict_each_round = self.config['predicting'] and self.config['predict_each_round'] + + self.keys_to_expand = ['image_feat', 'image_loc', 'image_mask', 'image_target', 'image_label'] + self.keys_to_flatten_1d = ['hist_len', 'next_sentence_labels', 'round_id', 'image_id'] + self.keys_to_flatten_2d = ['tokens', 'segments', 'sep_indices', 'mask', 'image_mask', 'image_label', 'input_mask', 'question_limits'] + self.keys_to_flatten_3d = ['image_feat', 'image_loc', 'image_target', ] + self.keys_other = ['gt_relevance', 'gt_option_inds'] + self.keys_lists_to_flatten = ['image_edge_indices', 'image_edge_attributes', 'question_edge_indices', 'question_edge_attributes', 'history_edge_indices', 'history_sep_indices'] + if config['stack_gr_data']: + self.keys_to_flatten_3d.extend(self.keys_lists_to_flatten[:-1]) + self.keys_to_flatten_2d.append(self.keys_lists_to_flatten[-1]) + self.keys_to_flatten_1d.extend(['len_image_gr', 'len_question_gr', 'len_history_gr', 'len_history_sep']) + self.keys_lists_to_flatten = [] + + self.keys_to_list = ['tot_len'] + + # Load the parse vocab for question graph relationship mapping + if os.path.isfile(config['visdial_question_parse_vocab']): + with open(config['visdial_question_parse_vocab'], 'rb') as f: + self.parse_vocab = pickle.load(f) + + def __len__(self): + return self.numDataPoints[self._split] + + @property + def split(self): + return self._split + + @split.setter + def split(self, split): + assert split in self.subsets + self._split = split + + def tokens2str(self, seq): + dialog_sequence = '' + for sentence in seq: + for word in sentence: + dialog_sequence += self.tokenizer._convert_id_to_token(word) + " " + dialog_sequence += ' ' + dialog_sequence = dialog_sequence.encode('utf8') + return dialog_sequence + + def pruneRounds(self, context, num_rounds): + start_segment = 1 + len_context = len(context) + cur_rounds = (len(context) // 2) + 1 + l_index = 0 + if cur_rounds > num_rounds: + # caption is not part of the final input + l_index = len_context - (2 * num_rounds) + start_segment = 0 + return context[l_index:], start_segment + + def tokenize_utterance(self, sent, sentences, tot_len, sentence_count, sentence_map, speakers): + sentences.extend(sent + ['[SEP]']) + tokenized_sent = self.tokenizer.convert_tokens_to_ids(sent) + assert len(sent) == len(tokenized_sent), 'sub-word tokens are not allowed!' + + sent_len = len(tokenized_sent) + tot_len += sent_len + 1 # the additional 1 is for the sep token + sentence_count += 1 + sentence_map.extend([sentence_count * 2 - 1] * sent_len) + sentence_map.append(sentence_count * 2) # for [SEP] + speakers.extend([2] * (sent_len + 1)) + + return tokenized_sent, sentences, tot_len, sentence_count, sentence_map, speakers + + def __getitem__(self, index): + return NotImplementedError + + def collate_fn(self, batch): + tokens_size = batch[0]['tokens'].size() + num_rounds, num_samples = tokens_size[0], tokens_size[1] + merged_batch = {key: [d[key] for d in batch] for key in batch[0]} + + if self.config['stack_gr_data']: + if (len(batch)) > 1: + max_question_gr_len = max([length.max().item() for length in merged_batch['len_question_gr']]) + max_history_gr_len = max([length.max().item() for length in merged_batch['len_history_gr']]) + max_history_sep_len = max([length.max().item() for length in merged_batch['len_history_sep']]) + max_image_gr_len = max([length.max().item() for length in merged_batch['len_image_gr']]) + + question_edge_indices_padded = [] + question_edge_attributes_padded = [] + + for q_e_idx, q_e_attr in zip(merged_batch['question_edge_indices'], merged_batch['question_edge_attributes']): + b_size, edge_dim, orig_len = q_e_idx.size() + q_e_idx_padded = torch.zeros((b_size, edge_dim, max_question_gr_len)) + q_e_idx_padded[:, :, :orig_len] = q_e_idx + question_edge_indices_padded.append(q_e_idx_padded) + + edge_attr_dim = q_e_attr.size(-1) + q_e_attr_padded = torch.zeros((b_size, max_question_gr_len, edge_attr_dim)) + q_e_attr_padded[:, :orig_len, :] = q_e_attr + question_edge_attributes_padded.append(q_e_attr_padded) + + merged_batch['question_edge_indices'] = question_edge_indices_padded + merged_batch['question_edge_attributes'] = question_edge_attributes_padded + + history_edge_indices_padded = [] + for h_e_idx in merged_batch['history_edge_indices']: + b_size, _, orig_len = h_e_idx.size() + h_edge_idx_padded = torch.zeros((b_size, 2, max_history_gr_len)) + h_edge_idx_padded[:, :, :orig_len] = h_e_idx + history_edge_indices_padded.append(h_edge_idx_padded) + merged_batch['history_edge_indices'] = history_edge_indices_padded + + history_sep_indices_padded = [] + for hist_sep_idx in merged_batch['history_sep_indices']: + b_size, orig_len = hist_sep_idx.size() + hist_sep_idx_padded = torch.zeros((b_size, max_history_sep_len)) + hist_sep_idx_padded[:, :orig_len] = hist_sep_idx + history_sep_indices_padded.append(hist_sep_idx_padded) + merged_batch['history_sep_indices'] = history_sep_indices_padded + + image_edge_indices_padded = [] + image_edge_attributes_padded = [] + for img_e_idx, img_e_attr in zip(merged_batch['image_edge_indices'], merged_batch['image_edge_attributes']): + b_size, edge_dim, orig_len = img_e_idx.size() + img_e_idx_padded = torch.zeros((b_size, edge_dim, max_image_gr_len)) + img_e_idx_padded[:, :, :orig_len] = img_e_idx + image_edge_indices_padded.append(img_e_idx_padded) + + edge_attr_dim = img_e_attr.size(-1) + img_e_attr_padded = torch.zeros((b_size, max_image_gr_len, edge_attr_dim)) + img_e_attr_padded[:, :orig_len, :] = img_e_attr + image_edge_attributes_padded.append(img_e_attr_padded) + + merged_batch['image_edge_indices'] = image_edge_indices_padded + merged_batch['image_edge_attributes'] = image_edge_attributes_padded + + out = {} + for key in merged_batch: + if key in self.keys_lists_to_flatten: + temp = [] + for b in merged_batch[key]: + for x in b: + temp.append(x) + merged_batch[key] = temp + + elif key in self.keys_to_list: + pass + else: + merged_batch[key] = torch.stack(merged_batch[key], 0) + if key in self.keys_to_expand: + if len(merged_batch[key].size()) == 3: + size0, size1, size2 = merged_batch[key].size() + expand_size = (size0, num_rounds, num_samples, size1, size2) + elif len(merged_batch[key].size()) == 2: + size0, size1 = merged_batch[key].size() + expand_size = (size0, num_rounds, num_samples, size1) + merged_batch[key] = merged_batch[key].unsqueeze(1).unsqueeze(1).expand(expand_size).contiguous() + if key in self.keys_to_flatten_1d: + merged_batch[key] = merged_batch[key].reshape(-1) + elif key in self.keys_to_flatten_2d: + merged_batch[key] = merged_batch[key].reshape(-1, merged_batch[key].shape[-1]) + elif key in self.keys_to_flatten_3d: + merged_batch[key] = merged_batch[key].reshape(-1, merged_batch[key].shape[-2], merged_batch[key].shape[-1]) + else: + assert key in self.keys_other, f'unrecognized key in collate_fn: {key}' + + out[key] = merged_batch[key] + return out diff --git a/dataloader/dataloader_visdial.py b/dataloader/dataloader_visdial.py new file mode 100644 index 0000000..4c13035 --- /dev/null +++ b/dataloader/dataloader_visdial.py @@ -0,0 +1,615 @@ +import torch +import os +import numpy as np +import random +import pickle + +import sys +sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) + +from utils.data_utils import encode_input, encode_input_with_mask, encode_image_input +from dataloader.dataloader_base import DatasetBase + + +class VisdialDataset(DatasetBase): + + def __init__(self, config): + super(VisdialDataset, self).__init__(config) + + def __getitem__(self, index): + MAX_SEQ_LEN = self.config['max_seq_len'] + cur_data = None + if self._split == 'train': + cur_data = self.visdial_data_train['data'] + ques_adj_matrices_dir = os.path.join(self.config['visdial_question_adj_matrices'], 'train') + hist_adj_matrices_dir = os.path.join(self.config['visdial_history_adj_matrices'], 'train') + + elif self._split == 'val': + cur_data = self.visdial_data_val['data'] + ques_adj_matrices_dir = os.path.join(self.config['visdial_question_adj_matrices'], 'val') + hist_adj_matrices_dir = os.path.join(self.config['visdial_history_adj_matrices'], 'val') + + else: + cur_data = self.visdial_data_test['data'] + ques_adj_matrices_dir = os.path.join(self.config['visdial_question_adj_matrices'], 'test') + hist_adj_matrices_dir = os.path.join(self.config['visdial_history_adj_matrices'], 'test') + + if self.config['visdial_version'] == 0.9: + ques_adj_matrices_dir = os.path.join(self.config['visdial_question_adj_matrices'], 'train') + hist_adj_matrices_dir = os.path.join(self.config['visdial_history_adj_matrices'], 'train') + + self.num_bad_samples = 0 + # number of options to score on + num_options = self.num_options + assert num_options > 1 and num_options <= 100 + num_dialog_rounds = 10 + + dialog = cur_data['dialogs'][index] + cur_questions = cur_data['questions'] + cur_answers = cur_data['answers'] + img_id = dialog['image_id'] + graph_idx = dialog.get('dialog_idx', index) + + if self._split == 'train': + # caption + sent = dialog['caption'].split(' ') + sentences = ['[CLS]'] + tot_len = 1 # for the CLS token + sentence_map = [0] # for the CLS token + sentence_count = 0 + speakers = [0] + + tokenized_sent, sentences, tot_len, sentence_count, sentence_map, speakers = \ + self.tokenize_utterance(sent, sentences, tot_len, sentence_count, sentence_map, speakers) + + utterances = [[tokenized_sent]] + utterances_random = [[tokenized_sent]] + + for rnd, utterance in enumerate(dialog['dialog']): + cur_rnd_utterance = utterances[-1].copy() + cur_rnd_utterance_random = utterances[-1].copy() + + # question + sent = cur_questions[utterance['question']].split(' ') + tokenized_sent, sentences, tot_len, sentence_count, sentence_map, speakers = \ + self.tokenize_utterance(sent, sentences, tot_len, sentence_count, sentence_map, speakers) + + cur_rnd_utterance.append(tokenized_sent) + cur_rnd_utterance_random.append(tokenized_sent) + + # answer + sent = cur_answers[utterance['answer']].split(' ') + tokenized_sent, sentences, tot_len, sentence_count, sentence_map, speakers = \ + self.tokenize_utterance(sent, sentences, tot_len, sentence_count, sentence_map, speakers) + cur_rnd_utterance.append(tokenized_sent) + + utterances.append(cur_rnd_utterance) + + # randomly select one random utterance in that round + num_inds = len(utterance['answer_options']) + gt_option_ind = utterance['gt_index'] + + negative_samples = [] + + for _ in range(self.config["num_negative_samples"]): + + all_inds = list(range(100)) + all_inds.remove(gt_option_ind) + all_inds = all_inds[:(num_options-1)] + tokenized_random_utterance = None + option_ind = None + + while len(all_inds): + option_ind = random.choice(all_inds) + tokenized_random_utterance = self.tokenizer.convert_tokens_to_ids(cur_answers[utterance['answer_options'][option_ind]].split(' ')) + # the 1 here is for the sep token at the end of each utterance + if(MAX_SEQ_LEN >= (tot_len + len(tokenized_random_utterance) + 1)): + break + else: + all_inds.remove(option_ind) + if len(all_inds) == 0: + # all the options exceed the max len. Truncate the last utterance in this case. + tokenized_random_utterance = tokenized_random_utterance[:len(tokenized_sent)] + t = cur_rnd_utterance_random.copy() + t.append(tokenized_random_utterance) + negative_samples.append(t) + + utterances_random.append(negative_samples) + + # removing the caption in the beginning + utterances = utterances[1:] + utterances_random = utterances_random[1:] + assert len(utterances) == len(utterances_random) == num_dialog_rounds + assert tot_len <= MAX_SEQ_LEN, '{} {} tot_len = {} > max_seq_len'.format( + self._split, index, tot_len + ) + + tokens_all = [] + question_limits_all = [] + question_edge_indices_all = [] + question_edge_attributes_all = [] + history_edge_indices_all = [] + history_sep_indices_all = [] + mask_all = [] + segments_all = [] + sep_indices_all = [] + next_labels_all = [] + hist_len_all = [] + + # randomly pick several rounds to train + pos_rounds = sorted(random.sample(range(num_dialog_rounds), self.config['sequences_per_image'] // 2), reverse=True) + neg_rounds = sorted(random.sample(range(num_dialog_rounds), self.config['sequences_per_image'] // 2), reverse=True) + + tokens_all_rnd = [] + question_limits_all_rnd = [] + mask_all_rnd = [] + segments_all_rnd = [] + sep_indices_all_rnd = [] + next_labels_all_rnd = [] + hist_len_all_rnd = [] + + for j in pos_rounds: + context = utterances[j] + context, start_segment = self.pruneRounds(context, self.config['visdial_tot_rounds']) + if j == pos_rounds[0]: # dialog with positive label and max rounds + tokens, segments, sep_indices, mask, input_mask, start_question, end_question = encode_input_with_mask(context, start_segment, self.CLS, + self.SEP, self.MASK, max_seq_len=MAX_SEQ_LEN, mask_prob=self.config["mask_prob"]) + else: + tokens, segments, sep_indices, mask, start_question, end_question = encode_input(context, start_segment, self.CLS, + self.SEP, self.MASK, max_seq_len=MAX_SEQ_LEN, mask_prob=self.config["mask_prob"]) + tokens_all_rnd.append(tokens) + question_limits_all_rnd.append(torch.tensor([start_question, end_question])) + mask_all_rnd.append(mask) + sep_indices_all_rnd.append(sep_indices) + next_labels_all_rnd.append(torch.LongTensor([0])) + segments_all_rnd.append(segments) + hist_len_all_rnd.append(torch.LongTensor([len(context)-1])) + + tokens_all.append(torch.cat(tokens_all_rnd,0).unsqueeze(0)) + mask_all.append(torch.cat(mask_all_rnd,0).unsqueeze(0)) + question_limits_all.extend(question_limits_all_rnd) + segments_all.append(torch.cat(segments_all_rnd, 0).unsqueeze(0)) + sep_indices_all.append(torch.cat(sep_indices_all_rnd, 0).unsqueeze(0)) + next_labels_all.append(torch.cat(next_labels_all_rnd, 0).unsqueeze(0)) + hist_len_all.append(torch.cat(hist_len_all_rnd,0).unsqueeze(0)) + + assert len(pos_rounds) == 1 + question_graphs = pickle.load( + open(os.path.join(ques_adj_matrices_dir, f'{graph_idx}.pkl'), 'rb') + ) + + question_graph_pos = question_graphs[pos_rounds[0]] + question_edge_index_pos = [] + question_edge_attribute_pos = [] + for edge_idx, edge_attr in question_graph_pos: + question_edge_index_pos.append(edge_idx) + edge_attr_one_hot = np.zeros((len(self.parse_vocab) + 1,), dtype=np.float32) + edge_attr_one_hot[self.parse_vocab.get(edge_attr, len(self.parse_vocab))] = 1.0 + question_edge_attribute_pos.append(edge_attr_one_hot) + + question_edge_index_pos = np.array(question_edge_index_pos, dtype=np.float64) + question_edge_attribute_pos = np.stack(question_edge_attribute_pos, axis=0) + + question_edge_indices_all.append( + torch.from_numpy(question_edge_index_pos).t().long().contiguous() + ) + + question_edge_attributes_all.append( + torch.from_numpy(question_edge_attribute_pos) + ) + + history_edge_indices = pickle.load( + open(os.path.join(hist_adj_matrices_dir, f'{graph_idx}.pkl'), 'rb') + ) + + history_edge_indices_all.append( + torch.tensor(history_edge_indices[pos_rounds[0]]).t().long().contiguous() + ) + # Get the [SEP] tokens that will represent the history graph node features + hist_idx_pos = [i * 2 for i in range(pos_rounds[0] + 1)] + sep_indices = sep_indices.squeeze(0).numpy() + history_sep_indices_all.append(torch.from_numpy(sep_indices[hist_idx_pos])) + + if len(neg_rounds) > 0: + tokens_all_rnd = [] + question_limits_all_rnd = [] + mask_all_rnd = [] + segments_all_rnd = [] + sep_indices_all_rnd = [] + next_labels_all_rnd = [] + hist_len_all_rnd = [] + + for j in neg_rounds: + + negative_samples = utterances_random[j] + for context_random in negative_samples: + context_random, start_segment = self.pruneRounds(context_random, self.config['visdial_tot_rounds']) + tokens_random, segments_random, sep_indices_random, mask_random, start_question, end_question = encode_input(context_random, start_segment, self.CLS, + self.SEP, self.MASK, max_seq_len=MAX_SEQ_LEN, mask_prob=self.config["mask_prob"]) + tokens_all_rnd.append(tokens_random) + question_limits_all_rnd.append(torch.tensor([start_question, end_question])) + mask_all_rnd.append(mask_random) + sep_indices_all_rnd.append(sep_indices_random) + next_labels_all_rnd.append(torch.LongTensor([1])) + segments_all_rnd.append(segments_random) + hist_len_all_rnd.append(torch.LongTensor([len(context_random)-1])) + + tokens_all.append(torch.cat(tokens_all_rnd,0).unsqueeze(0)) + mask_all.append(torch.cat(mask_all_rnd,0).unsqueeze(0)) + question_limits_all.extend(question_limits_all_rnd) + segments_all.append(torch.cat(segments_all_rnd, 0).unsqueeze(0)) + sep_indices_all.append(torch.cat(sep_indices_all_rnd, 0).unsqueeze(0)) + next_labels_all.append(torch.cat(next_labels_all_rnd, 0).unsqueeze(0)) + hist_len_all.append(torch.cat(hist_len_all_rnd,0).unsqueeze(0)) + + assert len(neg_rounds) == 1 + + question_graph_neg = question_graphs[neg_rounds[0]] + question_edge_index_neg = [] + question_edge_attribute_neg = [] + for edge_idx, edge_attr in question_graph_neg: + question_edge_index_neg.append(edge_idx) + edge_attr_one_hot = np.zeros((len(self.parse_vocab) + 1,), dtype=np.float32) + edge_attr_one_hot[self.parse_vocab.get(edge_attr, len(self.parse_vocab))] = 1.0 + question_edge_attribute_neg.append(edge_attr_one_hot) + + question_edge_index_neg = np.array(question_edge_index_neg, dtype=np.float64) + question_edge_attribute_neg = np.stack(question_edge_attribute_neg, axis=0) + + question_edge_indices_all.append( + torch.from_numpy(question_edge_index_neg).t().long().contiguous() + ) + + question_edge_attributes_all.append( + torch.from_numpy(question_edge_attribute_neg) + ) + + history_edge_indices_all.append( + torch.tensor(history_edge_indices[neg_rounds[0]]).t().long().contiguous() + ) + + # Get the [SEP] tokens that will represent the history graph node features + hist_idx_neg = [i * 2 for i in range(neg_rounds[0] + 1)] + sep_indices_random = sep_indices_random.squeeze(0).numpy() + history_sep_indices_all.append(torch.from_numpy(sep_indices_random[hist_idx_neg])) + + tokens_all = torch.cat(tokens_all, 0) # [2, num_pos, max_len] + question_limits_all = torch.stack(question_limits_all, 0) # [2, 2] + mask_all = torch.cat(mask_all,0) + segments_all = torch.cat(segments_all, 0) + sep_indices_all = torch.cat(sep_indices_all, 0) + next_labels_all = torch.cat(next_labels_all, 0) + hist_len_all = torch.cat(hist_len_all, 0) + input_mask_all = torch.LongTensor(input_mask) # [max_len] + + item = {} + + item['tokens'] = tokens_all + item['question_limits'] = question_limits_all + item['question_edge_indices'] = question_edge_indices_all + item['question_edge_attributes'] = question_edge_attributes_all + + item['history_edge_indices'] = history_edge_indices_all + item['history_sep_indices'] = history_sep_indices_all + item['segments'] = segments_all + item['sep_indices'] = sep_indices_all + item['mask'] = mask_all + item['next_sentence_labels'] = next_labels_all + item['hist_len'] = hist_len_all + item['input_mask'] = input_mask_all + + # get image features + if not self.config['dataloader_text_only']: + features, num_boxes, boxes, _ , image_target, image_edge_indexes, image_edge_attributes = self._image_features_reader[img_id] + features, spatials, image_mask, image_target, image_label = encode_image_input(features, num_boxes, boxes, image_target, max_regions=self._max_region_num) + else: + features = spatials = image_mask = image_target = image_label = torch.tensor([0]) + + elif self._split == 'val': + gt_relevance = None + gt_option_inds = [] + options_all = [] + + # caption + sent = dialog['caption'].split(' ') + sentences = ['[CLS]'] + tot_len = 1 # for the CLS token + sentence_map = [0] # for the CLS token + sentence_count = 0 + speakers = [0] + + tokenized_sent, sentences, tot_len, sentence_count, sentence_map, speakers = \ + self.tokenize_utterance(sent, sentences, tot_len, sentence_count, sentence_map, speakers) + utterances = [[tokenized_sent]] + + for rnd, utterance in enumerate(dialog['dialog']): + cur_rnd_utterance = utterances[-1].copy() + + # question + sent = cur_questions[utterance['question']].split(' ') + tokenized_sent, sentences, tot_len, sentence_count, sentence_map, speakers = \ + self.tokenize_utterance(sent, sentences, tot_len, sentence_count, sentence_map, speakers) + + cur_rnd_utterance.append(tokenized_sent) + + # current round + gt_option_ind = utterance['gt_index'] + # first select gt option id, then choose the first num_options inds + option_inds = [] + option_inds.append(gt_option_ind) + all_inds = list(range(100)) + all_inds.remove(gt_option_ind) + all_inds = all_inds[:(num_options-1)] + option_inds.extend(all_inds) + gt_option_inds.append(0) + cur_rnd_options = [] + answer_options = [utterance['answer_options'][k] for k in option_inds] + assert len(answer_options) == len(option_inds) == num_options + assert answer_options[0] == utterance['answer'] + + # for evaluation of all options and dense relevance + if self.visdial_data_val_dense: + if rnd == self.visdial_data_val_dense[index]['round_id'] - 1: + # only 1 round has gt_relevance for each example + if 'relevance' in self.visdial_data_val_dense[index]: + gt_relevance = torch.Tensor(self.visdial_data_val_dense[index]['relevance']) + else: + gt_relevance = torch.Tensor(self.visdial_data_val_dense[index]['gt_relevance']) + # shuffle based on new indices + gt_relevance = gt_relevance[torch.LongTensor(option_inds)] + else: + gt_relevance = -1 + + for answer_option in answer_options: + cur_rnd_cur_option = cur_rnd_utterance.copy() + cur_rnd_cur_option.append(self.tokenizer.convert_tokens_to_ids(cur_answers[answer_option].split(' '))) + cur_rnd_options.append(cur_rnd_cur_option) + + # answer + sent = cur_answers[utterance['answer']].split(' ') + tokenized_sent, sentences, tot_len, sentence_count, sentence_map, speakers = \ + self.tokenize_utterance(sent, sentences, tot_len, sentence_count, sentence_map, speakers) + cur_rnd_utterance.append(tokenized_sent) + + utterances.append(cur_rnd_utterance) + options_all.append(cur_rnd_options) + + # encode the input and create batch x 10 x 100 * max_len arrays (batch x num_rounds x num_options) + tokens_all = [] + question_limits_all = [] + mask_all = [] + segments_all = [] + sep_indices_all = [] + hist_len_all = [] + history_sep_indices_all = [] + + for rnd, cur_rnd_options in enumerate(options_all): + + tokens_all_rnd = [] + mask_all_rnd = [] + segments_all_rnd = [] + sep_indices_all_rnd = [] + hist_len_all_rnd = [] + + for j, cur_rnd_option in enumerate(cur_rnd_options): + + cur_rnd_option, start_segment = self.pruneRounds(cur_rnd_option, self.config['visdial_tot_rounds']) + if rnd == len(options_all) - 1 and j == 0: # gt dialog + tokens, segments, sep_indices, mask, input_mask, start_question, end_question = encode_input_with_mask(cur_rnd_option, start_segment, self.CLS, + self.SEP, self.MASK, max_seq_len=MAX_SEQ_LEN, mask_prob=0) + else: + tokens, segments, sep_indices, mask, start_question, end_question = encode_input(cur_rnd_option, start_segment,self.CLS, + self.SEP, self.MASK ,max_seq_len=MAX_SEQ_LEN, mask_prob=0) + + tokens_all_rnd.append(tokens) + mask_all_rnd.append(mask) + segments_all_rnd.append(segments) + sep_indices_all_rnd.append(sep_indices) + hist_len_all_rnd.append(torch.LongTensor([len(cur_rnd_option)-1])) + + question_limits_all.append(torch.tensor([start_question, end_question]).unsqueeze(0).repeat(100, 1)) + tokens_all.append(torch.cat(tokens_all_rnd,0).unsqueeze(0)) + mask_all.append(torch.cat(mask_all_rnd,0).unsqueeze(0)) + segments_all.append(torch.cat(segments_all_rnd,0).unsqueeze(0)) + sep_indices_all.append(torch.cat(sep_indices_all_rnd,0).unsqueeze(0)) + hist_len_all.append(torch.cat(hist_len_all_rnd,0).unsqueeze(0)) + # Get the [SEP] tokens that will represent the history graph node features + # It will be the same for all answer candidates as the history does not change + # for each answer + hist_idx = [i * 2 for i in range(rnd + 1)] + history_sep_indices_all.extend(sep_indices.squeeze(0)[hist_idx].contiguous() for _ in range(100)) + + tokens_all = torch.cat(tokens_all, 0) # [10, 100, max_len] + mask_all = torch.cat(mask_all, 0) + segments_all = torch.cat(segments_all, 0) + sep_indices_all = torch.cat(sep_indices_all, 0) + hist_len_all = torch.cat(hist_len_all, 0) + input_mask_all = torch.LongTensor(input_mask) # [max_len] + + # load graph data + question_limits_all = torch.stack(question_limits_all, 0) # [10, 100, 2] + + question_graphs = pickle.load( + open(os.path.join(ques_adj_matrices_dir, f'{graph_idx}.pkl'), 'rb') + ) + question_edge_indices_all = [] # [10, N] we do not repeat it 100 times here + question_edge_attributes_all = [] # [10, N] we do not repeat it 100 times here + + for q_graph_round in question_graphs: + question_edge_index = [] + question_edge_attribute = [] + for edge_index, edge_attr in q_graph_round: + question_edge_index.append(edge_index) + edge_attr_one_hot = np.zeros((len(self.parse_vocab) + 1,), dtype=np.float32) + edge_attr_one_hot[self.parse_vocab.get(edge_attr, len(self.parse_vocab))] = 1.0 + question_edge_attribute.append(edge_attr_one_hot) + question_edge_index = np.array(question_edge_index, dtype=np.float64) + question_edge_attribute = np.stack(question_edge_attribute, axis=0) + + question_edge_indices_all.extend( + [torch.from_numpy(question_edge_index).t().long().contiguous() for _ in range(100)]) + question_edge_attributes_all.extend( + [torch.from_numpy(question_edge_attribute).contiguous() for _ in range(100)]) + + _history_edge_incides_all = pickle.load( + open(os.path.join(hist_adj_matrices_dir, f'{graph_idx}.pkl'), 'rb') + ) + history_edge_incides_all = [] + for hist_edge_indices_rnd in _history_edge_incides_all: + history_edge_incides_all.extend( + [torch.tensor(hist_edge_indices_rnd).t().long().contiguous() for _ in range(100)] + ) + + item = {} + item['tokens'] = tokens_all + item['segments'] = segments_all + item['sep_indices'] = sep_indices_all + item['mask'] = mask_all + item['hist_len'] = hist_len_all + item['input_mask'] = input_mask_all + + item['gt_option_inds'] = torch.LongTensor(gt_option_inds) + + # return dense annotation data as well + if self.visdial_data_val_dense: + item['round_id'] = torch.LongTensor([self.visdial_data_val_dense[index]['round_id']]) + item['gt_relevance'] = gt_relevance + + item['question_limits'] = question_limits_all + + item['question_edge_indices'] = question_edge_indices_all + item['question_edge_attributes'] = question_edge_attributes_all + + item['history_edge_indices'] = history_edge_incides_all + item['history_sep_indices'] = history_sep_indices_all + + # get image features + if not self.config['dataloader_text_only']: + features, num_boxes, boxes, _ , image_target, image_edge_indexes, image_edge_attributes = self._image_features_reader[img_id] + features, spatials, image_mask, image_target, image_label = encode_image_input( + features, num_boxes, boxes, image_target, max_regions=self._max_region_num, mask_prob=0) + else: + features = spatials = image_mask = image_target = image_label = torch.tensor([0]) + + elif self.split == 'test': + assert num_options == 100 + cur_rnd_utterance = [self.tokenizer.convert_tokens_to_ids(dialog['caption'].split(' '))] + options_all = [] + for rnd,utterance in enumerate(dialog['dialog']): + cur_rnd_utterance.append(self.tokenizer.convert_tokens_to_ids(cur_questions[utterance['question']].split(' '))) + if rnd != len(dialog['dialog'])-1: + cur_rnd_utterance.append(self.tokenizer.convert_tokens_to_ids(cur_answers[utterance['answer']].split(' '))) + for answer_option in dialog['dialog'][-1]['answer_options']: + cur_option = cur_rnd_utterance.copy() + cur_option.append(self.tokenizer.convert_tokens_to_ids(cur_answers[answer_option].split(' '))) + options_all.append(cur_option) + + tokens_all = [] + mask_all = [] + segments_all = [] + sep_indices_all = [] + hist_len_all = [] + + for j, option in enumerate(options_all): + option, start_segment = self.pruneRounds(option, self.config['visdial_tot_rounds']) + tokens, segments, sep_indices, mask = encode_input(option, start_segment ,self.CLS, + self.SEP, self.MASK ,max_seq_len=MAX_SEQ_LEN, mask_prob=0) + + tokens_all.append(tokens) + mask_all.append(mask) + segments_all.append(segments) + sep_indices_all.append(sep_indices) + hist_len_all.append(torch.LongTensor([len(option)-1])) + + tokens_all = torch.cat(tokens_all,0) + mask_all = torch.cat(mask_all,0) + segments_all = torch.cat(segments_all, 0) + sep_indices_all = torch.cat(sep_indices_all, 0) + hist_len_all = torch.cat(hist_len_all,0) + hist_idx = [i*2 for i in range(len(dialog['dialog']))] + history_sep_indices_all = [sep_indices.squeeze(0)[hist_idx].contiguous() for _ in range(num_options)] + + with open(os.path.join(ques_adj_matrices_dir, f'{graph_idx}.pkl'), 'rb') as f: + question_graphs = pickle.load(f) + q_graph_last = question_graphs[-1] + question_edge_index = [] + question_edge_attribute = [] + for edge_index, edge_attr in q_graph_last: + question_edge_index.append(edge_index) + edge_attr_one_hot = np.zeros((len(self.parse_vocab) + 1,), dtype=np.float32) + edge_attr_one_hot[self.parse_vocab.get(edge_attr, len(self.parse_vocab))] = 1.0 + question_edge_attribute.append(edge_attr_one_hot) + question_edge_index = np.array(question_edge_index, dtype=np.float64) + question_edge_attribute = np.stack(question_edge_attribute, axis=0) + + question_edge_indices_all = [torch.from_numpy(question_edge_index).t().long().contiguous() for _ in range(num_options)] + question_edge_attributes_all = [torch.from_numpy(question_edge_attribute).contiguous() for _ in range(num_options)] + + with open(os.path.join(hist_adj_matrices_dir, f'{graph_idx}.pkl'), 'rb') as f: + _history_edge_incides_all = pickle.load(f) + _history_edge_incides_last = _history_edge_incides_all[-1] + history_edge_index_all = [torch.tensor(_history_edge_incides_last).t().long().contiguous() for _ in range(num_options)] + + if self.config['stack_gr_data']: + question_edge_indices_all = torch.stack(question_edge_indices_all, dim=0) + question_edge_attributes_all = torch.stack(question_edge_attributes_all, dim=0) + history_edge_index_all = torch.stack(history_edge_index_all, dim=0) + history_sep_indices_all = torch.stack(history_sep_indices_all, dim=0) + len_question_gr = torch.tensor(question_edge_indices_all.size(-1)).unsqueeze(0).repeat(num_options, 1) + len_history_gr = torch.tensor(history_edge_index_all.size(-1)).repeat(num_options, 1) + len_history_sep = torch.tensor(history_sep_indices_all.size(-1)).repeat(num_options, 1) + + item = {} + item['tokens'] = tokens_all.unsqueeze(0) + item['segments'] = segments_all.unsqueeze(0) + item['sep_indices'] = sep_indices_all.unsqueeze(0) + item['mask'] = mask_all.unsqueeze(0) + item['hist_len'] = hist_len_all.unsqueeze(0) + item['question_limits'] = question_limits_all + item['question_edge_indices'] = question_edge_indices_all + item['question_edge_attributes'] = question_edge_attributes_all + + item['history_edge_indices'] = history_edge_index_all + item['history_sep_indices'] = history_sep_indices_all + + if self.config['stack_gr_data']: + item['len_question_gr'] = len_question_gr + item['len_history_gr'] = len_history_gr + item['len_history_sep'] = len_history_sep + + item['round_id'] = torch.LongTensor([dialog['round_id']]) + + # get image features + if not self.config['dataloader_text_only']: + features, num_boxes, boxes, _ , image_target, image_edge_indexes, image_edge_attributes = self._image_features_reader[img_id] + features, spatials, image_mask, image_target, image_label = encode_image_input(features, num_boxes, boxes, image_target, max_regions=self._max_region_num, mask_prob=0) + else: + features = spatials = image_mask = image_target = image_label = torch.tensor([0]) + + item['image_feat'] = features + item['image_loc'] = spatials + item['image_mask'] = image_mask + item['image_target'] = image_target + item['image_label'] = image_label + item['image_id'] = torch.LongTensor([img_id]) + if self._split == 'train': + # cheap hack to account for the graph data for the postitive and negatice examples + item['image_edge_indices'] = [torch.from_numpy(image_edge_indexes).long(), torch.from_numpy(image_edge_indexes).long()] + item['image_edge_attributes'] = [torch.from_numpy(image_edge_attributes), torch.from_numpy(image_edge_attributes)] + elif self._split == 'val': + # cheap hack to account for the graph data for the postitive and negatice examples + item['image_edge_indices'] = [torch.from_numpy(image_edge_indexes).contiguous().long() for _ in range(1000)] + item['image_edge_attributes'] = [torch.from_numpy(image_edge_attributes).contiguous() for _ in range(1000)] + + else: + # cheap hack to account for the graph data for the postitive and negatice examples + item['image_edge_indices'] = [torch.from_numpy(image_edge_indexes).contiguous().long() for _ in range(100)] + item['image_edge_attributes'] = [torch.from_numpy(image_edge_attributes).contiguous() for _ in range(100)] + + if self.config['stack_gr_data']: + item['image_edge_indices'] = torch.stack(item['image_edge_indices'], dim=0) + item['image_edge_attributes'] = torch.stack(item['image_edge_attributes'], dim=0) + len_image_gr = torch.tensor(item['image_edge_indices'].size(-1)).unsqueeze(0).repeat(num_options) + item['len_image_gr'] = len_image_gr + + return item diff --git a/dataloader/dataloader_visdial_dense.py b/dataloader/dataloader_visdial_dense.py new file mode 100644 index 0000000..72cdbbf --- /dev/null +++ b/dataloader/dataloader_visdial_dense.py @@ -0,0 +1,313 @@ +import torch +import json +import os +import time +import numpy as np +import random +from tqdm import tqdm +import copy +import pyhocon +import glog as log +from collections import OrderedDict +import argparse +import pickle +import torch.utils.data as tud +import sys +sys.path.insert(0, os.path.dirname(os.path.dirname(__file__))) + +from utils.data_utils import encode_input, encode_image_input +from dataloader.dataloader_base import DatasetBase + + +class VisdialDenseDataset(DatasetBase): + + def __init__(self, config): + super(VisdialDenseDataset, self).__init__(config) + with open(config.tr_graph_idx_mapping, 'r') as f: + self.tr_graph_idx_mapping = json.load(f) + + with open(config.val_graph_idx_mapping, 'r') as f: + self.val_graph_idx_mapping = json.load(f) + + with open(config.test_graph_idx_mapping, 'r') as f: + self.test_graph_idx_mapping = json.load(f) + + + self.question_gr_paths = { + 'train': os.path.join(self.config['visdial_question_adj_matrices'], 'train'), + 'val': os.path.join(self.config['visdial_question_adj_matrices'], 'val'), + 'test': os.path.join(self.config['visdial_question_adj_matrices'], 'test') + } + + self.history_gr_paths = { + 'train': os.path.join(self.config['visdial_history_adj_matrices'], 'train'), + 'val': os.path.join(self.config['visdial_history_adj_matrices'], 'val'), + 'test': os.path.join(self.config['visdial_history_adj_matrices'], 'test') + } + + + def __getitem__(self, index): + MAX_SEQ_LEN = self.config['max_seq_len'] + cur_data = None + cur_dense_annotations = None + + if self._split == 'train': + cur_data = self.visdial_data_train['data'] + cur_dense_annotations = self.visdial_data_train_dense + cur_question_gr_path = self.question_gr_paths['train'] + cur_history_gr_path = self.history_gr_paths['train'] + cur_gr_mapping = self.tr_graph_idx_mapping + + if self.config['rlv_hst_only']: + cur_rlv_hst = self.rlv_hst_train + elif self._split == 'val': + cur_data = self.visdial_data_val['data'] + cur_dense_annotations = self.visdial_data_val_dense + cur_question_gr_path = self.question_gr_paths['val'] + cur_history_gr_path = self.history_gr_paths['val'] + cur_gr_mapping = self.val_graph_idx_mapping + + if self.config['rlv_hst_only']: + cur_rlv_hst = self.rlv_hst_val + elif self._split == 'trainval': + if index >= self.numDataPoints['train']: + cur_data = self.visdial_data_val['data'] + cur_dense_annotations = self.visdial_data_val_dense + cur_gr_mapping = self.val_graph_idx_mapping + index -= self.numDataPoints['train'] + cur_question_gr_path = self.question_gr_paths['val'] + cur_history_gr_path = self.history_gr_paths['val'] + if self.config['rlv_hst_only']: + cur_rlv_hst = self.rlv_hst_val + else: + cur_data = self.visdial_data_train['data'] + cur_dense_annotations = self.visdial_data_train_dense + cur_question_gr_path = self.question_gr_paths['train'] + cur_gr_mapping = self.tr_graph_idx_mapping + cur_history_gr_path = self.history_gr_paths['train'] + if self.config['rlv_hst_only']: + cur_rlv_hst = self.rlv_hst_train + elif self._split == 'test': + cur_data = self.visdial_data_test['data'] + cur_question_gr_path = self.question_gr_paths['test'] + cur_history_gr_path = self.history_gr_paths['test'] + if self.config['rlv_hst_only']: + cur_rlv_hst = self.rlv_hst_test + + # number of options to score on + num_options = self.num_options_dense + if self._split == 'test' or self.config['validating'] or self.config['predicting']: + assert num_options == 100 + else: + assert num_options >=1 and num_options <= 100 + + dialog = cur_data['dialogs'][index] + cur_questions = cur_data['questions'] + cur_answers = cur_data['answers'] + img_id = dialog['image_id'] + if self._split != 'test': + graph_idx = cur_gr_mapping[str(img_id)] + else: + graph_idx = index + + if self._split != 'test': + assert img_id == cur_dense_annotations[index]['image_id'] + if self.config['rlv_hst_only']: + rlv_hst = cur_rlv_hst[str(img_id)] # [10 for each round, 10 for cap + first 9 round ] + + if self._split == 'test': + cur_rounds = len(dialog['dialog']) # 1, 2, ..., 10 + else: + cur_rounds = cur_dense_annotations[index]['round_id'] # 1, 2, ..., 10 + + # caption + cur_rnd_utterance = [] + include_caption = True + if self.config['rlv_hst_only']: + if self.config['rlv_hst_dense_round']: + if rlv_hst[0] == 0: + include_caption = False + elif rlv_hst[cur_rounds - 1][0] == 0: + include_caption = False + if include_caption: + sent = dialog['caption'].split(' ') + tokenized_sent = self.tokenizer.convert_tokens_to_ids(sent) + cur_rnd_utterance.append(tokenized_sent) + # tot_len += len(sent) + 1 + + for rnd, utterance in enumerate(dialog['dialog'][:cur_rounds]): + if self.config['rlv_hst_only'] and rnd < cur_rounds - 1: + if self.config['rlv_hst_dense_round']: + if rlv_hst[rnd + 1] == 0: + continue + elif rlv_hst[cur_rounds - 1][rnd + 1] == 0: + continue + # question + sent = cur_questions[utterance['question']].split(' ') + tokenized_sent = self.tokenizer.convert_tokens_to_ids(sent) + cur_rnd_utterance.append(tokenized_sent) + + # answer + if rnd != cur_rounds - 1: + sent = cur_answers[utterance['answer']].split(' ') + tokenized_sent = self.tokenizer.convert_tokens_to_ids(sent) + cur_rnd_utterance.append(tokenized_sent) + + if self.config['rlv_hst_only']: + num_rlv_rnds = len(cur_rnd_utterance) - 1 + else: + num_rlv_rnds = None + + if self._split != 'test': + gt_option = dialog['dialog'][cur_rounds - 1]['gt_index'] + if self.config['training'] or self.config['debugging']: + # first select gt option id, then choose the first num_options inds + option_inds = [] + option_inds.append(gt_option) + all_inds = list(range(100)) + all_inds.remove(gt_option) + # debug + if num_options < 100: + random.shuffle(all_inds) + all_inds = all_inds[:(num_options-1)] + option_inds.extend(all_inds) + gt_option = 0 + else: + option_inds = range(num_options) + answer_options = [dialog['dialog'][cur_rounds - 1]['answer_options'][k] for k in option_inds] + if 'relevance' in cur_dense_annotations[index]: + key = 'relevance' + else: + key = 'gt_relevance' + gt_relevance = torch.Tensor(cur_dense_annotations[index][key]) + gt_relevance = gt_relevance[option_inds] + assert len(answer_options) == len(option_inds) == num_options + else: + answer_options = dialog['dialog'][-1]['answer_options'] + assert len(answer_options) == num_options + + options_all = [] + for answer_option in answer_options: + cur_option = cur_rnd_utterance.copy() + cur_option.append(self.tokenizer.convert_tokens_to_ids(cur_answers[answer_option].split(' '))) + options_all.append(cur_option) + if not self.config['rlv_hst_only']: + assert len(cur_option) == 2 * cur_rounds + 1 + + tokens_all = [] + mask_all = [] + segments_all = [] + sep_indices_all = [] + hist_len_all = [] + tot_len_debug = [] + + for opt_id, option in enumerate(options_all): + option, start_segment = self.pruneRounds(option, self.config['visdial_tot_rounds']) + tokens, segments, sep_indices, mask, start_question, end_question = encode_input(option, start_segment ,self.CLS, + self.SEP, self.MASK ,max_seq_len=MAX_SEQ_LEN, mask_prob=0) + + tokens_all.append(tokens) + mask_all.append(mask) + segments_all.append(segments) + sep_indices_all.append(sep_indices) + hist_len_all.append(torch.LongTensor([len(option)-1])) + + len_tokens = sum(len(s) for s in option) + tot_len_debug.append(len_tokens + len(option) + 1) + + tokens_all = torch.cat(tokens_all,0) + mask_all = torch.cat(mask_all,0) + segments_all = torch.cat(segments_all, 0) + sep_indices_all = torch.cat(sep_indices_all, 0) + hist_len_all = torch.cat(hist_len_all,0) + question_limits_all = torch.tensor([start_question, end_question]).unsqueeze(0).repeat(num_options, 1) + if self.config['rlv_hst_only']: + assert num_rlv_rnds > 0 + hist_idx = [i * 2 for i in range(num_rlv_rnds)] + else: + hist_idx = [i*2 for i in range(cur_rounds)] + history_sep_indices_all = sep_indices.squeeze(0)[hist_idx].contiguous().unsqueeze(0).repeat(num_options, 1) + + with open(os.path.join(cur_question_gr_path, f'{graph_idx}.pkl'), 'rb') as f: + question_graphs = pickle.load(f) + question_graph_round = question_graphs[cur_rounds - 1] + question_edge_index = [] + question_edge_attribute = [] + for edge_index, edge_attr in question_graph_round: + question_edge_index.append(edge_index) + edge_attr_one_hot = np.zeros((len(self.parse_vocab) + 1,), dtype=np.float32) + edge_attr_one_hot[self.parse_vocab.get(edge_attr, len(self.parse_vocab))] = 1.0 + question_edge_attribute.append(edge_attr_one_hot) + question_edge_index = np.array(question_edge_index, dtype=np.float64) + question_edge_attribute = np.stack(question_edge_attribute, axis=0) + + question_edge_indices_all = [torch.from_numpy(question_edge_index).t().long().contiguous() for _ in range(num_options)] + question_edge_attributes_all = [torch.from_numpy(question_edge_attribute).contiguous() for _ in range(num_options)] + + if self.config['rlv_hst_only']: + with open(os.path.join(cur_history_gr_path, f'{graph_idx}.pkl'), 'rb') as f: + _history_edge_incides_round = pickle.load(f) + else: + with open(os.path.join(cur_history_gr_path, f'{graph_idx}.pkl'), 'rb') as f: + _history_edge_incides_all = pickle.load(f) + _history_edge_incides_round = _history_edge_incides_all[cur_rounds - 1] + + history_edge_index_all = [torch.tensor(_history_edge_incides_round).t().long().contiguous() for _ in range(num_options)] + + if self.config['stack_gr_data']: + question_edge_indices_all = torch.stack(question_edge_indices_all, dim=0) + question_edge_attributes_all = torch.stack(question_edge_attributes_all, dim=0) + history_edge_index_all = torch.stack(history_edge_index_all, dim=0) + + item = {} + + item['tokens'] = tokens_all.unsqueeze(0) # [1, num_options, max_len] + item['segments'] = segments_all.unsqueeze(0) + item['sep_indices'] = sep_indices_all.unsqueeze(0) + item['mask'] = mask_all.unsqueeze(0) + item['hist_len'] = hist_len_all.unsqueeze(0) + item['question_limits'] = question_limits_all + item['question_edge_indices'] = question_edge_indices_all + item['question_edge_attributes'] = question_edge_attributes_all + item['history_edge_indices'] = history_edge_index_all + item['history_sep_indices'] = history_sep_indices_all + + # add dense annotation fields + if self._split != 'test': + item['gt_relevance'] = gt_relevance # [num_options] + item['gt_option_inds'] = torch.LongTensor([gt_option]) + + # add next sentence labels for training with the nsp loss as well + nsp_labels = torch.ones(*tokens_all.unsqueeze(0).shape[:-1]).long() + nsp_labels[:,gt_option] = 0 + item['next_sentence_labels'] = nsp_labels + + item['round_id'] = torch.LongTensor([cur_rounds]) + else: + if 'round_id' in dialog: + item['round_id'] = torch.LongTensor([dialog['round_id']]) + else: + item['round_id'] = torch.LongTensor([cur_rounds]) + + # get image features + if not self.config['dataloader_text_only']: + features, num_boxes, boxes, _ , image_target, image_edge_indexes, image_edge_attributes = self._image_features_reader[img_id] + features, spatials, image_mask, image_target, image_label = encode_image_input(features, num_boxes, boxes, image_target, max_regions=self._max_region_num, mask_prob=0) + else: + features = spatials = image_mask = image_target = image_label = torch.tensor([0]) + item['image_feat'] = features + item['image_loc'] = spatials + item['image_mask'] = image_mask + item['image_id'] = torch.LongTensor([img_id]) + item['tot_len'] = torch.LongTensor(tot_len_debug) + + + + item['image_edge_indices'] = [torch.from_numpy(image_edge_indexes).contiguous().long() for _ in range(num_options)] + item['image_edge_attributes'] = [torch.from_numpy(image_edge_attributes).contiguous() for _ in range(num_options)] + + if self.config['stack_gr_data']: + item['image_edge_indices'] = torch.stack(item['image_edge_indices'], dim=0) + item['image_edge_attributes'] = torch.stack(item['image_edge_attributes'], dim=0) + + return item diff --git a/ensemble.py b/ensemble.py new file mode 100644 index 0000000..850917f --- /dev/null +++ b/ensemble.py @@ -0,0 +1,114 @@ +import os +import os.path as osp +import numpy as np +import json +import argparse +import pyhocon +import glog as log +import torch +from tqdm import tqdm + +from utils.data_utils import load_pickle_lines +from utils.visdial_metrics import scores_to_ranks + + +parser = argparse.ArgumentParser(description='Ensemble for VisDial') +parser.add_argument('--exp', type=str, default='test', + help='experiment name from .conf') +parser.add_argument('--mode', type=str, default='predict', choices=['eval', 'predict'], + help='eval or predict') +parser.add_argument('--ssh', action='store_true', + help='whether or not we are executing command via ssh. ' + 'If set to True, we will not log.info anything to screen and only redirect them to log file') + + +if __name__ == '__main__': + args = parser.parse_args() + + # initialization + config = pyhocon.ConfigFactory.parse_file(f"config/ensemble.conf")[args.exp] + config["log_dir"] = os.path.join(config["log_dir"], args.exp) + if not os.path.exists(config["log_dir"]): + os.makedirs(config["log_dir"]) + + # set logs + log_file = os.path.join(config["log_dir"], f'{args.mode}.log') + set_log_file(log_file, file_only=args.ssh) + + # print environment info + log.info(f"Running experiment: {args.exp}") + log.info(f"Results saved to {config['log_dir']}") + log.info(pyhocon.HOCONConverter.convert(config, "hocon")) + + if isinstance(config['processed'], list): + assert len(config['models']) == len(config['processed']) + processed = {model:pcd for model, pcd in zip(config['models'], config['processed'])} + else: + processed = {model: config['processed'] for model in config['models']} + + if config['split'] == 'test' and np.any(config['processed']): + test_data = json.load(open(config['visdial_test_data']))['data']['dialogs'] + imid2rndid = {t['image_id']: len(t['dialog']) for t in test_data} + del test_data + + # load predictions files + visdial_outputs = dict() + if args.mode == 'eval': + metrics = {} + for model in config['models']: + pred_filename = osp.join(config['pred_dir'], model, 'visdial_prediction.pkl') + pred_dict = {p['image_id']: p for p in load_pickle_lines(pred_filename)} + log.info(f'Loading {len(pred_dict)} predictions from {pred_filename}') + visdial_outputs[model] = pred_dict + if args.mode == 'eval': + assert len(visdial_outputs[model]) >= num_dialogs + metric = json.load(open(osp.join(config['pred_dir'], model, "metrics_epoch_best.json"))) + metrics[model] = metric['val'] + + image_ids = visdial_outputs[model].keys() + predictions = [] + + # for each dialog + for image_id in tqdm(image_ids): + scores = [] + round_id = None + + for model in config['models']: + pred = visdial_outputs[model][image_id] + + if config['split'] == 'test' and processed[model]: + # if predict on processed data, the first few rounds are deleted from some dialogs + # so the original round ids can only be found in the original test data + round_id_in_pred = imid2rndid[image_id] + else: + round_id_in_pred = pred['gt_relevance_round_id'] + + if not isinstance(round_id_in_pred, int): + round_id_in_pred = int(round_id_in_pred) + if round_id is None: + round_id = round_id_in_pred + else: + # make sure all models have the same round_id + assert round_id == round_id_in_pred + scores.append(torch.from_numpy(pred['nsp_probs']).unsqueeze(0)) + + # ensemble scores + scores = torch.cat(scores, 0) # [n_model, num_rounds, num_options] + scores = torch.sum(scores, dim=0, keepdim=True) # [1, num_rounds, num_options] + + + if scores.size(0) > 1: + scores = scores[round_id - 1].unsqueeze(0) + ranks = scores_to_ranks(scores) # [eval_batch_size, num_rounds, num_options] + ranks = ranks.squeeze(1) + prediction = { + "image_id": image_id, + "round_id": round_id, + "ranks": ranks[0].tolist() + } + predictions.append(prediction) + + filename = osp.join(config['log_dir'], f'{config["split"]}_ensemble_preds.json') + with open(filename, 'w') as f: + json.dump(predictions, f) + log.info(f'{len(predictions)} predictions saved to {filename}') diff --git a/main.py b/main.py new file mode 100644 index 0000000..d6ef13c --- /dev/null +++ b/main.py @@ -0,0 +1,199 @@ +from utils.init_utils import load_runner, load_dataset, set_random_seed, set_training_steps, initialize_from_env, set_log_file, copy_file_to_log +import torch.distributed as dist +import torch.nn as nn +import torch.multiprocessing as mp +import torch +import os +import sys +import argparse +import pyhocon +import glog as log +import socket +import getpass + +try: + from apex.parallel import DistributedDataParallel as DDP + from apex import amp +except ModuleNotFoundError: + print('apex not found') + +parser = argparse.ArgumentParser(description='Main script for VD-GR') +parser.add_argument( + '--model', + type=str, + default='vdgr/P1', + help='model name to train or test') + +parser.add_argument( + '--mode', + type=str, + default='train', + help='train, eval, predict or debug') + +parser.add_argument( + '--wandb_project', + type=str, + default='VD-GR' +) + +parser.add_argument( + '--wandb_mode', + type=str, + default='online', + choices=['online', 'offline', 'disabled', 'run', 'dryrun'] +) + +parser.add_argument( + '--tag', + type=str, + default='K2', + help="Tag to differentiate the different runs" +) + +parser.add_argument( + '--eval_dir', + type=str, + default='', + help="Directory of a trained model to evaluate" +) + +parser.add_argument('--ssh', action='store_true', + help='whether or not we are executing command via ssh. ' + 'If set to True, we will not log.info anything to screen and only redirect them to log file') + + +def main(gpu, config, args): + config['training'] = args.mode == 'train' + config['validating'] = args.mode == 'eval' + config['debugging'] = args.mode == 'debug' + config['predicting'] = args.mode == 'predict' + config['wandb_project'] = args.wandb_project + config['wandb_mode'] = args.wandb_mode + + if config['parallel'] and config['dp_type'] != 'dp': + config['rank'] = gpu + os.environ["MASTER_ADDR"] = "localhost" + os.environ["MASTER_PORT"] = str(config['master_port']) + dist.init_process_group( + backend='nccl', + world_size=config['num_gpus'], + rank=gpu + ) + config['display'] = gpu == 0 + if config['dp_type'] == 'apex': + torch.cuda.set_device(gpu) + else: + config['display'] = True + if config['debugging'] or (config['parallel'] and config['dp_type'] != 'dp'): + config['num_workers'] = 0 + else: + config['num_workers'] = 0 + # set logs + log_file = os.path.join(config["log_dir"], f'{args.mode}.log') + set_log_file(log_file, file_only=args.ssh) + + # print environment info + if config['display']: + log.info('Host: {}, user: {}, CUDA_VISIBLE_DEVICES: {}, cwd: {}'.format( + socket.gethostname(), getpass.getuser(), os.environ.get('CUDA_VISIBLE_DEVICES', ''), os.getcwd())) + log.info('Command line is: {}'.format(' '.join(sys.argv))) + + if config['parallel'] and config['dp_type'] != 'dp': + log.info( + f'World_size: {config["num_gpus"]}, cur rank: {config["rank"]}') + log.info(f"Running experiment: {args.model}") + log.info(f"Results saved to {config['log_dir']}") + + # initialization + if config['display'] and config['training']: + copy_file_to_log(config['log_dir']) + set_random_seed(config['random_seed']) + + device = torch.device(f"cuda:{gpu}") + if config["use_cpu"]: + device = torch.device("cpu") + config['device'] = device + + # prepare dataset + dataset, dataset_eval = load_dataset(config) + + # set training steps + if not config['validating'] or config['parallel']: + config = set_training_steps(config, len(dataset)) + + if config['display']: + log.info(pyhocon.HOCONConverter.convert(config, "hocon")) + + # load runner + runner = load_runner(config) + # apex + if config['dp_type'] == 'apex': + runner.model, runner.optimizer = amp.initialize(runner.model, + runner.optimizer, + opt_level="O1") + # parallel + if config['parallel']: + if config['dp_type'] == 'dp': + runner.model = nn.DataParallel(runner.model) + runner.model.to(config['device']) + elif config['dp_type'] == 'apex': + runner.model = DDP(runner.model) + elif config['dp_type'] == 'ddp': + torch.cuda.set_device(gpu) + runner.model = runner.model.to(gpu) + runner.model = nn.parallel.DistributedDataParallel( + runner.model, + device_ids=[gpu], + output_device=gpu, + find_unused_parameters=True) + else: + raise ValueError(f'Unrecognized dp_type: {config["dp_type"]}') + + if config['training'] or config['debugging']: + runner.load_pretrained_vilbert() + runner.train(dataset, dataset_eval) + else: + if config['loads_start_path']: + runner.load_pretrained_vilbert() + else: + runner.load_ckpt_best() + + metrics_results = {} + if config['predicting']: + eval_splits = [config['predict_split']] + else: + eval_splits = ['val'] + if config['model_type'] == 'conly' and not config['train_each_round']: + eval_splits.append('test') + for split in eval_splits: + if config['display']: + log.info(f'Results on {split} split of the best epoch') + if dataset_eval is None: + dataset_to_eval = dataset + else: + dataset_to_eval = dataset_eval + dataset_to_eval.split = split + _, metrics_results[split] = runner.evaluate( + dataset_to_eval, eval_visdial=True) + if not config['predicting'] and config['display']: + runner.save_eval_results(split, 'best', metrics_results) + + if config['parallel'] and config['dp_type'] != 'dp': + dist.destroy_process_group() + + +if __name__ == '__main__': + args = parser.parse_args() + # initialization + model_type, model_name = args.model.split('/') + config = initialize_from_env( + model_name, args.mode, args.eval_dir, model_type, tag=args.tag) + if config['num_gpus'] > 1: + config['parallel'] = True + if config['dp_type'] == 'dp': + main(0, config, args) + else: + mp.spawn(main, nprocs=config['num_gpus'], args=(config, args)) + else: + config['parallel'] = False + main(0, config, args) diff --git a/misc/.gitkeep b/misc/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/misc/teaser_1.png b/misc/teaser_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e493fa2f428b25546b7bc1af5968d2550cee50f1 GIT binary patch literal 2289522 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

snFXT*SEqXxtbErQO--Z7&`)hkxaA74c58#1g- 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 z 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

t^Z&Jllj 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 z

~uO|KKiEr;&IIHKLhS+rKg!Eik@O~{=CZQH1w!mR~?LQLY#xd z61Uo7NvgUPT}B@91f9vXMCH&psu$6tZqU@9RvlknSxB3EFfjxS0YktLFa!(%L%jex2s)4zh!FIg8+eTAIGxdh z&Wl>3`v@EV;T{IPiv_$|sq1y}p&aB({zzC3${7lIF-r+O+P80CzelgCPLJy9FfPZ9 z8a0ZZvfqY)Az%m?0){|N5ty>&L076RKu$BV#0>#Mzz{G53;{!+3<5P6Unq0dP8b4) zK;96*MFQlG67&$|Dv(5MT!UmPkJQn4sq7)4Af!k$9rB&DiAy=NS)NqNY+(!mL%5P&6uA%e}} zSOs%SHJR6Qwl@R}0YktLNQ?k1x9U?31?#T*)YxxD#rB4PAz%m?0)~JgUpk@)5-HL7q7y^cXAz%m?0)~JgU0`1%0e81TO zWQLu^G6W0(Lm({#jD$}ME(>f37y^cXAz%m?0)~JgUW;vT?ORMTTY&0b3+(<40YktLFa!(%L%o6HuVlEAlY4FN;I5HJJ`0YktLFa!(% zL%<71PlQ~zz{G53;{#H5HJJ`0YktLFa!(%L%t9y@6VhJYbp2p9r}fFY0;0&g9%*FVh`AT7u&upwXw7y^cX zAz%m?0)~JgUW|Bmu}2O~y|5Vj36prrqI z-+d=dnl$lSj~+dQEtD&-yi$Jio8QPTyX+F4w&MVS_7^-A{Hj`qv;T2M)w&_O8$-Yl zFa!(%L%({T`TWQ?5u`FJ^ zxJ)>R>5(HxmO0Of+i$;JuD<%}xYrV$?B2b*bn4W}6W$Qqxf1T>?z`{y+maP!53;{#H5HJJ`fvSK21oIVF zZ1Bwk;XHi!@Yn`PjGT4WSpoqaPav{)-g#$#Y4G5|eos1g-F26od+xciXwf2h{PD*H z5}$CIK4~KCIoH2`e<42z{U@Gy!Ve5!g--g}7R=oty&>6EC^O~6`ki~F+>{Bj9^(Dr zgAbOguDVKtm)bK}FmBv9k0bY~_r!hm>C?xDn3;{!+>LH*+Hx}7g z#6vnm%p+=@jiq-YAs$3IBsJk6p&^$^R|S$<(@>W#5aE!~(ewPqG8`doh;PmjK1@^7 zPIpgQ+$W?v$9?&|I+$YCu*_8(WlwHjhAiJ1mmKww<&o}C} ziF&9cuwJ8{@=hircQY$R=CPD~$88g{Ie0&dO?1!;%z3YQUwQYKp~8E}AQ%H;@o+~U z694<}zxM-ngy)>PtKxa7{tR*1byxQSZWQt*9)o!*3g>INKLL z0z7A)Ye`8-tPW9^AhbEJ*LeQab7qog9W8{rFYo;*gfb>81B5jLXzEgm!7uQgK7G1> z|3X(((R2vQ3>lskZl;KbUP9;b8*I3)x+NN)-#k~s^R9D@K*V#74gFT05KaeYD3ggH zUOivzwr$R%H<|Ccer(TDvhrzz{G53;{#H5GZy8V3S}7 zVXhDuM1GgY3M!k7<8#bBvmr3#u#%)rxkwvxdsxd%gnJ-8SS-q@=_F&&!hB%d6qoRP zMUO*26`0>D+g8zZEq-Alpznw7!%|W=F@Z-?t(Rf^Tpq&&!#o#Sxl*}jnDbDtX&lu9 zu;TFqoq?G=g1*q{3L2K*sv8;ABcG^{FV9s+GxWKKX@M!D1j!^!J3LMn$F3OyhJYbp z2p9r}K=nhwi1+IE%q86p_c4Z$QHf+-}6 z{e|FPx`cKRHQ}N9b_aVrX6iX#d$g*q>G^CQJg{fW$C^^eC z6s`M(fB+=2maP!VlWG}w&%sjP`)EAwD;}whzS98*-uXoLj{Z;+cXVe|Po_F>r+KN~ zjg}MrML7`s*66@zG@Si51PlQ~zz{G541wy6fRXUk`}y158v=%aAz%m?0){|=BLD#e z!L5Xm`jtsUctaFnRSt=rh}_EbmhnZS1QP@qWnmB?6TxymEFYw1I;6YiiM6YeWO}Y5 zd$o!s4a%g}&lO42;ubFgnbgUQ@AmS?x0_InYyp%M=N;DLD0Zsb~clSJ!TvZsyXOJa`key-zED=G1Qz8b81PPLX6v2wX1en!IK*(ASk&tEHBnVg` z5)$kf5(@$T1ctx_jz9!R;}3we_}BO`cgxj1)w4Z2J>AcdYODLcoO{l{?k#Dbx>If5 zYio{a&z${L2-9v{17ltOvPGF={C$G4k1>1~pNDk>X>kyWUwY}K_vW)0l@r66`$~*| z0=|6supUO^Ke=dk=gyr~?Aoc@WOCd>aaD0^P4s|T+imL3Os8U#|w-i?EDaxxk6LlAhJgJFdA7$Gd zGncGWpS9E1nzcs9etCJh@#2SXpVjeUO!HKKF{Y1pqw&H2y?ggo?X)*OrJG_N|6<{1 z&a_Fs(|UFMi6^o6WmqWIlV z!M5F!x~rUsqeMPO1WmqeL4NhsS5MB*&sU;iMfY71-+w>W5i#09Ks7I{F`}|{HJuBD zY(_-ZJ_4) zGnT${KH_saUdoLzH4g;he_A*9oo{@twLDlD+vOcKxu2<%(>|D(Mz&%~?$|GV_^?eb zpZwRY$GaC`8)9u+0wquaB~SwUN#L>l469Lw8iE z`04p@2$;i5=h&FFwU+rm3b64tU5nOCc4TM%n}c>#6XB=p*;s`8C6@8|n_9{U#Sdfr zh+od)lAki`Zb_VS#vuLEM>%HJA`ZrIuZ!SqjPWlEd|zUl?kh|Bk8Rvv#f5WNtIvJV zXKln?D}fRyff6Wz5-0%#Zusu^PyPJ4=erl6Q@I36pae>w1WMre2oSmmQG^~sF@ehK zQV3Ye2t-7@tFlpeGDd_(v7DZsUU(#~2xy~tm9n%M&)Uf^yVnVI#?Fy)ZLnBkV%DDE z7ZKj8BrqN0TH>p1j+ekxWDki5#%E_|53Gx)o_Z=x9uRV^ZDuZJ{+XZV6qJo z7rWeZ-^tl{5&N~Nl|TuUKnavU36wwx+;9;-Y4ltIB~St-Py!`T0*{!$y*GYvevNwp z2ugNwXQyR^JHn5{Yc8_0^eV^@zedrKU}gvJwnlIxTIoL;QESfRWNfdmkRuKezzBED zYe0x$+lX%b;>icGF9K+Mt{nHD64*fCqWNad-oJl;_Q?9>-nt_2W(T;r>~&LPn+;(+ zP&JCsshBHE-P}3i_q5JBv`+lGtF<5TnJ7<;U)OK+LtN))omqc*-B02k*JR4p^&jiU ze(TyVDHpHnA@|&S#&g7X*Ds%!_-&gKD1j0vff6Wz!zNG>{;;oavnzoTD1j0vff6_{ z0(Q3(u82Ma?7WtSC`3r!cBkx8JcK9WT7*X8zweh7`t^&@Ee68lCNWMMeF$m##q=Tm ziRUu8M??J|8?@v>=t_OeX z7>hFxAu|5dN57ZAt_j@w!}tDpje7xhoz9;5d*S}wJ&UN}lt2j_2!Sf`2XY~sMhTQa z36wwyl)!Nih~ks?%}}&#yJRW53KH=h#oTww69t>C+vYo#uNuDlPvWLNfRV zS0`5Qj`1RQVq^rwi-famk6q{YGUXB8os%m+Vj9K9%lK}e{UhL-5_%nZ&|*EA&tutK zqC^bCW*=BdW36ztyy!+F|`P}*7V$57q9WM_I!3I_kb!7we+=?l#7L^ zPt+F2Xc5ov+_|%gM?WvDPaF}vldryV(oYOns@rz^zWi?8y0scpj4`o>`5KeP3eo6O(b681swHx!)v~sXyFZ zzr2gf_+l1=81+}b={}`itcf>y&Ru^#!91UO7*{s_cV7S9$=lz4dFTF#M#MZq z4{>K(froI$2waRmLXq#pNX922ix^ETBg8uspVEKT@FD(*$Zrf{nq9hbG6unGYT`RP zJ3Bc)KVQWwZX%cRIa4PG?U*y)M6#)=!;~N>KSG>c!9+=H=Hi+9*thS0`}*n0lh6HT z-@@8iJpcH`*G@k1>;3=lOx9=C)+PYvrg{6YmWNqaIdA2)B&UmVk+V3r^`)OY_1y)t zi{fm336wwy>^XrSJ^$e^pPYQ`D(sFM0AWcYRYQS7q9S3r>s=+)}w1lAGg z7Wj2!T3!MrPy!`T0wwTB2y_elAk~Ur!)8i~s-t literal 0 HcmV?d00001 diff --git a/misc/teaser_2.png b/misc/teaser_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d279406bca5c1843eafbeebabdd10a669a367554 GIT binary patch literal 3780953 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%0D=I50D=I5z@LEt@b>rdLPE5lPo;lX;siWQ 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 z

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
5MT)8ECPXnf$;M3%8(M7BeM7i@JdMuMSXN? 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 Hja&GCfeYVv literal 0 HcmV?d00001 diff --git a/misc/usa.png b/misc/usa.png new file mode 100644 index 0000000000000000000000000000000000000000..eebfcf4aa9c2387000097fb07088e4af53a58017 GIT binary patch literal 11719 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 literal 0 HcmV?d00001 diff --git a/models/__init__.py b/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/models/runner.py b/models/runner.py new file mode 100644 index 0000000..173a572 --- /dev/null +++ b/models/runner.py @@ -0,0 +1,830 @@ +import os +import os.path as osp +import json +from collections import deque +import time +import re +import shutil +import glob +import pickle +import gc +import numpy as np +import glog as log +try: + from apex import amp +except ModuleNotFoundError: + print('apex not found') + +import torch +import torch.utils.data as tud +import torch.nn.functional as F +import torch.distributed as dist + +from utils.data_utils import load_pickle_lines +from utils.visdial_metrics import SparseGTMetrics, NDCG, scores_to_ranks +import wandb + + +class Runner: + def __init__(self, config): + self.config = config + if 'rank' in config: + self.gpu_rank = config['rank'] + else: + self.gpu_rank = 0 + + self.epoch_idx = 0 + self.max_metric = 0. + self.max_metric_epoch_idx = 0 + self.na_str = 'N/A' + + if self.config["max_ckpt_to_keep"] > 0: + self.checkpoint_queue = deque( + [], maxlen=config["max_ckpt_to_keep"]) + self.metrics_queue = deque([], maxlen=config["max_ckpt_to_keep"]) + + self.setup_wandb() + + def setup_wandb(self): + if self.gpu_rank == 0: + print("[INFO] Set wandb logging on rank {}".format(0)) + run = wandb.init( + project=self.config['wandb_project'], config=self.config, mode=self.config['wandb_mode']) + else: + run = None + self.run = run + + def forward(self, batch, eval_visdial=False): + return NotImplementedError + + def train(self, dataset, dataset_eval=None): + # wandb.login() + if os.path.exists(self.config['log_dir']) or self.config['loads_ckpt'] or self.config['loads_best_ckpt']: + self.load_ckpt() + + if self.config['use_trainval']: + dataset.split = 'trainval' + else: + dataset.split = 'train' + batch_size = self.config['batch_size'] + if self.config['parallel'] and self.config['dp_type'] != 'dp': + sampler_tr = tud.distributed.DistributedSampler( + dataset, + num_replicas=self.config['num_gpus'], + rank=self.gpu_rank + ) + else: + sampler_tr = None + + data_loader_tr = tud.DataLoader( + dataset=dataset, + batch_size=batch_size, + shuffle=self.config['training'] and not self.config['parallel'], + collate_fn=dataset.collate_fn, + num_workers=self.config['num_workers'], + sampler=sampler_tr + ) + + + start_epoch_idx = self.epoch_idx + num_iter_epoch = self.config['num_iter_per_epoch'] + if self.config['display']: + log.info(f'{num_iter_epoch} iter per epoch.') + + # eval before training + eval_dense_at_first = self.config['train_on_dense'] and self.config['skip_mrr_eval'] and start_epoch_idx == 0 + # eval before training under 2 circumstances: + # for dense finetuning, eval ndcg before the first epoch + # for mrr training, continue training and the last epoch is not evaluated + + if (eval_dense_at_first or (self.config['eval_at_start'] and len(self.metrics_queue) == 0 and start_epoch_idx > 0)): + if eval_dense_at_first: + iter_now = 0 + else: + iter_now = max(num_iter_epoch * start_epoch_idx, 0) + + if dataset_eval is None: + dataset.split = 'val' + dataset_to_eval = dataset + else: + dataset_to_eval = dataset_eval + + metrics_results = {} + metrics_to_maximize, metrics_results['val'] = self.evaluate( + dataset_to_eval, iter_now) + if eval_dense_at_first: + self.max_metric = metrics_to_maximize + self.max_metric_epoch_idx = -1 + else: + if self.config['display']: + self.save_eval_results( + 'val', start_epoch_idx - 1, metrics_results) + if metrics_to_maximize > self.max_metric: + self.max_metric = metrics_to_maximize + self.max_metric_epoch_idx = start_epoch_idx - 1 + self.copy_best_results('val', start_epoch_idx - 1) + self.copy_best_predictions('val') + if dataset_eval is None: + if self.config['use_trainval']: + dataset.split = 'trainval' + else: + dataset.split = 'train' + + num_epochs = self.config['num_epochs'] + + for epoch_idx in range(start_epoch_idx, num_epochs): + if self.config['parallel'] and self.config['dp_type'] != 'dp': + sampler_tr.set_epoch(epoch_idx) + + self.epoch_idx = epoch_idx + + if self.config['display']: + log.info(f'starting epoch {epoch_idx}') + log.info('training') + + self.model.train() + + num_batch = 0 + next_logging_pct = .1 + next_evaluating_pct = self.config["next_evaluating_pct"] + .1 + start_time = time.time() + self.optimizer.zero_grad() + + for batch in data_loader_tr: + if self.config['eval_before_training']: + log.info('Skipping stright to evaluation...') + break + num_batch += 1 + pct = num_batch / num_iter_epoch * 100 + iter_now = num_iter_epoch * epoch_idx + num_batch + + output = self.forward(batch) + losses = output['losses'] + + # optimizer step + losses['tot_loss'] /= self.config['batch_multiply'] + # debug + if self.config['debugging']: + log.info('try backward') + if self.config['dp_type'] == 'apex': + with amp.scale_loss(losses['tot_loss'], self.optimizer) as scaled_loss: + scaled_loss.backward() + else: + losses['tot_loss'].backward() + if self.config['debugging']: + log.info('backward done') + + if iter_now % self.config['batch_multiply'] == 0: + self.optimizer.step() + self.optimizer.zero_grad() + self.scheduler.step() + + # display and eval + if pct >= next_logging_pct: + if self.config['display']: + loss_to_print = '' + for key in losses: + if losses[key] is not None and isinstance(losses[key], torch.Tensor): + loss_to_print += f'[{key}: {losses[key].item():.4f}]' + print( + f'[{int(pct)}%][Epoch: {epoch_idx + 1}/{num_epochs}][Iter : {num_batch}/{len(data_loader_tr)}] [time: {time.time() - start_time:.2f}] {loss_to_print}' + ) + + + next_logging_pct += self.config["next_logging_pct"] + + if self.config['debugging']: + break + + if pct >= next_evaluating_pct: + next_evaluating_pct += self.config["next_evaluating_pct"] + + if self.run: + if self.config['train_on_dense']: + self.run.log( + { + "Train/dense_loss": losses['dense_loss'], + "Train/total_loss": losses['tot_loss'], + }, + step=iter_now + ) + + else: + self.run.log( + { + "Train/lm_loss": losses['lm_loss'], + "Train/img_loss": losses['img_loss'], + "Train/nsp_loss": losses['nsp_loss'], + "Train/total_loss": losses['tot_loss'], + }, + step=iter_now + ) + + lr_gnn, lr_bert = self.scheduler.get_lr()[0], self.scheduler.get_lr()[1] + self.run.log( + { + "Train/lr_gnn": lr_gnn, + "Train/lr_bert": lr_bert, + }, + step=iter_now + ) + del losses + # debug + torch.cuda.empty_cache() + + if self.config['display']: + log.info( + f'100%,\ttime:\t{time.time() - start_time:.2f}' + ) + ckpt_path = self.save_ckpt() + + if not self.config['skip_visdial_eval'] and self.epoch_idx % self.config['eval_visdial_every'] == 0: + + iter_now = num_iter_epoch * (epoch_idx + 1) + + if dataset_eval is None: + dataset.split = 'val' + dataset_to_eval = dataset + else: + dataset_to_eval = dataset_eval + metrics_results = {} + metrics_to_maximize, metrics_results['val'] = self.evaluate( + dataset_to_eval, iter_now) + if dataset_eval is None: + if self.config['use_trainval']: + dataset.split = 'trainval' + else: + dataset.split = 'train' + if self.config['display']: + self.save_eval_results('val', epoch_idx, metrics_results) + + if self.config['display']: + + if metrics_to_maximize > self.max_metric: + self.max_metric = metrics_to_maximize + self.max_metric_epoch_idx = epoch_idx + self.copy_best_results('val', epoch_idx) + self.copy_best_predictions('val') + + elif not self.config['parallel'] and epoch_idx - self.max_metric_epoch_idx > self.config["early_stop_epoch"]: + log.info('Early stop.') + break + + if self.run: + self.run.log( + {"Val/metric_best": self.max_metric}, step=iter_now) + + if self.config['parallel']: + if self.config['dp_type'] == 'dp': + gc.collect() + torch.cuda.empty_cache() + else: + dist.barrier() + log.info('Rank {} passed barrier...'.format(self.gpu_rank)) + + if self.config['stop_epochs'] >= 0 and epoch_idx + 1 >= self.config['stop_epochs']: + if self.config['display']: + log.info('Stop for reaching stop_epochs.') + break + + def evaluate(self, dataset, training_iter=None, eval_visdial=True): + # create files to save output + if self.config['predicting']: + visdial_file_name = None + if self.config['save_score']: + visdial_file_name = osp.join( + self.config['log_dir'], f'visdial_prediction.pkl') + if osp.exists(visdial_file_name): + dialogs_predicted = load_pickle_lines( + visdial_file_name) + dialogs_predicted = [d['image_id'] + for d in dialogs_predicted] + else: + dialogs_predicted = [] + f_visdial = open(visdial_file_name, 'ab') + + else: + visdial_file_name = osp.join( + self.config['log_dir'], f'visdial_prediction.jsonlines') + if self.config['parallel'] and self.config['dp_type'] != 'dp': + visdial_file_name = visdial_file_name.replace( + '.jsonlines', f'_{self.config["rank"]}of{self.config["num_gpus"]}.jsonlines') + if osp.exists(visdial_file_name): + dialogs_predicted_visdial = [json.loads( + line)['image_id'] for line in open(visdial_file_name)] + f_visdial = open(visdial_file_name, 'a') + else: + dialogs_predicted_visdial = [] + f_visdial = open(visdial_file_name, 'w') + + dialogs_predicted = dialogs_predicted_visdial + + if len(dialogs_predicted) > 0: + log.info(f'Found {len(dialogs_predicted)} predicted results.') + + if self.config['display']: + if visdial_file_name is not None: + log.info( + f'VisDial predictions saved to {visdial_file_name}') + + elif self.config['display']: + if self.config['continue_evaluation']: + predicted_files = os.listdir( + osp.join(self.config['visdial_output_dir'], dataset.split)) + dialogs_predicted = [ + int(re.match(r'(\d+).npz', p).group(1)) for p in predicted_files] + else: + if osp.exists(osp.join(self.config['visdial_output_dir'], dataset.split)): + shutil.rmtree( + osp.join(self.config['visdial_output_dir'], dataset.split)) + os.makedirs( + osp.join(self.config['visdial_output_dir'], dataset.split)) + + dialogs_predicted = [] + log.info(f'Found {len(dialogs_predicted)} predicted results.') + + if self.config['parallel'] and self.config['dp_type'] != 'dp': + sampler_val = tud.distributed.DistributedSampler( + dataset, + num_replicas=self.config['num_gpus'], + rank=self.gpu_rank + ) + + sampler_val.set_epoch(self.epoch_idx) + else: + sampler_val = None + + data_loader_val = tud.DataLoader( + dataset=dataset, + batch_size=self.config['eval_batch_size'], + shuffle=False, + collate_fn=dataset.collate_fn, + num_workers=self.config['num_workers'], + sampler=sampler_val + ) + self.model.eval() + + with torch.no_grad(): + if self.config['display']: + log.info(f'Evaluating {len(dataset)} samples') + + next_logging_pct = self.config["next_logging_pct"] + .1 + if self.config['parallel'] and self.config['dp_type'] == 'dp': + num_batch_tot = int( + np.ceil(len(dataset) / self.config['eval_batch_size'])) + else: + num_batch_tot = int(np.ceil( + len(dataset) / (self.config['eval_batch_size'] * self.config['num_gpus']))) + num_batch = 0 + if dataset.split == 'val': + num_options = self.config["num_options"] + if self.config['skip_mrr_eval']: + num_rounds = 1 + else: + num_rounds = 10 + elif dataset.split == 'test': + num_options = 100 + num_rounds = 1 + if self.gpu_rank == 0: + start_time = time.time() + + for batch in data_loader_val: + num_batch += 1 + # skip dialogs that have been predicted + if self.config['predicting']: + image_ids = batch['image_id'].tolist() + skip_batch = True + for image_id in image_ids: + if image_id not in dialogs_predicted: + skip_batch = False + if skip_batch: + continue + output = self.forward( + batch, eval_visdial=eval_visdial) + + # visdial evaluation + if eval_visdial: + img_ids = batch['image_id'].tolist() + batch_size = len(img_ids) + if not self.config['skip_ndcg_eval']: + gt_relevance_round_id = batch['round_id'].tolist() + + # [batch_size * num_rounds * num_options, 2] + nsp_scores = output['nsp_scores'] + nsp_probs = F.softmax(nsp_scores, dim=1) + assert nsp_probs.shape[-1] == 2 + # num_dim=2, 0 for postive, 1 for negative + nsp_probs = nsp_probs[:, 0] + nsp_probs = nsp_probs.view( + batch_size, num_rounds, num_options) + + # could be predicting or evaluating + if dataset.split == 'val': + if self.config['skip_ndcg_eval']: + gt_option_inds = batch['gt_option_inds'] + + for b in range(batch_size): + filename = osp.join( + self.config['visdial_output_dir'], dataset.split, f'{img_ids[b]}.npz') + if not osp.exists(filename): + np.savez( + filename, + nsp_probs=nsp_probs[b].cpu().numpy(), + gt_option_inds=gt_option_inds[b].cpu().numpy() + ) + else: + # [batch_size, num_rounds] + gt_option_inds = batch['gt_option_inds'] + # [batch_size, num_options] + gt_relevance = batch['gt_relevance'] + + for b in range(batch_size): + filename = osp.join( + self.config['visdial_output_dir'], dataset.split, f'{img_ids[b]}.npz') + if not osp.exists(filename): + np.savez(filename, + nsp_probs=nsp_probs[b].cpu().numpy(), + gt_option_inds=gt_option_inds[b].cpu( + ).numpy(), + gt_relevance=gt_relevance[b].cpu( + ).numpy(), + gt_relevance_round_id=gt_relevance_round_id[b]) + + # must be predicting + if dataset.split == 'test': + if self.config['save_score']: + for b in range(batch_size): + prediction = { + "image_id": img_ids[b], + "nsp_probs": nsp_probs[b].cpu().numpy(), + "gt_relevance_round_id": gt_relevance_round_id[b] + } + pickle.dump(prediction, f_visdial) + else: + # [eval_batch_size, num_rounds, num_options] + ranks = scores_to_ranks(nsp_probs) + ranks = ranks.squeeze(1) + for b in range(batch_size): + prediction = { + "image_id": img_ids[b], + "round_id": gt_relevance_round_id[b], + "ranks": ranks[b].tolist() + } + f_visdial.write(json.dumps(prediction) + '\n') + + # debug + if self.config['debugging']: + break + + pct = num_batch / num_batch_tot * 100 + if pct >= next_logging_pct: + if self.config['display'] and self.gpu_rank == 0: + log.info( + f'{int(pct)}%,\ttime:\t{time.time() - start_time:.2f}' + ) + next_logging_pct += self.config["next_logging_pct"] + # debug + if self.config['debugging']: + break + + if self.config['display'] and self.gpu_rank == 0: + pct = num_batch / num_batch_tot * 100 + log.info( + f'{int(pct)}%,\ttime:\t{time.time() - start_time:.2f}' + ) + + if not self.config['validating']: + self.model.train() + + if self.config['parallel'] and self.config['dp_type'] != 'dp': + dist.barrier() + + print(f'{self.gpu_rank} passed barrier') + + if self.config['predicting']: + f_visdial.close() + if not self.config['save_score']: + all_visdial_predictions = [json.loads( + line) for line in open(visdial_file_name)] + if self.config['predict_split'] == 'test' and len(all_visdial_predictions) == self.config['num_test_dialogs']: + visdial_file_name = visdial_file_name.replace( + 'jsonlines', 'json') + with open(visdial_file_name, 'w') as f_visdial: + json.dump(all_visdial_predictions, f_visdial) + log.info( + f'Prediction for submisson save to {visdial_file_name}.') + return None, None + + if self.config['display']: + if dataset.split == 'val' and eval_visdial: + if not self.config['skip_mrr_eval']: + sparse_metrics = SparseGTMetrics() + if not self.config['skip_ndcg_eval']: + ndcg = NDCG() + + if dataset.split == 'val' and eval_visdial: + visdial_output_filenames = glob.glob( + osp.join(self.config['visdial_output_dir'], dataset.split, '*.npz')) + log.info( + f'Calculating visdial metrics for {len(visdial_output_filenames)} dialogs') + for visdial_output_filename in visdial_output_filenames: + output = np.load(visdial_output_filename) + nsp_probs = torch.from_numpy( + output['nsp_probs']).unsqueeze(0) + if not self.config['skip_ndcg_eval']: + gt_relevance = torch.from_numpy(output['gt_relevance']).unsqueeze(0) + if not self.config['skip_mrr_eval']: + gt_option_inds = torch.from_numpy( + output['gt_option_inds']).unsqueeze(0) + sparse_metrics.observe(nsp_probs, gt_option_inds) + if not self.config['skip_ndcg_eval']: + gt_relevance_round_id = output['gt_relevance_round_id'] + nsp_probs_dense = nsp_probs[0, gt_relevance_round_id - 1, :].unsqueeze(0) + else: + nsp_probs_dense = nsp_probs.squeeze(0) # [1, 100] + if not self.config['skip_ndcg_eval']: + ndcg.observe(nsp_probs_dense, gt_relevance) + + # visdial eval output + visdial_metrics = {} + if dataset.split == 'val' and eval_visdial: + if not self.config['skip_mrr_eval']: + visdial_metrics.update(sparse_metrics.retrieve(reset=True)) + if not self.config['skip_ndcg_eval']: + visdial_metrics.update(ndcg.retrieve(reset=True)) + + if self.config['display']: + to_print = '' + for metric_name, metric_value in visdial_metrics.items(): + if 'round' not in metric_name: + to_print += f"\n{metric_name}: {metric_value}" + if training_iter is not None: + if self.run: + self.run.log( + {'Val/' + metric_name: metric_value}, step=training_iter) + log.info(to_print) + + if self.config['metrics_to_maximize'] in visdial_metrics: + metrics_to_maximize = visdial_metrics[self.config['metrics_to_maximize']] + else: + metrics_to_maximize = None + torch.cuda.empty_cache() + return metrics_to_maximize, visdial_metrics + else: + torch.cuda.empty_cache() + return None, None + + def save_eval_results(self, split, epoch_idx, metrics_results): + + metrics_filename = osp.join( + self.config['log_dir'], f'metrics_epoch_{epoch_idx}.json') + with open(metrics_filename, 'w') as f: + json.dump(metrics_results, f) + log.info(f'Results of metrics saved to {metrics_filename}') + + if self.config["max_ckpt_to_keep"] > 0: + if len(self.metrics_queue) == self.metrics_queue.maxlen: + todel = self.metrics_queue.popleft() + os.remove(todel) + self.metrics_queue.append(metrics_filename) + + if epoch_idx == 'best': + self.copy_best_predictions(split) + + def copy_best_results(self, split, epoch_idx): + to_print = 'Copy ' + + if not self.config['skip_saving_ckpt']: + ckpt_path = osp.join( + self.config['log_dir'], f'epoch_{epoch_idx}.ckpt') + best_ckpt_path = ckpt_path.replace( + f'{epoch_idx}.ckpt', 'best.ckpt') + shutil.copyfile(ckpt_path, best_ckpt_path) + to_print += best_ckpt_path + ' ' + + metrics_filename = osp.join( + self.config['log_dir'], f'metrics_epoch_{epoch_idx}.json') + best_metric_filename = metrics_filename.replace( + f'{epoch_idx}.json', 'best.json') + shutil.copyfile(metrics_filename, best_metric_filename) + to_print += best_metric_filename + ' ' + + log.info(to_print) + + def copy_best_predictions(self, split): + to_print = 'Copy ' + + visdial_output_dir = osp.join(self.config['visdial_output_dir'], split) + if osp.exists(visdial_output_dir): + dir_best = visdial_output_dir.replace('output', 'output_best') + if osp.exists(dir_best): + shutil.rmtree(dir_best) + shutil.copytree(visdial_output_dir, dir_best) + to_print += dir_best + ' ' + + log.info(to_print) + + def get_ckpt(self): + ckpt = { + 'epoch_idx': self.epoch_idx, + 'max_metric': self.max_metric, + 'seed': self.config['random_seed'], + 'optimizer': self.optimizer.state_dict(), + 'scheduler': self.scheduler.state_dict() + } + if self.config['parallel']: + ckpt['model_state_dict'] = self.model.module.state_dict() + else: + ckpt['model_state_dict'] = self.model.state_dict() + if self.config['dp_type'] == 'apex': + ckpt['amp'] = amp.state_dict() + return ckpt + + def set_ckpt(self, ckpt_dict): + if not self.config['restarts']: + self.epoch_idx = ckpt_dict.get('epoch_idx', -1) + 1 + + if not self.config['resets_max_metric']: + self.max_metric = ckpt_dict.get('max_metric', -1) + + if self.config['parallel']: + model = self.model.module + else: + model = self.model + + model_state_dict = model.state_dict() + former_dict = { + k: v for k, v in ckpt_dict['model_state_dict'].items() if k in model_state_dict} + + if self.config['display']: + log.info("number of keys transferred: %d" % len(former_dict)) + assert len(former_dict.keys()) > 0 + + model_state_dict.update(former_dict) + + model.load_state_dict(model_state_dict) + if self.config['display']: + log.info('loaded model') + del model_state_dict, former_dict + + if not self.config['validating'] and not (self.config['uses_new_optimizer'] or self.config['sets_new_lr']): + if 'optimizer' in ckpt_dict: + self.optimizer.load_state_dict(ckpt_dict['optimizer']) + if self.config['display']: + log.info('loaded optimizer') + if 'scheduler' in ckpt_dict: + self.scheduler.last_epcoh = ckpt_dict['epoch_idx'] * \ + self.config['num_iter_per_epoch'] + self.scheduler.load_state_dict(ckpt_dict['scheduler']) + + if 'amp' in ckpt_dict and self.config['dp_type'] == 'apex': + amp.load_state_dict(ckpt_dict['amp']) + + del ckpt_dict + + torch.cuda.empty_cache() + + def save_ckpt(self): + ckpt_path = f'{self.config["log_dir"]}/epoch_{self.epoch_idx}.ckpt' + log.info(f'saving checkpoint {ckpt_path}') + ckpt = self.get_ckpt() + if self.config['skip_saving_ckpt']: + return ckpt_path + torch_version = float(torch.__version__[:3]) + if torch_version - 1.4 > 1e-3: + torch.save(ckpt, f=ckpt_path, _use_new_zipfile_serialization=False) + else: + torch.save(ckpt, f=ckpt_path) + del ckpt + + if not (self.config['parallel'] and self.config['dp_type'] in ['ddp', 'apex']): + torch.cuda.empty_cache() + + if self.config["max_ckpt_to_keep"] > 0: + if len(self.checkpoint_queue) == self.checkpoint_queue.maxlen: + todel = self.checkpoint_queue.popleft() + os.remove(todel) + self.checkpoint_queue.append(ckpt_path) + + return ckpt_path + + def save_ckpt_best(self): + ckpt_path = f'{self.config["log_dir"]}/epoch_best.ckpt' + log.info(f'saving checkpoint {ckpt_path}') + ckpt = self.get_ckpt() + torch.save(ckpt, f=ckpt_path) + del ckpt + return ckpt_path + + def load_ckpt_best(self): + ckpt_path = f'{osp.dirname(self.config["log_dir"])}/epoch_best.ckpt' + if not osp.exists(ckpt_path): + ckpt_paths = [path for path in os.listdir( + f'{self.config["log_dir"]}/') if path.endswith('.ckpt') and 'best' not in path] + if len(ckpt_paths) == 0: + if self.config['display']: + log.info(f'No .ckpt found in {self.config["log_dir"]}') + return + + def sort_func(x): return int(re.search(r"(\d+)", x).groups()[0]) + ckpt_path = f'{self.config["log_dir"]}/{sorted(ckpt_paths, key=sort_func, reverse=True)[0]}' + if self.config['display']: + log.info(f'loading checkpoint {ckpt_path}') + map_location = {'cuda:0': f'cuda:{self.gpu_rank}'} + self.set_ckpt(torch.load(ckpt_path, map_location=map_location)) + + def load_ckpt(self, ckpt_path=None): + if not ckpt_path: + if self.config['validating'] or self.config['loads_best_ckpt']: + ckpt_path = f'{self.config["log_dir"]}/epoch_best.ckpt' + else: + ckpt_paths = [path for path in os.listdir( + f'{self.config["log_dir"]}/') if path.endswith('.ckpt') and 'best' not in path] + if len(ckpt_paths) == 0: + if self.config['display']: + log.info(f'No .ckpt found in {self.config["log_dir"]}') + return + + def sort_func(x): return int( + re.search(r"(\d+)", x).groups()[0]) + ckpt_path = f'{self.config["log_dir"]}/{sorted(ckpt_paths, key=sort_func, reverse=True)[0]}' + + if self.config['display']: + log.info(f'loading checkpoint {ckpt_path}') + epoch_name = osp.split(ckpt_path)[1].split('.')[0] + if re.search(r"(\d+)", epoch_name): + self.checkpoint_queue.append(ckpt_path) + metrics_filename = osp.join( + self.config['log_dir'], f'metrics_{epoch_name}.json') + if osp.exists(metrics_filename): + self.metrics_queue.append(metrics_filename) + + map_location = {'cuda:0': f'cuda:{self.gpu_rank}'} + self.set_ckpt(torch.load(ckpt_path, map_location=map_location)) + + def match_model_key(self, pretrained_dict, model_dict): + matched_dict = dict() + for key in pretrained_dict: + if key in model_dict: + matched_key = key + elif key.startswith('encoder.') and key[8:] in model_dict: + matched_key = key[8:] + elif key.startswith('module.') and key[7:] in model_dict: + matched_key = key[7:] + elif 'encoder.' + key in model_dict: + matched_key = 'encoder.' + key + elif 'module.' + key in model_dict: + matched_key = 'module.' + key + else: + # not_found.append(key) + continue + matched_dict[matched_key] = pretrained_dict[key] + + not_found = "" + for k in model_dict: + if k not in matched_dict: + not_found += k + '\n' + + log.info("Keys from model_dict that were not found in pretrained_dict:") + log.info(not_found) + return matched_dict + + def load_pretrained_vilbert(self, start_from=None): + if start_from is not None: + self.config["start_path"] = start_from + if self.config['training'] or self.config['debugging']: + ckpt_paths = [path for path in os.listdir( + f'{self.config["log_dir"]}/') if path.endswith('.ckpt') and 'best' not in path] + if len(ckpt_paths) > 0: + if self.config['display']: + log.info('Continue training') + return + + if self.config['display']: + log.info( + f'Loading pretrained VilBERT from {self.config["start_path"]}') + map_location = {'cuda:0': f'cuda:{self.gpu_rank}'} + pretrained_dict = torch.load( + self.config['start_path'], map_location=map_location) + if 'model_state_dict' in pretrained_dict: + pretrained_dict = pretrained_dict['model_state_dict'] + if self.config['parallel']: + model = self.model.module + else: + model = self.model + model_dict = model.state_dict() + + matched_dict = self.match_model_key(pretrained_dict, model_dict) + + if self.config['display']: + log.info("number of keys transferred: %d" % len(matched_dict)) + assert len(matched_dict.keys()) > 0 + model_dict.update(matched_dict) + model.load_state_dict(model_dict) + + del pretrained_dict, model_dict, matched_dict + if not self.config['parallel'] or self.config['dp_type'] == 'dp': + torch.cuda.empty_cache() + + if self.config['display']: + log.info(f'Pretrained VilBERT loaded') diff --git a/models/vdgr.py b/models/vdgr.py new file mode 100644 index 0000000..6aa7f32 --- /dev/null +++ b/models/vdgr.py @@ -0,0 +1,379 @@ +import sys +from collections import OrderedDict + +import torch +from torch import nn +import torch.nn.functional as F + +sys.path.append('../') +from utils.model_utils import listMLE, approxNDCGLoss, listNet, neuralNDCG, neuralNDCG_transposed + +from utils.data_utils import sequence_mask +from utils.optim_utils import init_optim +from models.runner import Runner + +from models.vilbert_dialog import BertForMultiModalPreTraining, BertConfig + + +class VDGR(nn.Module): + + def __init__(self, config_path, device, use_apex=False, cache_dir=None): + super(VDGR, self).__init__() + config = BertConfig.from_json_file(config_path) + + self.bert_pretrained = BertForMultiModalPreTraining.from_pretrained('bert-base-uncased', config, device, use_apex=use_apex, cache_dir=cache_dir) + self.bert_pretrained.train() + + def forward(self, input_ids, image_feat, image_loc, image_edge_indices, image_edge_attributes, + question_edge_indices, question_edge_attributes, question_limits, + history_edge_indices, history_sep_indices, + sep_indices=None, sep_len=None, token_type_ids=None, + attention_mask=None, masked_lm_labels=None, next_sentence_label=None, + image_attention_mask=None, image_label=None, image_target=None): + + masked_lm_loss = None + masked_img_loss = None + nsp_loss = None + seq_relationship_score = None + + if next_sentence_label is not None and masked_lm_labels \ + is not None and image_target is not None: + # train mode, output losses + masked_lm_loss, masked_img_loss, nsp_loss, _, _, seq_relationship_score, _ = \ + self.bert_pretrained( + input_ids, image_feat, image_loc, image_edge_indices, image_edge_attributes, + question_edge_indices, question_edge_attributes, question_limits, + history_edge_indices, history_sep_indices, sep_indices=sep_indices, sep_len=sep_len, \ + token_type_ids=token_type_ids, attention_mask=attention_mask, masked_lm_labels=masked_lm_labels, \ + next_sentence_label=next_sentence_label, image_attention_mask=image_attention_mask,\ + image_label=image_label, image_target=image_target) + else: + #inference, output scores + _, _, seq_relationship_score, _, _, _ = \ + self.bert_pretrained( + input_ids, image_feat, image_loc, image_edge_indices, image_edge_attributes, + question_edge_indices, question_edge_attributes, question_limits, + history_edge_indices, history_sep_indices, + sep_indices=sep_indices, sep_len=sep_len, \ + token_type_ids=token_type_ids, attention_mask=attention_mask, masked_lm_labels=masked_lm_labels, \ + next_sentence_label=next_sentence_label, image_attention_mask=image_attention_mask,\ + image_label=image_label, image_target=image_target) + + out = (masked_lm_loss, masked_img_loss, nsp_loss, seq_relationship_score) + + return out + + +class SparseRunner(Runner): + def __init__(self, config): + super(SparseRunner, self).__init__(config) + self.model = VDGR( + self.config['model_config'], self.config['device'], + use_apex=self.config['dp_type'] == 'apex', + cache_dir=self.config['bert_cache_dir']) + + self.model.to(self.config['device']) + + if not self.config['validating'] or self.config['dp_type'] == 'apex': + self.optimizer, self.scheduler = init_optim(self.model, self.config) + + def forward(self, batch, eval_visdial=False): + # load data + for key in batch: + if isinstance(batch[key], torch.Tensor): + batch[key] = batch[key].to(self.config['device']) + elif isinstance(batch[key], list): + if key != 'dialog_info': # Do not send the dialog_info item to the gpu + batch[key] = [x.to(self.config['device']) for x in batch[key]] + + tokens = batch['tokens'] + segments = batch['segments'] + sep_indices = batch['sep_indices'] + mask = batch['mask'] + hist_len = batch['hist_len'] + image_feat = batch['image_feat'] + image_loc = batch['image_loc'] + image_mask = batch['image_mask'] + next_sentence_labels = batch.get('next_sentence_labels', None) + image_target = batch.get('image_target', None) + image_label = batch.get('image_label', None) + # load the graph data + image_edge_indices = batch['image_edge_indices'] + image_edge_attributes = batch['image_edge_attributes'] + question_edge_indices = batch['question_edge_indices'] + question_edge_attributes = batch['question_edge_attributes'] + question_limits = batch['question_limits'] + history_edge_indices = batch['history_edge_indices'] + history_sep_indices = batch['history_sep_indices'] + + sequence_lengths = torch.gather(sep_indices, 1, hist_len.view(-1, 1)) + 1 + sequence_lengths = sequence_lengths.squeeze(1) + attention_mask_lm_nsp = sequence_mask(sequence_lengths, max_len=tokens.shape[1]) + sep_len = hist_len + 1 + + losses = OrderedDict() + + if eval_visdial: + num_lines = tokens.size(0) + line_batch_size = self.config['eval_line_batch_size'] + num_line_batches = num_lines // line_batch_size + if num_lines % line_batch_size > 0: + num_line_batches += 1 + nsp_scores = [] + for j in range(num_line_batches): + # create chunks of the original batch + chunk_range = range(j*line_batch_size, min((j+1)*line_batch_size, num_lines)) + tokens_chunk = tokens[chunk_range] + segments_chunk = segments[chunk_range] + sep_indices_chunk = sep_indices[chunk_range] + mask_chunk = mask[chunk_range] + sep_len_chunk = sep_len[chunk_range] + attention_mask_lm_nsp_chunk = attention_mask_lm_nsp[chunk_range] + image_feat_chunk = image_feat[chunk_range] + image_loc_chunk = image_loc[chunk_range] + image_mask_chunk = image_mask[chunk_range] + image_edge_indices_chunk = image_edge_indices[chunk_range[0]: chunk_range[-1]+1] + image_edge_attributes_chunk = image_edge_attributes[chunk_range[0]: chunk_range[-1]+1] + question_edge_indices_chunk = question_edge_indices[chunk_range[0]: chunk_range[-1]+1] + question_edge_attributes_chunk = question_edge_attributes[chunk_range[0]: chunk_range[-1]+1] + question_limits_chunk = question_limits[chunk_range[0]: chunk_range[-1]+1] + history_edge_indices_chunk = history_edge_indices[chunk_range[0]: chunk_range[-1]+1] + history_sep_indices_chunk = history_sep_indices[chunk_range[0]: chunk_range[-1]+1] + + _ , _ , _, nsp_scores_chunk = \ + self.model( + tokens_chunk, + image_feat_chunk, + image_loc_chunk, + image_edge_indices_chunk, + image_edge_attributes_chunk, + question_edge_indices_chunk, + question_edge_attributes_chunk, + question_limits_chunk, + history_edge_indices_chunk, + history_sep_indices_chunk, + sep_indices=sep_indices_chunk, + sep_len=sep_len_chunk, + token_type_ids=segments_chunk, + masked_lm_labels=mask_chunk, + attention_mask=attention_mask_lm_nsp_chunk, + image_attention_mask=image_mask_chunk + ) + nsp_scores.append(nsp_scores_chunk) + nsp_scores = torch.cat(nsp_scores, 0) + + else: + losses['lm_loss'], losses['img_loss'], losses['nsp_loss'], nsp_scores = \ + self.model( + tokens, + image_feat, + image_loc, + image_edge_indices, + image_edge_attributes, + question_edge_indices, + question_edge_attributes, + question_limits, + history_edge_indices, + history_sep_indices, + next_sentence_label=next_sentence_labels, + image_target=image_target, + image_label=image_label, + sep_indices=sep_indices, + sep_len=sep_len, + token_type_ids=segments, + masked_lm_labels=mask, + attention_mask=attention_mask_lm_nsp, + image_attention_mask=image_mask + ) + + losses['tot_loss'] = 0 + for key in ['lm_loss', 'img_loss', 'nsp_loss']: + if key in losses and losses[key] is not None: + losses[key] = losses[key].mean() + losses['tot_loss'] += self.config[f'{key}_coeff'] * losses[key] + + output = { + 'losses': losses, + 'nsp_scores': nsp_scores + } + return output + + +class DenseRunner(Runner): + def __init__(self, config): + super(DenseRunner, self).__init__(config) + self.model = VDGR( + self.config['model_config'], self.config['device'], + use_apex=self.config['dp_type'] == 'apex', + cache_dir=self.config['bert_cache_dir']) + + if not(self.config['parallel'] and self.config['dp_type'] == 'dp'): + self.model.to(self.config['device']) + + if self.config['dense_loss'] == 'ce': + self.dense_loss = nn.KLDivLoss(reduction='batchmean') + elif self.config['dense_loss'] == 'listmle': + self.dense_loss = listMLE + elif self.config['dense_loss'] == 'listnet': + self.dense_loss = listNet + elif self.config['dense_loss'] == 'approxndcg': + self.dense_loss = approxNDCGLoss + elif self.config['dense_loss'] == 'neural_ndcg': + self.dense_loss = neuralNDCG + elif self.config['dense_loss'] == 'neural_ndcg_transposed': + self.dense_loss = neuralNDCG_transposed + else: + raise ValueError('dense_loss must be one of ce, listmle, listnet, approxndcg, neural_ndcg, neural_ndcg_transposed') + + if not self.config['validating'] or self.config['dp_type'] == 'apex': + self.optimizer, self.scheduler = init_optim(self.model, self.config) + + def forward(self, batch, eval_visdial=False): + # load data + for key in batch: + if isinstance(batch[key], torch.Tensor): + batch[key] = batch[key].to(self.config['device']) + elif isinstance(batch[key], list): + if key != 'dialog_info': # Do not send the dialog_info item to the gpu + batch[key] = [x.to(self.config['device']) for x in batch[key]] + + # get embedding and forward visdial + tokens = batch['tokens'] + segments = batch['segments'] + sep_indices = batch['sep_indices'] + mask = batch['mask'] + hist_len = batch['hist_len'] + image_feat = batch['image_feat'] + image_loc = batch['image_loc'] + image_mask = batch['image_mask'] + next_sentence_labels = batch.get('next_sentence_labels', None) + image_target = batch.get('image_target', None) + image_label = batch.get('image_label', None) + + # load the graph data + image_edge_indices = batch['image_edge_indices'] + image_edge_attributes = batch['image_edge_attributes'] + question_edge_indices = batch['question_edge_indices'] + question_edge_attributes = batch['question_edge_attributes'] + question_limits = batch['question_limits'] + history_edge_indices = batch['history_edge_indices'] + assert history_edge_indices[0].size(0) == 2 + history_sep_indices = batch['history_sep_indices'] + + sequence_lengths = torch.gather(sep_indices, 1, hist_len.view(-1, 1)) + 1 + sequence_lengths = sequence_lengths.squeeze(1) + attention_mask_lm_nsp = sequence_mask(sequence_lengths, max_len=tokens.shape[1]) + sep_len = hist_len + 1 + + losses = OrderedDict() + + if eval_visdial: + num_lines = tokens.size(0) + line_batch_size = self.config['eval_line_batch_size'] + num_line_batches = num_lines // line_batch_size + if num_lines % line_batch_size > 0: + num_line_batches += 1 + nsp_scores = [] + for j in range(num_line_batches): + # create chunks of the original batch + chunk_range = range(j*line_batch_size, min((j+1)*line_batch_size, num_lines)) + tokens_chunk = tokens[chunk_range] + segments_chunk = segments[chunk_range] + sep_indices_chunk = sep_indices[chunk_range] + mask_chunk = mask[chunk_range] + sep_len_chunk = sep_len[chunk_range] + attention_mask_lm_nsp_chunk = attention_mask_lm_nsp[chunk_range] + image_feat_chunk = image_feat[chunk_range] + image_loc_chunk = image_loc[chunk_range] + image_mask_chunk = image_mask[chunk_range] + image_edge_indices_chunk = image_edge_indices[chunk_range[0]: chunk_range[-1]+1] + image_edge_attributes_chunk = image_edge_attributes[chunk_range[0]: chunk_range[-1]+1] + question_edge_indices_chunk = question_edge_indices[chunk_range[0]: chunk_range[-1]+1] + question_edge_attributes_chunk = question_edge_attributes[chunk_range[0]: chunk_range[-1]+1] + question_limits_chunk = question_limits[chunk_range[0]: chunk_range[-1]+1] + history_edge_indices_chunk = history_edge_indices[chunk_range[0]: chunk_range[-1]+1] + history_sep_indices_chunk = history_sep_indices[chunk_range[0]: chunk_range[-1]+1] + + _, _, _, nsp_scores_chunk = \ + self.model( + tokens_chunk, + image_feat_chunk, + image_loc_chunk, + image_edge_indices_chunk, + image_edge_attributes_chunk, + question_edge_indices_chunk, + question_edge_attributes_chunk, + question_limits_chunk, + history_edge_indices_chunk, + history_sep_indices_chunk, + sep_indices=sep_indices_chunk, + sep_len=sep_len_chunk, + token_type_ids=segments_chunk, + masked_lm_labels=mask_chunk, + attention_mask=attention_mask_lm_nsp_chunk, + image_attention_mask=image_mask_chunk + ) + nsp_scores.append(nsp_scores_chunk) + nsp_scores = torch.cat(nsp_scores, 0) + + else: + _, _, _, nsp_scores = \ + self.model( + tokens, + image_feat, + image_loc, + image_edge_indices, + image_edge_attributes, + question_edge_indices, + question_edge_attributes, + question_limits, + history_edge_indices, + history_sep_indices, + next_sentence_label=next_sentence_labels, + image_target=image_target, + image_label=image_label, + sep_indices=sep_indices, + sep_len=sep_len, + token_type_ids=segments, + masked_lm_labels=mask, + attention_mask=attention_mask_lm_nsp, + image_attention_mask=image_mask + ) + + + if nsp_scores is not None: + nsp_scores_output = nsp_scores.detach().clone() + if not eval_visdial: + nsp_scores = nsp_scores.view(-1, self.config['num_options_dense'], 2) + if 'next_sentence_labels' in batch and self.config['nsp_loss_coeff'] > 0: + next_sentence_labels = batch['next_sentence_labels'].to(self.config['device']) + losses['nsp_loss'] = F.cross_entropy(nsp_scores.view(-1,2), next_sentence_labels.view(-1)) + else: + losses['nsp_loss'] = None + + if not eval_visdial: + gt_relevance = batch['gt_relevance'].to(self.config['device']) + nsp_scores = nsp_scores[:, :, 0] + if self.config['dense_loss'] == 'ce': + losses['dense_loss'] = self.dense_loss(F.log_softmax(nsp_scores, dim=1), F.softmax(gt_relevance, dim=1)) + else: + losses['dense_loss'] = self.dense_loss(nsp_scores, gt_relevance) + else: + losses['dense_loss'] = None + else: + nsp_scores_output = None + losses['nsp_loss'] = None + losses['dense_loss'] = None + + losses['tot_loss'] = 0 + for key in ['nsp_loss', 'dense_loss']: + if key in losses and losses[key] is not None: + losses[key] = losses[key].mean() + losses['tot_loss'] += self.config[f'{key}_coeff'] * losses[key] + + output = { + 'losses': losses, + 'nsp_scores': nsp_scores_output + } + + return output diff --git a/models/vilbert_dialog.py b/models/vilbert_dialog.py new file mode 100644 index 0000000..36b3837 --- /dev/null +++ b/models/vilbert_dialog.py @@ -0,0 +1,2021 @@ +# coding=utf-8 +# Copyright 2018 The Google AI Language Team Authors and The HuggingFace Inc. team. +# Copyright (c) 2018, 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. +"""PyTorch BERT model.""" + +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 +import torch.nn.functional as F +from torch.nn.utils.weight_norm import weight_norm +from pytorch_transformers.modeling_bert import BertEmbeddings +from utils.data_utils import sequence_mask, to_data_list +import torch_geometric.nn as pyg_nn +from torch_geometric.data import Data +from torch_geometric.loader import DataLoader +from pytorch_pretrained_bert.file_utils import cached_path +import pdb + +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", +} + +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.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 + +class GeLU(nn.Module): + """Implementation of the gelu activation function. + For information: OpenAI GPT's gelu is slightly different (and gives slightly different results): + 0.5 * x * (1 + torch.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * torch.pow(x, 3)))) + Also see https://arxiv.org/abs/1606.08415 + """ + + def __init__(self): + super(GeLU, self).__init__() + + def forward(self, x): + return x * 0.5 * (1.0 + torch.erf(x / math.sqrt(2.0))) + + +def gelu(x): + """Implementation of the gelu activation function. + For information: OpenAI GPT's gelu is slightly different (and gives slightly different results): + 0.5 * x * (1 + torch.tanh(math.sqrt(2 / math.pi) * (x + 0.044715 * torch.pow(x, 3)))) + Also see https://arxiv.org/abs/1606.08415 + """ + return x * 0.5 * (1.0 + torch.erf(x / math.sqrt(2.0))) + + +def swish(x): + return x * torch.sigmoid(x) + + +ACT2FN = {"GeLU": GeLU(), "gelu": gelu, + "relu": torch.nn.functional.relu, "swish": swish} + +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, + v_feature_size=2048, + v_target_size=1601, + v_hidden_size=768, + v_num_hidden_layers=3, + v_num_attention_heads=12, + v_intermediate_size=3072, + bi_hidden_size=1024, + bi_num_attention_heads=16, + v_attention_probs_dropout_prob=0.1, + v_hidden_act="gelu", + v_hidden_dropout_prob=0.1, + v_initializer_range=0.2, + v_biattention_id=[0, 1], + t_biattention_id=[10, 11], + predict_feature=False, + fast_mode=False, + fixed_v_layer=0, + fixed_t_layer=0, + in_batch_pairs=False, + fusion_method="mul", + intra_gate=False, + with_coattention=True + ): + + """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. + """ + assert len(v_biattention_id) == len(t_biattention_id) + assert max(v_biattention_id) < v_num_hidden_layers + assert max(t_biattention_id) < num_hidden_layers + + 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.v_feature_size = v_feature_size + self.v_hidden_size = v_hidden_size + self.v_num_hidden_layers = v_num_hidden_layers + self.v_num_attention_heads = v_num_attention_heads + self.v_intermediate_size = v_intermediate_size + self.v_attention_probs_dropout_prob = v_attention_probs_dropout_prob + self.v_hidden_act = v_hidden_act + self.v_hidden_dropout_prob = v_hidden_dropout_prob + self.v_initializer_range = v_initializer_range + self.v_biattention_id = v_biattention_id + self.t_biattention_id = t_biattention_id + self.v_target_size = v_target_size + self.bi_hidden_size = bi_hidden_size + self.bi_num_attention_heads = bi_num_attention_heads + self.predict_feature = predict_feature + self.fast_mode = fast_mode + self.fixed_v_layer = fixed_v_layer + self.fixed_t_layer = fixed_t_layer + + self.in_batch_pairs = in_batch_pairs + self.fusion_method = fusion_method + self.intra_gate = intra_gate + self.with_coattention=with_coattention + 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" + +try: + # from apex.normalization.fused_layer_norm import FusedLayerNorm as BertLayerNorm + import torch.nn.LayerNorm as BertLayerNorm +except ImportError: + # logger.info( + # "Better speed can be achieved with apex installed from https://www.github.com/nvidia/apex ." + # ) + pass + + class BertLayerNorm(nn.Module): + def __init__(self, hidden_size, eps=1e-12): + """Construct a layernorm module in the TF style (epsilon inside the square root). + """ + super(BertLayerNorm, 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).pow(2).mean(-1, keepdim=True) + x = (x - u) / torch.sqrt(s + self.variance_epsilon) + return self.weight * x + self.bias + +class BertEmbeddingsDialog(nn.Module): + def __init__(self, config, device): + super(BertEmbeddingsDialog, 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) + max_seq_len = 256 + d_model = config.hidden_size + pe = torch.zeros(max_seq_len, d_model) + for pos in range(max_seq_len): + for i in range(0, d_model, 2): + pe[pos, i] = \ + math.sin(pos / (10000 ** ((2 * i)/d_model))) + pe[pos, i + 1] = \ + math.cos(pos / (10000 ** ((2 * (i + 1))/d_model))) + self.pe = pe.to(device) + self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size) + # add support for additional segment embeddings. Supporting 10 additional embedding as of now + self.token_type_embeddings_extension = nn.Embedding(10,config.hidden_size) + # adding specialized embeddings for sep tokens + self.sep_embeddings = nn.Embedding(50,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) + self.config = config + + def forward(self, input_ids, sep_indices=None, sep_len=None, token_type_ids=None): + 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) + if token_type_ids is None: + token_type_ids = torch.zeros_like(input_ids) + + words_embeddings = self.word_embeddings(input_ids) + position_embeddings = self.position_embeddings(position_ids) + + token_type_ids_extension = token_type_ids - self.config.type_vocab_size + token_type_ids_extension_mask = (token_type_ids_extension >= 0).float() + token_type_ids_extension = (token_type_ids_extension.float() * token_type_ids_extension_mask).long() + + token_type_ids_mask = (token_type_ids < self.config.type_vocab_size).float() + assert torch.sum(token_type_ids_extension_mask + token_type_ids_mask) == \ + torch.numel(token_type_ids) == torch.numel(token_type_ids_mask) + token_type_ids = (token_type_ids.float() * token_type_ids_mask).long() + + token_type_embeddings = self.token_type_embeddings(token_type_ids) + token_type_embeddings_extension = self.token_type_embeddings_extension(token_type_ids_extension) + + token_type_embeddings = (token_type_embeddings * token_type_ids_mask.unsqueeze(-1)) + \ + (token_type_embeddings_extension * token_type_ids_extension_mask.unsqueeze(-1)) + + 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 = x.view(*new_x_shape) + return x.permute(0, 2, 1, 3) + + 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_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.transpose(-1, -2)) + 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 = nn.Softmax(dim=-1)(attention_scores) + + # 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 = context_layer.view(*new_context_layer_shape) + + return context_layer, attention_probs + +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, attention_probs = self.self(input_tensor, attention_mask) + attention_output = self.output(self_output, input_tensor) + return attention_output, attention_probs + + +class BertIntermediate(nn.Module): + def __init__(self, config): + super(BertIntermediate, self).__init__() + self.dense = nn.Linear(config.hidden_size, config.intermediate_size) + if isinstance(config.hidden_act, str) or ( + sys.version_info[0] == 2 and isinstance(config.hidden_act, unicode) + ): + self.intermediate_act_fn = ACT2FN[config.hidden_act] + else: + self.intermediate_act_fn = config.hidden_act + + def forward(self, hidden_states): + hidden_states = self.dense(hidden_states) + hidden_states = self.intermediate_act_fn(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, attention_probs = self.attention(hidden_states, attention_mask) + intermediate_output = self.intermediate(attention_output) + layer_output = self.output(intermediate_output, attention_output) + return layer_output, attention_probs + + +class TextGraphLayer(nn.Module): + def __init__(self, config): + super(TextGraphLayer, self).__init__() + self.config = config + self.gnn_act = ACT2FN[config.gnn_act] + + self.num_q_gnn_layers = config.num_q_gnn_layers + self.num_h_gnn_layers = config.num_h_gnn_layers + + self.q_gnn_layers = [] + self.q_gnn_norm_layers = [] + + for _ in range(self.num_q_gnn_layers): + # Graph layers + self.q_gnn_layers.append( + pyg_nn.GATv2Conv( + config.hidden_size, config.hidden_size//config.num_gnn_attention_heads, + config.num_gnn_attention_heads, + dropout=config.gnn_dropout_prob, + edge_dim=config.q_gnn_edge_dim, + concat=True + ) + ) + # After each graph layer, a normalization layer is added + self.q_gnn_norm_layers.append(pyg_nn.PairNorm()) + + self.q_gnn_layers = nn.ModuleList(self.q_gnn_layers) + self.q_gnn_norm_layers = nn.ModuleList(self.q_gnn_norm_layers) + + self.h_gnn_layers = [] + self.h_gnn_norm_layers = [] + + for _ in range(self.num_h_gnn_layers): + self.h_gnn_layers.append( + pyg_nn.GATv2Conv( + config.hidden_size, config.hidden_size//config.num_gnn_attention_heads, + config.num_gnn_attention_heads, + dropout=config.gnn_dropout_prob, + concat=True + ) + ) + # After each graph layer, a normalization layer is added + self.h_gnn_norm_layers.append(pyg_nn.PairNorm()) + + self.h_gnn_layers = nn.ModuleList(self.h_gnn_layers) + self.h_gnn_norm_layers = nn.ModuleList(self.h_gnn_norm_layers) + + self.h_gnn_dense_hub = nn.Linear(config.v_hidden_size, config.hidden_size) + self.h_gnn_layer_norm_hub = BertLayerNorm(config.hidden_size, eps=1e-12) + self.h_gnn_dropout_hub = nn.Dropout(config.gnn_dropout_prob) + + q_dense_pooling = nn.Sequential( + nn.Linear(config.hidden_size, 1), + ACT2FN['GeLU'], + nn.Dropout(config.gnn_dropout_prob) + ) + self.q_gnn_pooling = pyg_nn.GlobalAttention(q_dense_pooling) + h_dense_pooling = nn.Sequential( + nn.Linear(config.hidden_size, 1), + ACT2FN['GeLU'], + nn.Dropout(config.gnn_dropout_prob) + ) + self.h_gnn_pooling = pyg_nn.GlobalAttention(h_dense_pooling) + + + def forward( + self, hidden_states, q_edge_indices, q_edge_attributes, + q_limits, h_edge_indices, h_sep_indices, v_hub, + len_q_gr=None, len_h_gr=None, len_h_sep=None): + device = hidden_states.device + batch_size, _, hidden_size = hidden_states.size() + if isinstance(q_edge_indices, list): + assert len(q_edge_indices) == len(q_edge_attributes) == q_limits.size(0) \ + == len(h_edge_indices) == len(h_sep_indices) == batch_size + else: + assert q_edge_indices.size(0) == q_edge_attributes.size(0) == q_limits.size(0) \ + == h_edge_indices.size(0) == h_sep_indices.size(0) == batch_size + if len_q_gr is not None: + q_edge_indices = [t.squeeze(0)[:, :l].long() for t, l in zip(torch.split(q_edge_indices, 1, dim=0), len_q_gr)] + q_edge_attributes = [t.squeeze(0)[:l, :] for t, l in zip(torch.split(q_edge_attributes, 1, dim=0), len_q_gr)] + h_edge_indices = [t.squeeze(0)[:, :l].long() for t, l in zip(torch.split(h_edge_indices, 1, dim=0), len_h_gr)] + h_sep_indices = [t.squeeze(0)[:l].long() for t, l in zip(torch.split(h_sep_indices, 1, dim=0), len_h_sep)] + else: + q_edge_indices = [t.squeeze(0) for t in torch.split(q_edge_indices, 1, dim=0)] + q_edge_attributes = [t.squeeze(0) for t in torch.split(q_edge_attributes, 1, dim=0)] + h_edge_indices = [t.squeeze(0) for t in torch.split(h_edge_indices, 1, dim=0)] + h_sep_indices = [t.squeeze(0).long() for t in torch.split(h_sep_indices, 1, dim=0)] + + gnn_hidden_states = hidden_states.clone().detach() + # Extract the history and question node features (without the hub node) + h_node_feats = [] + q_node_feats = [] + q_limits = q_limits.tolist() + q_tok_indices_extended = [] + h_sep_indices_extended = [] + for i, (h_sep_idx, q_limit) in enumerate(zip(h_sep_indices, q_limits)): + batch_data = gnn_hidden_states[i, :, :].clone().detach() + h_sep_idx = h_sep_idx.unsqueeze(-1).repeat(1, hidden_size) + h_sep_indices_extended.append(h_sep_idx) + h_node_feats.append(torch.gather(batch_data, 0, h_sep_idx)) + q_tok_idx = torch.arange(q_limit[0], q_limit[1]).unsqueeze(-1).repeat(1, hidden_size).to(device) + q_tok_indices_extended.append(q_tok_idx) + q_node_feats.append(torch.gather(batch_data, 0, q_tok_idx)) + + # if self.use_hub_nodes: + # Map v_hub to the correct vector space + v_hub = self.h_gnn_dense_hub(v_hub) + v_hub = self.h_gnn_layer_norm_hub(v_hub) + v_hub = self.h_gnn_dropout_hub(v_hub) + # Add the hub node to the history nodes + v_hub = torch.split(v_hub, 1, dim=0) + h_node_feats = [torch.cat((h, x), dim=0) for h, x in zip(h_node_feats, v_hub)] + + # Create the history graph data and pass them through the GNNs + pg_hist_data = [Data(x=x, edge_index=idx) for x, idx in zip(h_node_feats, h_edge_indices)] + pg_hist_loader = DataLoader(pg_hist_data, batch_size=batch_size, shuffle=False) + for data in pg_hist_loader: + x_h, edge_index_h, h_gnn_batch_idx = data.x, data.edge_index, data.batch + for i in range(self.num_h_gnn_layers): + # Normalization + x_h = self.h_gnn_norm_layers[i](x_h, h_gnn_batch_idx) + # Graph propagation + x_h = self.h_gnn_layers[i](x_h, edge_index_h, edge_attr=None) + # Activation + x_h = self.gnn_act(x_h) + x_h + x_h = self.gnn_act(x_h) + + + h_hub = self.h_gnn_pooling(x_h, h_gnn_batch_idx) + + # Add the hub nodes + h_hub_split = torch.split(h_hub, 1, dim=0) + q_node_feats = [torch.cat((q, x), dim=0) for q, x in zip(q_node_feats, h_hub_split)] + + + # Create the question graph data and pass them through the GNNs + pg_ques_data = [Data(x=x, edge_index=idx, edge_attr=attr) for x, idx, attr in zip(q_node_feats, q_edge_indices, q_edge_attributes)] + pg_ques_loader = DataLoader(pg_ques_data, batch_size=batch_size, shuffle=False) + for data in pg_ques_loader: + x_q, edge_index_q, edge_attr_q, q_gnn_batch_idx = data.x, data.edge_index, data.edge_attr, data.batch + for i in range(self.num_q_gnn_layers): + # Normalization + x_q = self.q_gnn_norm_layers[i](x_q, q_gnn_batch_idx) + # GNN propagation + x_q = self.q_gnn_layers[i](x_q, edge_index_q, edge_attr=edge_attr_q) + # Activation + x_q = self.gnn_act(x_q) + x_q + x_q = self.gnn_act(x_q) + + + q_hub = self.q_gnn_pooling(x_q, q_gnn_batch_idx) + # Reshape the node features + h_node_feats = to_data_list(x_h, h_gnn_batch_idx) + q_node_feats = to_data_list(x_q, q_gnn_batch_idx) + + # Update the text tokens with the graph feats + zipped_data = zip(h_node_feats, h_sep_indices_extended, q_node_feats, q_tok_indices_extended) + for i, (h_node_feat, h_sep_idx, q_node_feat, q_tok_idx) in enumerate(zipped_data): + gnn_hidden_states[i].scatter(0, h_sep_idx, h_node_feat[:-1]) + gnn_hidden_states[i].scatter(0, q_tok_idx, q_node_feat[:-1]) + + final_hidden_states = 0.5 * (hidden_states + gnn_hidden_states) + return final_hidden_states, h_hub, q_hub + + +class BertImageSelfAttention(nn.Module): + def __init__(self, config): + super(BertImageSelfAttention, self).__init__() + if config.v_hidden_size % config.v_num_attention_heads != 0: + raise ValueError( + "The hidden size (%d) is not a multiple of the number of attention " + "heads (%d)" % (config.v_hidden_size, config.v_num_attention_heads) + ) + self.num_attention_heads = config.v_num_attention_heads + self.attention_head_size = int( + config.v_hidden_size / config.v_num_attention_heads + ) + self.all_head_size = self.num_attention_heads * self.attention_head_size + + self.query = nn.Linear(config.v_hidden_size, self.all_head_size) + self.key = nn.Linear(config.v_hidden_size, self.all_head_size) + self.value = nn.Linear(config.v_hidden_size, self.all_head_size) + + self.dropout = nn.Dropout(config.v_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 = x.view(*new_x_shape) + return x.permute(0, 2, 1, 3) + + 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_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.transpose(-1, -2)) + 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 = nn.Softmax(dim=-1)(attention_scores) + + # 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 = context_layer.view(*new_context_layer_shape) + + return context_layer, attention_probs + +class BertImageSelfOutput(nn.Module): + def __init__(self, config): + super(BertImageSelfOutput, self).__init__() + self.dense = nn.Linear(config.v_hidden_size, config.v_hidden_size) + self.LayerNorm = BertLayerNorm(config.v_hidden_size, eps=1e-12) + self.dropout = nn.Dropout(config.v_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 BertImageAttention(nn.Module): + def __init__(self, config): + super(BertImageAttention, self).__init__() + self.self = BertImageSelfAttention(config) + self.output = BertImageSelfOutput(config) + + def forward(self, input_tensor, attention_mask): + self_output, attention_probs = self.self(input_tensor, attention_mask) + attention_output = self.output(self_output, input_tensor) + return attention_output, attention_probs + + +class BertImageIntermediate(nn.Module): + def __init__(self, config): + super(BertImageIntermediate, self).__init__() + self.dense = nn.Linear(config.v_hidden_size, config.v_intermediate_size) + if isinstance(config.v_hidden_act, str) or ( + sys.version_info[0] == 2 and isinstance(config.v_hidden_act, unicode) + ): + self.intermediate_act_fn = ACT2FN[config.v_hidden_act] + else: + self.intermediate_act_fn = config.v_hidden_act + + def forward(self, hidden_states): + hidden_states = self.dense(hidden_states) + hidden_states = self.intermediate_act_fn(hidden_states) + return hidden_states + + +class BertImageOutput(nn.Module): + def __init__(self, config): + super(BertImageOutput, self).__init__() + self.dense = nn.Linear(config.v_intermediate_size, config.v_hidden_size) + self.LayerNorm = BertLayerNorm(config.v_hidden_size, eps=1e-12) + self.dropout = nn.Dropout(config.v_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 BertImageLayer(nn.Module): + def __init__(self, config): + super(BertImageLayer, self).__init__() + self.attention = BertImageAttention(config) + self.intermediate = BertImageIntermediate(config) + self.output = BertImageOutput(config) + + def forward(self, hidden_states, attention_mask): + attention_output, attention_probs = self.attention(hidden_states, attention_mask) + intermediate_output = self.intermediate(attention_output) + layer_output = self.output(intermediate_output, attention_output) + return layer_output, attention_probs + +class ImageGraphLayer(nn.Module): + def __init__(self, config): + super(ImageGraphLayer, self).__init__() + self.config = config + self.gnn_act = ACT2FN[config.gnn_act] + + self.num_gnn_layers = config.num_v_gnn_layers + self.gnn_layers = [] + self.gnn_norm_layers = [] + + for _ in range(self.num_gnn_layers): + self.gnn_layers.append( + pyg_nn.GATv2Conv( + config.v_hidden_size, config.v_hidden_size//config.num_gnn_attention_heads, + config.num_gnn_attention_heads, + dropout=config.gnn_dropout_prob, + edge_dim=config.v_gnn_edge_dim, + concat=True + ) + ) + # After each graph layer, a normalization layer is added + self.gnn_norm_layers.append(pyg_nn.PairNorm()) + + self.gnn_layers = nn.ModuleList(self.gnn_layers) + self.gnn_norm_layers = nn.ModuleList(self.gnn_norm_layers) + + self.gnn_dense_hub = nn.Linear(config.hidden_size, config.v_hidden_size) + self.gnn_layer_norm_hub = BertLayerNorm(config.v_hidden_size, eps=1e-12) + self.gnn_dropout_hub = nn.Dropout(config.gnn_dropout_prob) + + dense_pooling = nn.Sequential( + nn.Linear(config.v_hidden_size, 1), + ACT2FN['GeLU'], + nn.Dropout(config.gnn_dropout_prob) + ) + self.gnn_pooling = pyg_nn.GlobalAttention(dense_pooling) + + def forward( + self, hidden_states, edge_indices, edge_attributes, hub_states, + len_img_gr=None): + # assert hub_states is not None + gnn_hidden_states = hidden_states.clone().detach() + batch_size, num_img_reg, v_hidden_size = hidden_states.size() + node_feats = hidden_states.clone().detach() + # Remave the [IMG] feats + node_feats = node_feats[:, 1:] + node_feats = torch.split(node_feats, 1, dim=0) + + if len_img_gr is not None: + edge_indices = [t.squeeze(0)[:, :l].long() for t, l in zip(torch.split(edge_indices, 1, dim=0), len_img_gr)] + edge_attributes = [t.squeeze(0)[:l, :] for t, l in zip(torch.split(edge_attributes, 1, dim=0), len_img_gr)] + + # Concat the hub states + hub_states = self.gnn_dense_hub(hub_states) + hub_states = self.gnn_dropout_hub(hub_states) + hub_states = self.gnn_layer_norm_hub(hub_states) + + hub_states = torch.split(hub_states, 1, dim=0) + node_feats = [torch.cat((x.squeeze(0), h), dim=0) + for x, h in zip(node_feats, hub_states)] + + pg_data = [Data(x, idx, attr) for x, idx, attr in zip( + node_feats, edge_indices, edge_attributes)] + pg_dataloader = DataLoader( + pg_data, batch_size=batch_size, shuffle=False) + # Gnn forward pass + for data in pg_dataloader: + x, edge_index, edge_attr, gnn_batch_idx = data.x, data.edge_index, data.edge_attr, data.batch + for i in range(self.num_gnn_layers): + # Normalization + x = self.gnn_norm_layers[i](x, gnn_batch_idx) + # GNN propagation + x = self.gnn_layers[i](x, edge_index, edge_attr=edge_attr) + # Activation + x = self.gnn_act(x) + x + x = self.gnn_act(x) + + # Reshape the output of the GNN to batch_size x num_img_reg x hidden_dim + v_hub = self.gnn_pooling(x, gnn_batch_idx) + + x = x.view(batch_size, num_img_reg, v_hidden_size) + gnn_hidden_states[:, 1:, :] = x[:, :-1, :] + + final_hidden_states = 0.5 * (hidden_states + gnn_hidden_states) + + return final_hidden_states, v_hub + + +class BertBiAttention(nn.Module): + def __init__(self, config): + super(BertBiAttention, self).__init__() + if config.bi_hidden_size % config.bi_num_attention_heads != 0: + raise ValueError( + "The hidden size (%d) is not a multiple of the number of attention " + "heads (%d)" % (config.bi_hidden_size, config.bi_num_attention_heads) + ) + + self.num_attention_heads = config.bi_num_attention_heads + self.attention_head_size = int( + config.bi_hidden_size / config.bi_num_attention_heads + ) + self.all_head_size = self.num_attention_heads * self.attention_head_size + + # self.scale = nn.Linear(1, self.num_attention_heads, bias=False) + # self.scale_act_fn = ACT2FN['relu'] + + self.query1 = nn.Linear(config.v_hidden_size, self.all_head_size) + self.key1 = nn.Linear(config.v_hidden_size, self.all_head_size) + self.value1 = nn.Linear(config.v_hidden_size, self.all_head_size) + # self.logit1 = nn.Linear(config.hidden_size, self.num_attention_heads) + + self.dropout1 = nn.Dropout(config.v_attention_probs_dropout_prob) + + self.query2 = nn.Linear(config.hidden_size, self.all_head_size) + self.key2 = nn.Linear(config.hidden_size, self.all_head_size) + self.value2 = nn.Linear(config.hidden_size, self.all_head_size) + # self.logit2 = nn.Linear(config.hidden_size, self.num_attention_heads) + + self.dropout2 = 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 = x.view(*new_x_shape) + return x.permute(0, 2, 1, 3) + + def forward(self, input_tensor1, attention_mask1, input_tensor2, attention_mask2, co_attention_mask=None, use_co_attention_mask=False): + + # for vision input. + mixed_query_layer1 = self.query1(input_tensor1) + mixed_key_layer1 = self.key1(input_tensor1) + mixed_value_layer1 = self.value1(input_tensor1) + # mixed_logit_layer1 = self.logit1(input_tensor1) + + query_layer1 = self.transpose_for_scores(mixed_query_layer1) + key_layer1 = self.transpose_for_scores(mixed_key_layer1) + value_layer1 = self.transpose_for_scores(mixed_value_layer1) + # logit_layer1 = self.transpose_for_logits(mixed_logit_layer1) + + # for text input: + mixed_query_layer2 = self.query2(input_tensor2) + mixed_key_layer2 = self.key2(input_tensor2) + mixed_value_layer2 = self.value2(input_tensor2) + # mixed_logit_layer2 = self.logit2(input_tensor2) + + query_layer2 = self.transpose_for_scores(mixed_query_layer2) + key_layer2 = self.transpose_for_scores(mixed_key_layer2) + value_layer2 = self.transpose_for_scores(mixed_value_layer2) + # logit_layer2 = self.transpose_for_logits(mixed_logit_layer2) + + # Take the dot product between "query2" and "key1" to get the raw attention scores for value 1. + attention_scores1 = torch.matmul(query_layer2, key_layer1.transpose(-1, -2)) + attention_scores1 = attention_scores1 / math.sqrt(self.attention_head_size) + attention_scores1 = attention_scores1 + attention_mask1 + + if use_co_attention_mask: + attention_scores1 = attention_scores1 + co_attention_mask.permute(0,1,3,2) + + # Normalize the attention scores to probabilities. + attention_probs1 = nn.Softmax(dim=-1)(attention_scores1) + + # 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_probs1 = self.dropout1(attention_probs1) + + context_layer1 = torch.matmul(attention_probs1, value_layer1) + context_layer1 = context_layer1.permute(0, 2, 1, 3).contiguous() + new_context_layer_shape1 = context_layer1.size()[:-2] + (self.all_head_size,) + context_layer1 = context_layer1.view(*new_context_layer_shape1) + + # Take the dot product between "query1" and "key2" to get the raw attention scores for value 2. + attention_scores2 = torch.matmul(query_layer1, key_layer2.transpose(-1, -2)) + attention_scores2 = attention_scores2 / math.sqrt(self.attention_head_size) + # Apply the attention mask is (precomputed for all layers in BertModel forward() function) + + # we can comment this line for single flow. + attention_scores2 = attention_scores2 + attention_mask2 + if use_co_attention_mask: + attention_scores2 = attention_scores2 + co_attention_mask + + # Normalize the attention scores to probabilities. + attention_probs2 = nn.Softmax(dim=-1)(attention_scores2) + + # 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_probs2 = self.dropout2(attention_probs2) + + context_layer2 = torch.matmul(attention_probs2, value_layer2) + context_layer2 = context_layer2.permute(0, 2, 1, 3).contiguous() + new_context_layer_shape2 = context_layer2.size()[:-2] + (self.all_head_size,) + context_layer2 = context_layer2.view(*new_context_layer_shape2) + + return context_layer1, context_layer2, (attention_probs1, attention_probs2) + +class BertBiOutput(nn.Module): + def __init__(self, config): + super(BertBiOutput, self).__init__() + + self.dense1 = nn.Linear(config.bi_hidden_size, config.v_hidden_size) + self.LayerNorm1 = BertLayerNorm(config.v_hidden_size, eps=1e-12) + self.dropout1 = nn.Dropout(config.v_hidden_dropout_prob) + + self.q_dense1 = nn.Linear(config.bi_hidden_size, config.v_hidden_size) + self.q_dropout1 = nn.Dropout(config.v_hidden_dropout_prob) + + self.dense2 = nn.Linear(config.bi_hidden_size, config.hidden_size) + self.LayerNorm2 = BertLayerNorm(config.hidden_size, eps=1e-12) + self.dropout2 = nn.Dropout(config.hidden_dropout_prob) + + self.q_dense2 = nn.Linear(config.bi_hidden_size, config.hidden_size) + self.q_dropout2 = nn.Dropout(config.hidden_dropout_prob) + + def forward(self, hidden_states1, input_tensor1, hidden_states2, input_tensor2): + + + context_state1 = self.dense1(hidden_states1) + context_state1 = self.dropout1(context_state1) + + context_state2 = self.dense2(hidden_states2) + context_state2 = self.dropout2(context_state2) + + hidden_states1 = self.LayerNorm1(context_state1 + input_tensor1) + hidden_states2 = self.LayerNorm2(context_state2 + input_tensor2) + + return hidden_states1, hidden_states2 + +class BertConnectionLayer(nn.Module): + def __init__(self, config): + super(BertConnectionLayer, self).__init__() + self.biattention = BertBiAttention(config) + + self.biOutput = BertBiOutput(config) + + self.v_intermediate = BertImageIntermediate(config) + self.v_output = BertImageOutput(config) + + self.t_intermediate = BertIntermediate(config) + self.t_output = BertOutput(config) + + def forward(self, input_tensor1, attention_mask1, input_tensor2, attention_mask2, co_attention_mask=None, use_co_attention_mask=False): + + bi_output1, bi_output2, co_attention_probs = self.biattention( + input_tensor1, attention_mask1, input_tensor2, attention_mask2, co_attention_mask, use_co_attention_mask + ) + + attention_output1, attention_output2 = self.biOutput(bi_output2, input_tensor1, bi_output1, input_tensor2) + + intermediate_output1 = self.v_intermediate(attention_output1) + layer_output1 = self.v_output(intermediate_output1, attention_output1) + + intermediate_output2 = self.t_intermediate(attention_output2) + layer_output2 = self.t_output(intermediate_output2, attention_output2) + + return layer_output1, layer_output2, co_attention_probs + +class BertEncoder(nn.Module): + def __init__(self, config): + super(BertEncoder, self).__init__() + + # in the bert encoder, we need to extract three things here. + # text bert layer: BertLayer + # vision bert layer: BertImageLayer + # Bi-Attention: Given the output of two bertlayer, perform bi-directional + # attention and add on two layers. + + self.FAST_MODE = config.fast_mode + self.with_coattention = config.with_coattention + self.v_biattention_id = config.v_biattention_id + self.t_biattention_id = config.t_biattention_id + self.in_batch_pairs = config.in_batch_pairs + self.fixed_t_layer = config.fixed_t_layer + self.fixed_v_layer = config.fixed_v_layer + self.t_gnn_ids = config.t_gnn_ids + self.v_gnn_ids = config.v_gnn_ids + + v_layer = BertImageLayer(config) + connect_layer = BertConnectionLayer(config) + + self.layer = [] + for _ in range(config.num_hidden_layers): + self.layer.append(BertLayer(config)) + + self.layer = nn.ModuleList(self.layer) + + txt_graph_layer = TextGraphLayer(config) + self.t_gnns = nn.ModuleList([txt_graph_layer for _ in range(len(self.t_gnn_ids))]) + + + self.v_layer = nn.ModuleList( + [copy.deepcopy(v_layer) for _ in range(config.v_num_hidden_layers)] + ) + + img_graph_layer = ImageGraphLayer(config) + self.v_gnns = nn.ModuleList([img_graph_layer for _ in range(len(self.v_gnn_ids))]) + self.c_layer = nn.ModuleList( + [copy.deepcopy(connect_layer) + for _ in range(len(config.v_biattention_id))] + ) + + + def forward( + self, + txt_embedding, + image_embedding, + txt_attention_mask, + image_attention_mask, + image_edge_indices, + image_edge_attributes, + question_edge_indices, + question_edge_attributes, + question_limits, + history_edge_indices, + history_sep_indices, + co_attention_mask=None, + output_all_encoded_layers=True, + output_all_attention_masks=False, + len_img_gr=None, len_q_gr=None, len_h_gr=None, len_h_sep=None + ): + + v_start = 0 + t_start = 0 + count = 0 + all_encoder_layers_t = [] + all_encoder_layers_v = [] + + all_attention_mask_t = [] + all_attnetion_mask_v = [] + all_attention_mask_c = [] + + batch_size, num_words, t_hidden_size = txt_embedding.size() + _, num_regions, v_hidden_size = image_embedding.size() + + # self.pool_feats(txt_embedding) + use_co_attention_mask = False + + # Init the v_hub with the [IMG]-token embedding + v_hub = image_embedding[:, 0, :].clone().detach() + + + q_hub = None + for v_layer_id, t_layer_id in zip(self.v_biattention_id, self.t_biattention_id): + + v_end = v_layer_id + t_end = t_layer_id + + assert self.fixed_t_layer <= t_end + assert self.fixed_v_layer <= v_end + + for idx in range(v_start, self.fixed_v_layer): + with torch.no_grad(): + image_embedding, image_attention_probs = self.v_layer[idx]( + image_embedding, image_attention_mask) + v_start = self.fixed_v_layer + + if output_all_attention_masks: + all_attnetion_mask_v.append(image_attention_probs) + + for idx in range(v_start, v_end): + # Perfrom graph message passing and aggr. if applicable + if idx in self.v_gnn_ids: + assert q_hub is not None + v_gnn_layer_idx = self.v_gnn_ids.index(idx) + image_embedding, v_hub = self.v_gnns[v_gnn_layer_idx]( + image_embedding, + image_edge_indices, + image_edge_attributes, + q_hub, + len_img_gr=len_img_gr, + ) + + # Perform standard bert self-attention + image_embedding, image_attention_probs = self.v_layer[idx]( + image_embedding, image_attention_mask) + if output_all_attention_masks: + all_attnetion_mask_v.append(image_attention_probs) + + for idx in range(t_start, self.fixed_t_layer): + with torch.no_grad(): + txt_embedding, txt_attention_probs = self.layer[idx](txt_embedding, txt_attention_mask) + t_start = self.fixed_t_layer + if output_all_attention_masks: + all_attention_mask_t.append(txt_attention_probs) + + for idx in range(t_start, t_end): + # Perfrom graph message passing and aggr. if applicable + if idx in self.t_gnn_ids: + t_gnn_layer_idx = self.t_gnn_ids.index(idx) + txt_embedding, h_hub, q_hub = self.t_gnns[t_gnn_layer_idx]( + txt_embedding, + question_edge_indices, + question_edge_attributes, + question_limits, + history_edge_indices, + history_sep_indices, + v_hub, + len_q_gr=len_q_gr, + len_h_gr=len_h_gr, + len_h_sep=len_h_sep + ) + # Perform standard bert self-attention + txt_embedding, txt_attention_probs = self.layer[idx](txt_embedding, txt_attention_mask) + if output_all_attention_masks: + all_attention_mask_t.append(txt_attention_probs) + + if count == 0 and self.in_batch_pairs: + # new batch size is the batch_size ^2 + image_embedding = image_embedding.unsqueeze(0).expand(batch_size, batch_size, num_regions, v_hidden_size).contiguous( + ).view(batch_size*batch_size, num_regions, v_hidden_size) + image_attention_mask = image_attention_mask.unsqueeze(0).expand( + batch_size, batch_size, 1, 1, num_regions).contiguous().view(batch_size*batch_size, 1, 1, num_regions) + + txt_embedding = txt_embedding.unsqueeze(1).expand(batch_size, batch_size, num_words, t_hidden_size).contiguous( + ).view(batch_size*batch_size, num_words, t_hidden_size) + txt_attention_mask = txt_attention_mask.unsqueeze(1).expand( + batch_size, batch_size, 1, 1, num_words).contiguous().view(batch_size*batch_size, 1, 1, num_words) + co_attention_mask = co_attention_mask.unsqueeze(1).expand( + batch_size, batch_size, 1, num_regions, num_words).contiguous().view(batch_size*batch_size, 1, num_regions, num_words) + + if self.with_coattention: + # do the bi attention. + image_embedding, txt_embedding, co_attention_probs = self.c_layer[count]( + image_embedding, image_attention_mask, txt_embedding, txt_attention_mask, co_attention_mask, use_co_attention_mask) + + # use_co_attention_mask = False + if output_all_attention_masks: + all_attention_mask_c.append(co_attention_probs) + + v_start = v_end + t_start = t_end + count += 1 + + if output_all_encoded_layers: + all_encoder_layers_t.append(txt_embedding) + all_encoder_layers_v.append(image_embedding) + + for idx in range(v_start, len(self.v_layer)): + # Perfrom graph message passing and aggr. if applicable + if idx in self.v_gnn_ids: + v_gnn_layer_idx = self.v_gnn_ids.index(idx) + image_embedding, v_hub = self.v_gnns[v_gnn_layer_idx]( + image_embedding, + image_edge_indices, + image_edge_attributes, + q_hub, + len_img_gr=len_img_gr + ) + + # Perform standard bert self-attention + image_embedding, image_attention_probs = self.v_layer[idx]( + image_embedding, image_attention_mask) + + if output_all_attention_masks: + all_attnetion_mask_v.append(image_attention_probs) + + + for idx in range(t_start, len(self.layer)): + # Perfrom graph message passing and aggr. if applicable + if idx in self.t_gnn_ids: + t_gnn_layer_idx = self.t_gnn_ids.index(idx) + txt_embedding, h_hub, q_hub = self.t_gnns[t_gnn_layer_idx]( + txt_embedding, + question_edge_indices, + question_edge_attributes, + question_limits, + history_edge_indices, + history_sep_indices, + v_hub, + len_q_gr=len_q_gr, + len_h_gr=len_h_gr, + len_h_sep=len_h_sep + ) + + # Perform standard bert self-attention + txt_embedding, txt_attention_probs = self.layer[idx](txt_embedding, txt_attention_mask) + + if output_all_attention_masks: + all_attention_mask_t.append(txt_attention_probs) + + # add the end part to finish. + if not output_all_encoded_layers: + all_encoder_layers_t.append(txt_embedding) + all_encoder_layers_v.append(image_embedding) + + + return all_encoder_layers_t, all_encoder_layers_v, (all_attention_mask_t, all_attnetion_mask_v, all_attention_mask_c), (h_hub, q_hub, v_hub) + + +class BertTextPooler(nn.Module): + def __init__(self, config): + super(BertTextPooler, self).__init__() + self.dense = nn.Linear(config.hidden_size, config.bi_hidden_size) + self.activation = nn.ReLU() + + 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(first_token_tensor) + pooled_output = self.activation(pooled_output) + return pooled_output + +class BertImagePooler(nn.Module): + def __init__(self, config): + super(BertImagePooler, self).__init__() + self.dense = nn.Linear(config.v_hidden_size, config.bi_hidden_size) + self.activation = nn.ReLU() + + 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(first_token_tensor) + pooled_output = self.activation(pooled_output) + return pooled_output + +class BertPredictionHeadTransform(nn.Module): + def __init__(self, config): + super(BertPredictionHeadTransform, self).__init__() + self.dense = nn.Linear(config.hidden_size, config.hidden_size) + if isinstance(config.hidden_act, str) or ( + sys.version_info[0] == 2 and isinstance(config.hidden_act, unicode) + ): + self.transform_act_fn = ACT2FN[config.hidden_act] + else: + self.transform_act_fn = config.hidden_act + self.LayerNorm = BertLayerNorm(config.hidden_size, eps=1e-12) + + def forward(self, hidden_states): + hidden_states = self.dense(hidden_states) + hidden_states = self.transform_act_fn(hidden_states) + hidden_states = self.LayerNorm(hidden_states) + return hidden_states + +class BertImgPredictionHeadTransform(nn.Module): + def __init__(self, config): + super(BertImgPredictionHeadTransform, self).__init__() + self.dense = nn.Linear(config.v_hidden_size, config.v_hidden_size) + if isinstance(config.hidden_act, str) or ( + sys.version_info[0] == 2 and isinstance(config.hidden_act, unicode) + ): + self.transform_act_fn = ACT2FN[config.hidden_act] + else: + self.transform_act_fn = config.v_hidden_act + self.LayerNorm = BertLayerNorm(config.v_hidden_size, eps=1e-12) + + def forward(self, hidden_states): + hidden_states = self.dense(hidden_states) + hidden_states = self.transform_act_fn(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.bi_seq_relationship = nn.Linear(config.bi_hidden_size, 2) + self.imagePredictions = BertImagePredictionHead(config) + self.fusion_method = config.fusion_method + self.dropout = nn.Dropout(0.1) + + def forward( + self, sequence_output_t, sequence_output_v, pooled_output_t, pooled_output_v + ): + + if self.fusion_method == 'sum': + pooled_output = self.dropout(pooled_output_t + pooled_output_v) + elif self.fusion_method == 'mul': + pooled_output = self.dropout(pooled_output_t * pooled_output_v) + else: + assert False + + prediction_scores_t = self.predictions(sequence_output_t) + seq_relationship_score = self.bi_seq_relationship(pooled_output) + prediction_scores_v = self.imagePredictions(sequence_output_v) + + return prediction_scores_t, prediction_scores_v, seq_relationship_score + +class BertImagePredictionHead(nn.Module): + def __init__(self, config): + super(BertImagePredictionHead, self).__init__() + self.transform = BertImgPredictionHeadTransform(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(config.v_hidden_size, config.v_target_size) + + def forward(self, hidden_states): + hidden_states = self.transform(hidden_states) + hidden_states = self.decoder(hidden_states) + return hidden_states + +class BertPreTrainedModel(nn.Module): + """ An abstract class to handle weights initialization and + a simple interface for dowloading and loading pretrained models. + """ + + def __init__(self, config, device='cuda:0', default_gpu=True, *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_() + + @classmethod + def from_pretrained( + cls, + pretrained_model_name_or_path, + config, + device, + use_apex=False, + default_gpu=True, + 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 dictionnary (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) + """ + CONFIG_NAME = "bert_config.json" + WEIGHTS_NAME = "pytorch_model.bin" + TF_WEIGHTS_NAME = "model.ckpt" + + 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 default_gpu: + 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 + elif resolved_archive_file[-3:] == 'bin': + serialization_dir = '/'.join(resolved_archive_file.split('/')[:-1]) + WEIGHTS_NAME = resolved_archive_file.split('/')[-1] + else: + # Extract archive to temp dir + tempdir = tempfile.mkdtemp() + logger.info( + "extracting archive file {} to temp dir {}".format( + resolved_archive_file, tempdir + ) + ) + with tarfile.open(resolved_archive_file, "r:gz") as archive: + archive.extractall(tempdir) + serialization_dir = tempdir + # Load config + # config_file = os.path.join(serialization_dir, CONFIG_NAME) + # config = BertConfig.from_json_file(config_file) + if default_gpu: + # cancel output + # logger.info("Model config {}".format(config)) + pass + # Instantiate model. + model = cls(config, device, use_apex, *inputs, **kwargs) + if state_dict is None and not from_tf: + weights_path = os.path.join(serialization_dir, WEIGHTS_NAME) + map_location = {'cuda:0': device} + state_dict = torch.load( + weights_path, + map_location=map_location + ) + if 'state_dict' in dir(state_dict): + state_dict = state_dict.state_dict() + + 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 and default_gpu: + logger.info( + "Weights of {} not initialized from pretrained model: {}".format( + model.__class__.__name__, missing_keys + ) + ) + if len(unexpected_keys) > 0 and default_gpu: + logger.info( + "Weights from pretrained model not used in {}: {}".format( + model.__class__.__name__, unexpected_keys + ) + ) + if len(error_msgs) > 0 and default_gpu: + 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. + `output_all_encoded_layers`: boolean which controls the content of the `encoded_layers` output as described below. Default: `True`. + + Outputs: Tuple of (encoded_layers, pooled_output) + `encoded_layers`: controled 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, device, use_apex=False): + super(BertModel, self).__init__(config, device) + + # initilize word embedding + self.embeddings = BertEmbeddingsDialog(config, device) + + # initlize the vision embedding + self.v_embeddings = BertImageEmbeddings(config) + + self.encoder = BertEncoder(config) + self.t_pooler = BertTextPooler(config) + self.v_pooler = BertImagePooler(config) + + self.use_apex = use_apex + + self.apply(self.init_bert_weights) + + def forward( + self, + input_txt, + input_imgs, + image_loc, + image_edge_indices, + image_edge_attributes, + question_edge_indices, + question_edge_attributes, + question_limits, + history_edge_indices, + history_sep_indices, + sep_indices=None, + sep_len=None, + token_type_ids=None, + attention_mask=None, + image_attention_mask=None, + co_attention_mask=None, + output_all_encoded_layers=False, + output_all_attention_masks=False, + ): + if attention_mask is None: + attention_mask = torch.ones_like(input_txt) + if token_type_ids is None: + token_type_ids = torch.zeros_like(input_txt) + if image_attention_mask is None: + image_attention_mask = torch.ones( + input_imgs.size(0), input_imgs.size(1) + ).type_as(input_txt) + + # 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) + extended_image_attention_mask = image_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. + if self.use_apex: + dtype = dtype=next(self.parameters()).dtype + else: + dtype = torch.float32 + extended_attention_mask = extended_attention_mask.to(dtype) # fp16 compatibility + extended_attention_mask = (1.0 - extended_attention_mask) * -10000.0 + + extended_image_attention_mask = extended_image_attention_mask.to(dtype) # fp16 compatibility + extended_image_attention_mask = (1.0 - extended_image_attention_mask) * -10000.0 + + if co_attention_mask is None: + co_attention_mask = torch.zeros(input_txt.size(0), input_imgs.size(1), input_txt.size(1)).type_as(extended_image_attention_mask) + + extended_co_attention_mask = co_attention_mask.unsqueeze(1) + + # extended_co_attention_mask = co_attention_mask.unsqueeze(-1) + extended_co_attention_mask = extended_co_attention_mask * 5.0 + extended_co_attention_mask = extended_co_attention_mask.to(dtype) # fp16 compatibility + + embedding_output = self.embeddings(input_txt, token_type_ids=token_type_ids, sep_indices=sep_indices, sep_len=sep_len) + v_embedding_output = self.v_embeddings(input_imgs, image_loc) + + encoded_layers_t, encoded_layers_v, all_attention_mask, hub_feats = self.encoder( + embedding_output, + v_embedding_output, + extended_attention_mask, + extended_image_attention_mask, + image_edge_indices, + image_edge_attributes, + question_edge_indices, + question_edge_attributes, + question_limits, + history_edge_indices, + history_sep_indices, + co_attention_mask=extended_co_attention_mask, + output_all_encoded_layers=output_all_encoded_layers, + output_all_attention_masks=output_all_attention_masks, + ) + + sequence_output_t = encoded_layers_t[-1] + sequence_output_v = encoded_layers_v[-1] + + pooled_output_t = self.t_pooler(sequence_output_t) + pooled_output_v = self.v_pooler(sequence_output_v) + + if not output_all_encoded_layers: + encoded_layers_t = encoded_layers_t[-1] + encoded_layers_v = encoded_layers_v[-1] + + return encoded_layers_t, encoded_layers_v, pooled_output_t, pooled_output_v, all_attention_mask, hub_feats + +class BertImageEmbeddings(nn.Module): + """Construct the embeddings from image, spatial location (omit now) and token_type embeddings. + """ + def __init__(self, config): + super(BertImageEmbeddings, self).__init__() + + self.image_embeddings = nn.Linear(config.v_feature_size, config.v_hidden_size) + self.image_location_embeddings = nn.Linear(5, config.v_hidden_size) + self.LayerNorm = BertLayerNorm(config.v_hidden_size, eps=1e-12) + self.dropout = nn.Dropout(config.hidden_dropout_prob) + + def forward(self, input_ids, input_loc): + + img_embeddings = self.image_embeddings(input_ids) + loc_embeddings = self.image_location_embeddings(input_loc) + embeddings = self.LayerNorm(img_embeddings+loc_embeddings) + embeddings = self.dropout(embeddings) + + return embeddings + +class BertForMultiModalPreTraining(BertPreTrainedModel): + """BERT model with multi modal pre-training heads. + """ + + def __init__(self, config, device, use_apex=False): + super(BertForMultiModalPreTraining, self).__init__(config, device) + + self.bert = BertModel(config, device, use_apex) + self.cls = BertPreTrainingHeads( + config, self.bert.embeddings.word_embeddings.weight + ) + + self.apply(self.init_bert_weights) + self.predict_feature = config.predict_feature + self.loss_fct = CrossEntropyLoss(ignore_index=-1) + + print("model's option for predict_feature is ", config.predict_feature) + + if self.predict_feature: + self.vis_criterion = nn.MSELoss(reduction="none") + else: + self.vis_criterion = nn.KLDivLoss(reduction="none") + + def forward( + self, + input_ids, + image_feat, + image_loc, + image_edge_indices, + image_edge_attributes, + question_edge_indices, + question_edge_attributes, + question_limits, + history_edge_indices, + history_sep_indices, + sep_indices=None, + sep_len=None, + token_type_ids=None, + attention_mask=None, + image_attention_mask=None, + masked_lm_labels=None, + image_label=None, + image_target = None, + next_sentence_label=None, + output_all_attention_masks=False + ): + + # in this model, we first embed the images. + sequence_output_t, sequence_output_v, pooled_output_t, pooled_output_v, all_attention_mask, hub_nodes = self.bert( + input_ids, + image_feat, + image_loc, + image_edge_indices, + image_edge_attributes, + question_edge_indices, + question_edge_attributes, + question_limits, + history_edge_indices, + history_sep_indices, + sep_indices=sep_indices, + sep_len=sep_len, + token_type_ids=token_type_ids, + attention_mask=attention_mask, + image_attention_mask=image_attention_mask, + output_all_encoded_layers=False, + output_all_attention_masks=output_all_attention_masks + ) + + prediction_scores_t, prediction_scores_v, seq_relationship_score = self.cls( + sequence_output_t, sequence_output_v, pooled_output_t, pooled_output_v + ) + if masked_lm_labels is not None and next_sentence_label is not None and image_target is not None: + + # prediction_scores_v = prediction_scores_v[:, 1:] + if self.predict_feature: + img_loss = self.vis_criterion(prediction_scores_v, image_target) + masked_img_loss = torch.sum( + img_loss * (image_label == 1).unsqueeze(2).float() + ) / max(torch.sum((image_label == 1).unsqueeze(2).expand_as(img_loss)),1) + + else: + img_loss = self.vis_criterion( + F.log_softmax(prediction_scores_v, dim=2), image_target + ) + masked_img_loss = torch.sum( + img_loss * (image_label == 1).unsqueeze(2).float() + ) / max(torch.sum((image_label == 1)), 0) + + # masked_img_loss = torch.sum(img_loss) / (img_loss.shape[0] * img_loss.shape[1]) + masked_lm_loss = self.loss_fct( + prediction_scores_t.view(-1, self.config.vocab_size), + masked_lm_labels.view(-1), + ) + next_sentence_loss = self.loss_fct( + seq_relationship_score.view(-1, 2), next_sentence_label.view(-1) + ) + # total_loss = masked_lm_loss + next_sentence_loss + masked_img_loss + return masked_lm_loss.unsqueeze(0), masked_img_loss.unsqueeze(0), next_sentence_loss.unsqueeze(0), sequence_output_t, prediction_scores_t, seq_relationship_score, hub_nodes + else: + return prediction_scores_t, prediction_scores_v, seq_relationship_score, sequence_output_t, all_attention_mask, hub_nodes + + def get_text_embedding( + self, + input_ids, + image_feat, + image_loc, + sep_indices=None, + sep_len=None, + token_type_ids=None, + attention_mask=None, + image_attention_mask=None, + output_all_attention_masks=False + ): + + # in this model, we first embed the images. + sequence_output_t, sequence_output_v, pooled_output_t, pooled_output_v, all_attention_mask = self.bert( + input_ids, + image_feat, + image_loc, + sep_indices=sep_indices, + sep_len=sep_len, + token_type_ids=token_type_ids, + attention_mask=attention_mask, + image_attention_mask=image_attention_mask, + output_all_encoded_layers=False, + output_all_attention_masks=output_all_attention_masks + ) + + return sequence_output_t # [batch_size, num_words, 768] + + +class VILBertForVLTasks(BertPreTrainedModel): + def __init__(self, config, device, num_labels, use_apex=False, dropout_prob=0.1, default_gpu=True): + super(VILBertForVLTasks, self).__init__(config) + self.num_labels = num_labels + self.bert = BertModel(config, device, use_apex) + self.use_apex = use_apex + self.dropout = nn.Dropout(dropout_prob) + self.cls = BertPreTrainingHeads( + config, self.bert.embeddings.word_embeddings.weight + ) + self.vil_prediction = SimpleClassifier(config.bi_hidden_size, config.bi_hidden_size*2, num_labels, 0.5) + # self.vil_prediction = nn.Linear(config.bi_hidden_size, num_labels) + self.vil_logit = nn.Linear(config.bi_hidden_size, 1) + self.vision_logit = nn.Linear(config.v_hidden_size, 1) + self.linguisic_logit = nn.Linear(config.hidden_size, 1) + self.fusion_method = config.fusion_method + self.apply(self.init_bert_weights) + + def forward( + self, + input_txt, + input_imgs, + image_loc, + token_type_ids=None, + attention_mask=None, + image_attention_mask=None, + co_attention_mask=None, + output_all_encoded_layers=False, + ): + sequence_output_t, sequence_output_v, pooled_output_t, pooled_output_v, _ = self.bert( + input_txt, + input_imgs, + image_loc, + token_type_ids, + attention_mask, + image_attention_mask, + co_attention_mask, + output_all_encoded_layers=False, + ) + + vil_prediction = 0 + vil_logit = 0 + vil_binary_prediction = 0 + vision_prediction = 0 + vision_logit = 0 + linguisic_prediction = 0 + linguisic_logit = 0 + + linguisic_prediction, vision_prediction, vil_binary_prediction = self.cls( + sequence_output_t, sequence_output_v, pooled_output_t, pooled_output_v + ) + + if self.fusion_method == 'sum': + pooled_output = self.dropout(pooled_output_t + pooled_output_v) + elif self.fusion_method == 'mul': + pooled_output = self.dropout(pooled_output_t * pooled_output_v) + else: + assert False + + vil_prediction = self.vil_prediction(pooled_output) + vil_logit = self.vil_logit(pooled_output) + if self.use_apex: + dtype = next(self.parameters()).dtype + else: + dtype = torch.float32 + vision_logit = self.vision_logit(self.dropout(sequence_output_v)) + ((1.0 - image_attention_mask)* -10000.0).unsqueeze(2).to(dtype) + linguisic_logit = self.linguisic_logit(self.dropout(sequence_output_t)) + + return vil_prediction, vil_logit, vil_binary_prediction, vision_prediction, vision_logit, linguisic_prediction, linguisic_logit + +class SimpleClassifier(nn.Module): + def __init__(self, in_dim, hid_dim, out_dim, dropout): + super(SimpleClassifier, self).__init__() + layers = [ + weight_norm(nn.Linear(in_dim, hid_dim), dim=None), + nn.ReLU(), + nn.Dropout(dropout, inplace=True), + weight_norm(nn.Linear(hid_dim, out_dim), dim=None) + ] + self.main = nn.Sequential(*layers) + + def forward(self, x): + logits = self.main(x) diff --git a/setup_data.sh b/setup_data.sh new file mode 100644 index 0000000..b749fd0 --- /dev/null +++ b/setup_data.sh @@ -0,0 +1,18 @@ +cd data +# Exract the graphs +tar xvfz history_adj_matrices.tar.gz +tar xvfz question_adj_matrices.tar.gz +tar xvfz img_adj_matrices.tar.gz + +# Remove the .tar files +rm *.tar.gz + +# Download the preprocessed image features +mkdir visdial_img_feat.lmdb +wget https://s3.amazonaws.com/visdial-bert/data/visdial_image_feats.lmdb/data.mdb -O visdial_img_feat.lmdb/data.mdb +wget https://s3.amazonaws.com/visdial-bert/data/visdial_image_feats.lmdb/lock.mdb -O visdial_img_feat.lmdb/lock.mdb + +echo Data setup successfully... + +cd .. + diff --git a/utils/__init__.py b/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/utils/data_utils.py b/utils/data_utils.py new file mode 100644 index 0000000..ac8503e --- /dev/null +++ b/utils/data_utils.py @@ -0,0 +1,290 @@ +import torch +from torch.autograd import Variable +import random +import pickle +import numpy as np +from copy import deepcopy + + +def load_pickle_lines(filename): + data = [] + with open(filename, 'rb') as f: + while True: + try: + data.append(pickle.load(f)) + except EOFError: + break + return data + + +def flatten(l): + return [item for sublist in l for item in sublist] + + +def build_len_mask_batch( + # [batch_size], [] + len_batch, max_len=None +): + if max_len is None: + max_len = len_batch.max().item() + # try: + batch_size, = len_batch.shape + # [batch_size, max_len] + idxes_batch = torch.arange(max_len, device=len_batch.device).view(1, -1).repeat(batch_size, 1) + # [batch_size, max_len] = [batch_size, max_len] < [batch_size, 1] + return idxes_batch < len_batch.view(-1, 1) + + +def sequence_mask(sequence_length, max_len=None): + if max_len is None: + max_len = sequence_length.data.max() + batch_size = sequence_length.size(0) + seq_range = torch.arange(0, max_len).long() + seq_range_expand = seq_range.unsqueeze(0).expand(batch_size, max_len) + seq_range_expand = Variable(seq_range_expand) + if sequence_length.is_cuda: + seq_range_expand = seq_range_expand.to(sequence_length.device) + seq_length_expand = (sequence_length.unsqueeze(1) + .expand_as(seq_range_expand)) + return seq_range_expand < seq_length_expand + +def batch_iter(dataloader, params): + for epochId in range(params['num_epochs']): + for idx, batch in enumerate(dataloader): + yield epochId, idx, batch + +def list2tensorpad(inp_list, max_seq_len): + inp_tensor = torch.LongTensor([inp_list]) + inp_tensor_zeros = torch.zeros(1, max_seq_len, dtype=torch.long) + inp_tensor_zeros[0,:inp_tensor.shape[1]] = inp_tensor # after preprocess, inp_tensor.shape[1] must < max_seq_len + inp_tensor = inp_tensor_zeros + return inp_tensor + + +def encode_input(utterances, start_segment, CLS, SEP, MASK, max_seq_len=256,max_sep_len=25,mask_prob=0.2): + + cur_segment = start_segment + token_id_list = [] + segment_id_list = [] + sep_token_indices = [] + masked_token_list = [] + + token_id_list.append(CLS) + segment_id_list.append(cur_segment) + masked_token_list.append(0) + + cur_sep_token_index = 0 + + for cur_utterance in utterances: + # add the masked token and keep track + cur_masked_index = [1 if random.random() < mask_prob else 0 for _ in range(len(cur_utterance))] + masked_token_list.extend(cur_masked_index) + token_id_list.extend(cur_utterance) + segment_id_list.extend([cur_segment]*len(cur_utterance)) + + token_id_list.append(SEP) + segment_id_list.append(cur_segment) + masked_token_list.append(0) + cur_sep_token_index = cur_sep_token_index + len(cur_utterance) + 1 + sep_token_indices.append(cur_sep_token_index) + cur_segment = cur_segment ^ 1 # cur segment osciallates between 0 and 1 + start_question, end_question = sep_token_indices[-3] + 1, sep_token_indices[-2] + assert end_question - start_question == len(utterances[-2]) + + assert len(segment_id_list) == len(token_id_list) == len(masked_token_list) == sep_token_indices[-1] + 1 + # convert to tensors and pad to maximum seq length + tokens = list2tensorpad(token_id_list,max_seq_len) # [1, max_len] + masked_tokens = list2tensorpad(masked_token_list,max_seq_len) + masked_tokens[0,masked_tokens[0,:]==0] = -1 + mask = masked_tokens[0,:]==1 + masked_tokens[0,mask] = tokens[0,mask] + tokens[0,mask] = MASK + + segment_id_list = list2tensorpad(segment_id_list,max_seq_len) + return tokens, segment_id_list, list2tensorpad(sep_token_indices,max_sep_len), masked_tokens, start_question, end_question + +def encode_input_with_mask(utterances, start_segment, CLS, SEP, MASK, max_seq_len=256,max_sep_len=25,mask_prob=0.2, get_q_limits=True): + + cur_segment = start_segment + token_id_list = [] + segment_id_list = [] + sep_token_indices = [] + masked_token_list = [] + input_mask_list = [] + + token_id_list.append(CLS) + segment_id_list.append(cur_segment) + masked_token_list.append(0) + input_mask_list.append(1) + + cur_sep_token_index = 0 + + for cur_utterance in utterances: + # add the masked token and keep track + cur_masked_index = [1 if random.random() < mask_prob else 0 for _ in range(len(cur_utterance))] + masked_token_list.extend(cur_masked_index) + token_id_list.extend(cur_utterance) + segment_id_list.extend([cur_segment]*len(cur_utterance)) + input_mask_list.extend([1]*len(cur_utterance)) + + token_id_list.append(SEP) + segment_id_list.append(cur_segment) + masked_token_list.append(0) + input_mask_list.append(1) + cur_sep_token_index = cur_sep_token_index + len(cur_utterance) + 1 + sep_token_indices.append(cur_sep_token_index) + cur_segment = cur_segment ^ 1 # cur segment osciallates between 0 and 1 + + if get_q_limits: + start_question, end_question = sep_token_indices[-3] + 1, sep_token_indices[-2] + assert end_question - start_question == len(utterances[-2]) + else: + start_question, end_question = -1, -1 + assert len(segment_id_list) == len(token_id_list) == len(masked_token_list) ==len(input_mask_list) == sep_token_indices[-1] + 1 + # convert to tensors and pad to maximum seq length + tokens = list2tensorpad(token_id_list, max_seq_len) + masked_tokens = list2tensorpad(masked_token_list, max_seq_len) + input_mask = list2tensorpad(input_mask_list,max_seq_len) + masked_tokens[0,masked_tokens[0,:]==0] = -1 + mask = masked_tokens[0,:]==1 + masked_tokens[0,mask] = tokens[0,mask] + tokens[0,mask] = MASK + + segment_id_list = list2tensorpad(segment_id_list,max_seq_len) + return tokens, segment_id_list, list2tensorpad(sep_token_indices,max_sep_len),masked_tokens, input_mask, start_question, end_question + + +def encode_image_input(features, num_boxes, boxes, image_target, max_regions=37, mask_prob=0.15): + output_label = [] + num_boxes = min(int(num_boxes), max_regions) + + mix_boxes_pad = np.zeros((max_regions, boxes.shape[-1])) + mix_features_pad = np.zeros((max_regions, features.shape[-1])) + mix_image_target = np.zeros((max_regions, image_target.shape[-1])) + + mix_boxes_pad[:num_boxes] = boxes[:num_boxes] + mix_features_pad[:num_boxes] = features[:num_boxes] + mix_image_target[:num_boxes] = image_target[:num_boxes] + + boxes = mix_boxes_pad + features = mix_features_pad + image_target = mix_image_target + mask_indexes = [] + for i in range(num_boxes): + prob = random.random() + # mask token with 15% probability + if prob < mask_prob: + prob /= mask_prob + + # 80% randomly change token to mask token + if prob < 0.9: + features[i] = 0 + output_label.append(1) + mask_indexes.append(i) + else: + # no masking token (will be ignored by loss function later) + output_label.append(-1) + + image_mask = [1] * (int(num_boxes)) + while len(image_mask) < max_regions: + image_mask.append(0) + output_label.append(-1) + + # ensure we have atleast one region being predicted + output_label[random.randint(1,len(output_label)-1)] = 1 + image_label = torch.LongTensor(output_label) + image_label[0] = 0 # make sure the token doesn't contribute to the masked loss + image_mask = torch.tensor(image_mask).float() + + features = torch.tensor(features).float() + spatials = torch.tensor(boxes).float() + image_target = torch.tensor(image_target).float() + + return features, spatials, image_mask, image_target, image_label + + +def question_edge_masking(question_edge_indices, question_edge_attributes, mask, question_limits, mask_prob=0.4, max_len=10): + mask = mask.squeeze().tolist() + question_limits = question_limits.tolist() + question_start, question_end = question_limits + # Get the masking of the question + mask_question = mask[question_start:question_end] + masked_idx = np.argwhere(np.array(mask_question) > -1).squeeze().tolist() + if isinstance(masked_idx, (int)): # only one question token is masked + masked_idx = [masked_idx] + + # get rid of all edge indices and attributes that corresond to masked tokens + edge_attr_gt = [] + edge_idx_gt_gnn = [] + edge_idx_gt_bert = [] + for i, (question_edge_idx, question_edge_attr) in enumerate(zip(question_edge_indices, question_edge_attributes)): + if not(question_edge_idx[0] in masked_idx or question_edge_idx[1] in masked_idx): + # Masking + if random.random() < mask_prob: + edge_attr_gt.append(np.argwhere(question_edge_attr).item()) + edge_idx_gt_gnn.append(question_edge_idx) + edge_idx_gt_bert.append([question_edge_idx[0] + question_start, question_edge_idx[1] + question_start]) + question_edge_attr = np.zeros_like(question_edge_attr) + question_edge_attr[-1] = 1.0 # The [EDGE_MASK] special token is the last one hot vector encoding + question_edge_attributes[i] = question_edge_attr + else: + continue + # Force masking if the necessary: + if len(edge_attr_gt) == 0: + for i, (question_edge_idx, question_edge_attr) in enumerate(zip(question_edge_indices, question_edge_attributes)): + if not(question_edge_idx[0] in masked_idx or question_edge_idx[1] in masked_idx): + # Masking + edge_attr_gt.append(np.argwhere(question_edge_attr).item()) + edge_idx_gt_gnn.append(question_edge_idx) + edge_idx_gt_bert.append([question_edge_idx[0] + question_start, question_edge_idx[1] + question_start]) + question_edge_attr = np.zeros_like(question_edge_attr) + question_edge_attr[-1] = 1.0 # The [EDGE_MASK] special token is the last one hot vector encoding + question_edge_attributes[i] = question_edge_attr + break + + # For the rare case, where the conditions for masking were not met + if len(edge_attr_gt) == 0: + edge_attr_gt.append(-1) + edge_idx_gt_gnn.append([0, question_end - question_start]) + edge_idx_gt_bert.append(question_limits) + + # Pad to max_len + while len(edge_attr_gt) < max_len: + edge_attr_gt.append(-1) + edge_idx_gt_gnn.append(edge_idx_gt_gnn[-1]) + edge_idx_gt_bert.append(edge_idx_gt_bert[-1]) + + # Truncate if longer than max_len + if len(edge_attr_gt) > max_len: + edge_idx_gt_gnn = edge_idx_gt_gnn[:max_len] + edge_idx_gt_bert = edge_idx_gt_bert[:max_len] + edge_attr_gt = edge_attr_gt[:max_len] + edge_idx_gt_gnn = np.array(edge_idx_gt_gnn) + edge_idx_gt_bert = np.array(edge_idx_gt_bert) + + first_edge_node_gt_gnn = list(edge_idx_gt_gnn[:, 0]) + second_edge_node_gt_gnn = list(edge_idx_gt_gnn[:, 1]) + + first_edge_node_gt_bert = list(edge_idx_gt_bert[:, 0]) + second_edge_node_gt_bert = list(edge_idx_gt_bert[:, 1]) + + return question_edge_attributes, edge_attr_gt, first_edge_node_gt_gnn, second_edge_node_gt_gnn, first_edge_node_gt_bert, second_edge_node_gt_bert + + +def to_data_list(feats, batch_idx): + feat_list = [] + device = feats.device + left = 0 + right = 0 + batch_size = batch_idx.max().item() + 1 + for batch in range(batch_size): + if batch == batch_size - 1: + right = batch_idx.size(0) + else: + right = torch.argwhere(batch_idx == batch + 1)[0].item() + idx = torch.arange(left, right).unsqueeze(-1).repeat(1, feats.size(1)).to(device) + feat_list.append(torch.gather(feats, 0, idx)) + left = right + + return feat_list + diff --git a/utils/image_features_reader.py b/utils/image_features_reader.py new file mode 100644 index 0000000..894457d --- /dev/null +++ b/utils/image_features_reader.py @@ -0,0 +1,192 @@ +from typing import List +import csv +import h5py +import numpy as np +import copy +import pickle +import lmdb # install lmdb by "pip install lmdb" +import base64 +import pdb +import os + + +class ImageFeaturesH5Reader(object): + """ + A reader for H5 files containing pre-extracted image features. A typical + H5 file is expected to have a column named "image_id", and another column + named "features". + + Example of an H5 file: + ``` + faster_rcnn_bottomup_features.h5 + |--- "image_id" [shape: (num_images, )] + |--- "features" [shape: (num_images, num_proposals, feature_size)] + +--- .attrs ("split", "train") + ``` + Parameters + ---------- + features_h5path : str + Path to an H5 file containing COCO train / val image features. + in_memory : bool + Whether to load the whole H5 file in memory. Beware, these files are + sometimes tens of GBs in size. Set this to true if you have sufficient + RAM - trade-off between speed and memory. + """ + def __init__(self, features_path: str, scene_graph_path: str, in_memory: bool = False): + self.features_path = features_path + self.scene_graph_path = scene_graph_path + self._in_memory = in_memory + + self.env = lmdb.open(self.features_path, max_readers=1, readonly=True, + lock=False, readahead=False, meminit=False) + + with self.env.begin(write=False) as txn: + self._image_ids = pickle.loads(txn.get('keys'.encode())) + + self.features = [None] * len(self._image_ids) + self.num_boxes = [None] * len(self._image_ids) + self.boxes = [None] * len(self._image_ids) + self.boxes_ori = [None] * len(self._image_ids) + self.cls_prob = [None] * len(self._image_ids) + self.edge_indexes = [None] * len(self._image_ids) + self.edge_attributes = [None] * len(self._image_ids) + + def __len__(self): + return len(self._image_ids) + + def __getitem__(self, image_id): + + image_id = str(image_id).encode() + index = self._image_ids.index(image_id) + if self._in_memory: + # Load features during first epoch, all not loaded together as it + # has a slow start. + if self.features[index] is not None: + features = self.features[index] + num_boxes = self.num_boxes[index] + image_location = self.boxes[index] + image_location_ori = self.boxes_ori[index] + cls_prob = self.cls_prob[index] + edge_indexes = self.edge_indexes[index] + edge_attributes = self.edge_attributes[index] + else: + with self.env.begin(write=False) as txn: + item = pickle.loads(txn.get(image_id)) + image_id = item['image_id'] + image_h = int(item['image_h']) + image_w = int(item['image_w']) + num_boxes = int(item['num_boxes']) + features = np.frombuffer(base64.b64decode(item["features"]), dtype=np.float32).reshape(num_boxes, 2048) + boxes = np.frombuffer(base64.b64decode(item['boxes']), dtype=np.float32).reshape(num_boxes, 4) + + cls_prob = np.frombuffer(base64.b64decode(item['cls_prob']), dtype=np.float32).reshape(num_boxes, 1601) + # add an extra row at the top for the tokens + g_cls_prob = np.zeros(1601, dtype=np.float32) + g_cls_prob[0] = 1 + cls_prob = np.concatenate([np.expand_dims(g_cls_prob,axis=0), cls_prob], axis=0) + + self.cls_prob[index] = cls_prob + + g_feat = np.sum(features, axis=0) / num_boxes + num_boxes = num_boxes + 1 + + features = np.concatenate([np.expand_dims(g_feat, axis=0), features], axis=0) + self.features[index] = features + + image_location = np.zeros((boxes.shape[0], 5), dtype=np.float32) + image_location[:,:4] = boxes + image_location[:,4] = (image_location[:,3] - image_location[:,1]) * (image_location[:,2] - image_location[:,0]) / (float(image_w) * float(image_h)) + + image_location_ori = copy.deepcopy(image_location) + + image_location[:,0] = image_location[:,0] / float(image_w) + image_location[:,1] = image_location[:,1] / float(image_h) + image_location[:,2] = image_location[:,2] / float(image_w) + image_location[:,3] = image_location[:,3] / float(image_h) + + g_location = np.array([0,0,1,1,1]) + image_location = np.concatenate([np.expand_dims(g_location, axis=0), image_location], axis=0) + self.boxes[index] = image_location + + g_location_ori = np.array([0, 0, image_w, image_h, image_w*image_h]) + image_location_ori = np.concatenate([np.expand_dims(g_location_ori, axis=0), image_location_ori], axis=0) + self.boxes_ori[index] = image_location_ori + self.num_boxes[index] = num_boxes + + # load the scene graph data + pth = os.path.join(self.scene_graph_path, f'{image_id}.pkl') + with open(pth, 'rb') as f: + graph_data = pickle.load(f) + edge_indexes = [] + edge_attributes = [] + for e_idx, e_attr in graph_data: + edge_indexes.append(e_idx) + # get one-hot-encoding of the edges + e_attr_one_hot = np.zeros((12,), dtype=np.float32) # 12 = 11 rels + hub-node rel + e_attr_one_hot[e_attr] = 1.0 + edge_attributes.append(e_attr_one_hot) + edge_indexes = np.array(edge_indexes, dtype=np.float64).transpose(1, 0) + edge_attributes = np.stack(edge_attributes, axis=0) + + self.edge_indexes[index] = edge_indexes + self.edge_attributes[index] = edge_attributes + + else: + # Read chunk from file everytime if not loaded in memory. + with self.env.begin(write=False) as txn: + item = pickle.loads(txn.get(image_id)) + image_id = item['image_id'] + image_h = int(item['image_h']) + image_w = int(item['image_w']) + num_boxes = int(item['num_boxes']) + cls_prob = np.frombuffer(base64.b64decode(item['cls_prob']), dtype=np.float32).reshape(num_boxes, 1601) + # add an extra row at the top for the tokens + g_cls_prob = np.zeros(1601, dtype=np.float32) + g_cls_prob[0] = 1 + cls_prob = np.concatenate([np.expand_dims(g_cls_prob,axis=0), cls_prob], axis=0) + + features = np.frombuffer(base64.b64decode(item["features"]), dtype=np.float32).reshape(num_boxes, 2048) + boxes = np.frombuffer(base64.b64decode(item['boxes']), dtype=np.float32).reshape(num_boxes, 4) + g_feat = np.sum(features, axis=0) / num_boxes + num_boxes = num_boxes + 1 + features = np.concatenate([np.expand_dims(g_feat, axis=0), features], axis=0) + + image_location = np.zeros((boxes.shape[0], 5), dtype=np.float32) + image_location[:,:4] = boxes + image_location[:,4] = (image_location[:,3] - image_location[:,1]) * (image_location[:,2] - image_location[:,0]) / (float(image_w) * float(image_h)) + + image_location_ori = copy.deepcopy(image_location) + image_location[:,0] = image_location[:,0] / float(image_w) + image_location[:,1] = image_location[:,1] / float(image_h) + image_location[:,2] = image_location[:,2] / float(image_w) + image_location[:,3] = image_location[:,3] / float(image_h) + + g_location = np.array([0,0,1,1,1]) + image_location = np.concatenate([np.expand_dims(g_location, axis=0), image_location], axis=0) + + g_location_ori = np.array([0,0,image_w,image_h,image_w*image_h]) + image_location_ori = np.concatenate([np.expand_dims(g_location_ori, axis=0), image_location_ori], axis=0) + + # load the scene graph data + pth = os.path.join(self.scene_graph_path, f'{image_id}.pkl') + with open(pth, 'rb') as f: + graph_data = pickle.load(f) + edge_indexes = [] + edge_attributes = [] + for e_idx, e_attr in graph_data: + edge_indexes.append(e_idx) + # get one-hot-encoding of the edges + e_attr_one_hot = np.zeros((12,), dtype=np.float32) # 12 = 11 rels + hub-node rel + e_attr_one_hot[e_attr] = 1.0 + edge_attributes.append(e_attr_one_hot) + edge_indexes = np.array(edge_indexes, dtype=np.float64).transpose(1, 0) + edge_attributes = np.stack(edge_attributes, axis=0) + + return features, num_boxes, image_location, image_location_ori, cls_prob, edge_indexes, edge_attributes + + + def keys(self) -> List[int]: + return self._image_ids + + def set_keys(self, new_ids: List[str]): + self._image_ids = list(map(lambda _id: _id.encode('ascii') ,new_ids)) diff --git a/utils/init_utils.py b/utils/init_utils.py new file mode 100644 index 0000000..b5665bc --- /dev/null +++ b/utils/init_utils.py @@ -0,0 +1,176 @@ +import os +import os.path as osp +import random +import datetime +import itertools +import glob +import subprocess +import pyhocon +import glob +import re +import numpy as np +import glog as log +import json +import torch + +import sys +sys.path.append('../') + +from models import vdgr +from dataloader.dataloader_visdial import VisdialDataset + +from dataloader.dataloader_visdial_dense import VisdialDenseDataset + + +def load_runner(config): + if config['train_on_dense']: + return vdgr.DenseRunner(config) + else: + return vdgr.SparseRunner(config) + +def load_dataset(config): + dataset_eval = None + + if config['train_on_dense']: + dataset = VisdialDenseDataset(config) + if config['skip_mrr_eval']: + temp = config['num_options_dense'] + config['num_options_dense'] = config['num_options'] + dataset_eval = VisdialDenseDataset(config) + config['num_options_dense'] = temp + else: + dataset_eval = VisdialDataset(config) + else: + dataset = VisdialDataset(config) + if config['skip_mrr_eval']: + dataset_eval = VisdialDenseDataset(config) + + if config['use_trainval']: + dataset.split = 'trainval' + else: + dataset.split = 'train' + + if dataset_eval is not None: + dataset_eval.split = 'val' + + return dataset, dataset_eval + + +def initialize_from_env(model, mode, eval_dir, model_type, tag=''): + if "GPU" in os.environ: + os.environ["CUDA_VISIBLE_DEVICES"] = os.environ['GPU'] + if mode in ['train', 'debug']: + config = pyhocon.ConfigFactory.parse_file(f"config/{model_type}.conf")[model] + else: + path_config = osp.join(eval_dir, 'code', f"config/{model_type}.conf") + config = pyhocon.ConfigFactory.parse_file(path_config)[model] + config['log_dir'] = eval_dir + config['model_config'] = osp.join(eval_dir, 'code/config/bert_base_6layer_6conect.json') + if config['dp_type'] == 'apex': + config['dp_type'] = 'ddp' + + if config['dp_type'] == 'dp': + config['stack_gr_data'] = True + + config['model_type'] = model_type + if "CUDA_VISIBLE_DEVICES" in os.environ: + config['num_gpus'] = len(os.environ["CUDA_VISIBLE_DEVICES"].split(',')) + # multi-gpu setting + if config['num_gpus'] > 1: + os.environ['MASTER_ADDR'] = '127.0.0.1' + os.environ['MASTER_PORT'] = '5678' + + if mode == 'debug': + model += '_debug' + + if tag: + model += '-' + tag + if mode in ['train', 'debug']: + config['log_dir'] = os.path.join(config["log_dir"], model) + if not os.path.exists(config["log_dir"]): + os.makedirs(config["log_dir"]) + config['visdial_output_dir'] = osp.join(config['log_dir'], config['visdial_output_dir']) + + config['timestamp'] = datetime.datetime.now().strftime('%m%d-%H%M%S') + + # add the bert config + config['bert_config'] = json.load(open(config['model_config'], 'r')) + if mode in ['predict', 'eval']: + if (not config['loads_start_path']) and (not config['loads_best_ckpt']): + config['loads_best_ckpt'] = True + print(f'Setting loads_best_ckpt=True under predict or eval mode') + if config['num_options_dense'] < 100: + config['num_options_dense'] = 100 + print('Setting num_options_dense=100 under predict or eval mode') + if config['visdial_version'] == 0.9: + config['skip_ndcg_eval'] = True + + return config + + +def set_log_file(fname, file_only=False): + # if fname already exists, find all log file under log dir, + # and name the current log file with a new number + if osp.exists(fname): + prefix, suffix = osp.splitext(fname) + log_files = glob.glob(prefix + '*' + suffix) + count = 0 + for log_file in log_files: + num = re.search(r'(\d+)', log_file) + if num is not None: + num = int(num.group(0)) + count = max(num, count) + fname = fname.replace(suffix, str(count + 1) + suffix) + # set log file + # simple tricks for duplicating logging destination in the logging module such as: + # logging.getLogger().addHandler(logging.FileHandler(filename)) + # does NOT work well here, because python Traceback message (not via logging module) is not sent to the file, + # the following solution (copied from : https://stackoverflow.com/questions/616645) is a little bit + # complicated but simulates exactly the "tee" command in linux shell, and it redirects everything + if file_only: + # we only output messages to file, and stdout/stderr receives nothing. + # this feature is designed for executing the script via ssh: + # since ssh has a windowing kind of flow control, i.e., if the controller does not read data from a + # ssh channel and its buffer fills up, the execution machine will not be able to write anything into the + # channel and the process will be set to sleeping (S) status until someone reads all data from the channel. + # this is not desired since we do not want to read stdout/stderr from the controller machine. + # so, here we use a simple solution: disable output to stdout/stderr and only output messages to log file. + log.logger.handlers[0].stream = log.handler.stream = sys.stdout = sys.stderr = f = open(fname, 'w', buffering=1) + else: + # we output messages to both file and stdout/stderr + tee = subprocess.Popen(['tee', fname], stdin=subprocess.PIPE) + os.dup2(tee.stdin.fileno(), sys.stdout.fileno()) + os.dup2(tee.stdin.fileno(), sys.stderr.fileno()) + + +def copy_file_to_log(log_dir): + dirs_to_cp = ['.', 'config', 'dataloader', 'models', 'utils'] + files_to_cp = ['*.py', '*.json', '*.sh', '*.conf'] + for dir_name in dirs_to_cp: + dir_name = osp.join(log_dir, 'code', dir_name) + if not osp.exists(dir_name): + os.makedirs(dir_name) + for dir_name, file_name in itertools.product(dirs_to_cp, files_to_cp): + filename = osp.join(dir_name, file_name) + if len(glob.glob(filename)) > 0: + os.system(f'cp {filename} {osp.join(log_dir, "code", dir_name)}') + log.info(f'Files copied to {osp.join(log_dir, "code")}') + + +def set_random_seed(random_seed): + torch.manual_seed(random_seed) + torch.cuda.manual_seed(random_seed) + random.seed(random_seed) + np.random.seed(random_seed) + + +def set_training_steps(config, num_samples): + if config['parallel'] and config['dp_type'] == 'dp': + config['num_iter_per_epoch'] = int(np.ceil(num_samples / config['batch_size'])) + else: + config['num_iter_per_epoch'] = int(np.ceil(num_samples / (config['batch_size'] * config['num_gpus']))) + if 'train_steps' not in config: + config['train_steps'] = config['num_iter_per_epoch'] * config['num_epochs'] + if 'warmup_steps' not in config: + config['warmup_steps'] = int(config['train_steps'] * config['warmup_ratio']) + return config diff --git a/utils/model_utils.py b/utils/model_utils.py new file mode 100644 index 0000000..734a550 --- /dev/null +++ b/utils/model_utils.py @@ -0,0 +1,456 @@ +import torch +from torch import nn +import torch.nn.functional as F +import numpy as np + +def truncated_normal_(tensor, mean=0, std=1): + size = tensor.shape + tmp = tensor.new_empty(size + (4,)).normal_() + valid = (tmp < 2) & (tmp > -2) + ind = valid.max(-1, keepdim=True)[1] + tensor.data.copy_(tmp.gather(-1, ind).squeeze(-1)) + tensor.data.mul_(std).add_(mean) + + +def init_params(module, initializer='normal'): + + if isinstance(module, nn.Linear): + if initializer == 'kaiming_normal': + nn.init.kaiming_normal_(module.weight.data) + elif initializer == 'normal': + nn.init.normal_(module.weight.data, std=0.02) + elif initializer == 'truncated_normal': + truncated_normal_(module.weight.data, std=0.02) + + if module.bias is not None: + nn.init.zeros_(module.bias.data) + + # log.info('initialized Linear') + + elif isinstance(module, nn.Embedding): + if initializer == 'kaiming_normal': + nn.init.kaiming_normal_(module.weight.data) + elif initializer == 'normal': + nn.init.normal_(module.weight.data, std=0.02) + elif initializer == 'truncated_normal': + truncated_normal_(module.weight.data, std=0.02) + + elif isinstance(module, nn.Conv2d) or isinstance(module, nn.Conv1d): + nn.init.kaiming_normal_(module.weight, mode='fan_out') + # log.info('initialized Conv') + + elif isinstance(module, nn.RNNBase) or isinstance(module, nn.LSTMCell) or isinstance(module, nn.GRUCell): + for name, param in module.named_parameters(): + if 'weight' in name: + nn.init.orthogonal_(param.data) + elif 'bias' in name: + nn.init.normal_(param.data) + + # log.info('initialized LSTM') + + elif isinstance(module, nn.BatchNorm1d) or isinstance(module, nn.BatchNorm2d): + module.weight.data.normal_(1.0, 0.02) + # log.info('initialized BatchNorm') + + +def TensorboardWriter(save_path): + from torch.utils.tensorboard import SummaryWriter + return SummaryWriter(save_path, comment="Unmt") + + +DEFAULT_EPS = 1e-8 +PADDED_Y_VALUE = -1 + + +def listMLE(y_pred, y_true, eps=DEFAULT_EPS, padded_value_indicator=PADDED_Y_VALUE): + """ + ListMLE loss introduced in "Listwise Approach to Learning to Rank - Theory and Algorithm". + :param y_pred: predictions from the model, shape [batch_size, slate_length] + :param y_true: ground truth labels, shape [batch_size, slate_length] + :param eps: epsilon value, used for numerical stability + :param padded_value_indicator: an indicator of the y_true index containing a padded item, e.g. -1 + :return: loss value, a torch.Tensor + """ + # shuffle for randomised tie resolution + random_indices = torch.randperm(y_pred.shape[-1]) + y_pred_shuffled = y_pred[:, random_indices] + y_true_shuffled = y_true[:, random_indices] + + y_true_sorted, indices = y_true_shuffled.sort(descending=True, dim=-1) + + mask = y_true_sorted == padded_value_indicator + + preds_sorted_by_true = torch.gather(y_pred_shuffled, dim=1, index=indices) + preds_sorted_by_true[mask] = float("-inf") + + max_pred_values, _ = preds_sorted_by_true.max(dim=1, keepdim=True) + + preds_sorted_by_true_minus_max = preds_sorted_by_true - max_pred_values + + cumsums = torch.cumsum(preds_sorted_by_true_minus_max.exp().flip(dims=[1]), dim=1).flip(dims=[1]) + + observation_loss = torch.log(cumsums + eps) - preds_sorted_by_true_minus_max + + observation_loss[mask] = 0.0 + + return torch.mean(torch.sum(observation_loss, dim=1)) + + +def approxNDCGLoss(y_pred, y_true, eps=DEFAULT_EPS, padded_value_indicator=PADDED_Y_VALUE, alpha=1.): + """ + Loss based on approximate NDCG introduced in "A General Approximation Framework for Direct Optimization of + Information Retrieval Measures". Please note that this method does not implement any kind of truncation. + :param y_pred: predictions from the model, shape [batch_size, slate_length] + :param y_true: ground truth labels, shape [batch_size, slate_length] + :param eps: epsilon value, used for numerical stability + :param padded_value_indicator: an indicator of the y_true index containing a padded item, e.g. -1 + :param alpha: score difference weight used in the sigmoid function + :return: loss value, a torch.Tensor + """ + device = y_pred.device + y_pred = y_pred.clone() + y_true = y_true.clone() + + padded_mask = y_true == padded_value_indicator + y_pred[padded_mask] = float("-inf") + y_true[padded_mask] = float("-inf") + + # Here we sort the true and predicted relevancy scores. + y_pred_sorted, indices_pred = y_pred.sort(descending=True, dim=-1) + y_true_sorted, _ = y_true.sort(descending=True, dim=-1) + + # After sorting, we can mask out the pairs of indices (i, j) containing index of a padded element. + true_sorted_by_preds = torch.gather(y_true, dim=1, index=indices_pred) + true_diffs = true_sorted_by_preds[:, :, None] - true_sorted_by_preds[:, None, :] + padded_pairs_mask = torch.isfinite(true_diffs) + padded_pairs_mask.diagonal(dim1=-2, dim2=-1).zero_() + + # Here we clamp the -infs to get correct gains and ideal DCGs (maxDCGs) + true_sorted_by_preds.clamp_(min=0.) + y_true_sorted.clamp_(min=0.) + + # Here we find the gains, discounts and ideal DCGs per slate. + pos_idxs = torch.arange(1, y_pred.shape[1] + 1).to(device) + D = torch.log2(1. + pos_idxs.float())[None, :] + maxDCGs = torch.sum((torch.pow(2, y_true_sorted) - 1) / D, dim=-1).clamp(min=eps) + G = (torch.pow(2, true_sorted_by_preds) - 1) / maxDCGs[:, None] + + # Here we approximate the ranking positions according to Eqs 19-20 and later approximate NDCG (Eq 21) + scores_diffs = (y_pred_sorted[:, :, None] - y_pred_sorted[:, None, :]) + scores_diffs[~padded_pairs_mask] = 0. + approx_pos = 1. + torch.sum(padded_pairs_mask.float() * (torch.sigmoid(-alpha * scores_diffs).clamp(min=eps)), + dim=-1) + approx_D = torch.log2(1. + approx_pos) + approx_NDCG = torch.sum((G / approx_D), dim=-1) + + return -torch.mean(approx_NDCG) + # return -torch.mean(approx_NDCG) + + +def listNet(y_pred, y_true, eps=DEFAULT_EPS, padded_value_indicator=PADDED_Y_VALUE): + """ + ListNet loss introduced in "Learning to Rank: From Pairwise Approach to Listwise Approach". + :param y_pred: predictions from the model, shape [batch_size, slate_length] + :param y_true: ground truth labels, shape [batch_size, slate_length] + :param eps: epsilon value, used for numerical stability + :param padded_value_indicator: an indicator of the y_true index containing a padded item, e.g. -1 + :return: loss value, a torch.Tensor + """ + y_pred = y_pred.clone() + y_true = y_true.clone() + + mask = y_true == padded_value_indicator + y_pred[mask] = float('-inf') + y_true[mask] = float('-inf') + + preds_smax = F.softmax(y_pred, dim=1) + true_smax = F.softmax(y_true, dim=1) + + preds_smax = preds_smax + eps + preds_log = torch.log(preds_smax) + + return torch.mean(-torch.sum(true_smax * preds_log, dim=1)) + + +def deterministic_neural_sort(s, tau, mask): + """ + Deterministic neural sort. + Code taken from "Stochastic Optimization of Sorting Networks via Continuous Relaxations", ICLR 2019. + Minor modifications applied to the original code (masking). + :param s: values to sort, shape [batch_size, slate_length] + :param tau: temperature for the final softmax function + :param mask: mask indicating padded elements + :return: approximate permutation matrices of shape [batch_size, slate_length, slate_length] + """ + dev = s.device + + n = s.size()[1] + one = torch.ones((n, 1), dtype=torch.float32, device=dev) + s = s.masked_fill(mask[:, :, None], -1e8) + A_s = torch.abs(s - s.permute(0, 2, 1)) + A_s = A_s.masked_fill(mask[:, :, None] | mask[:, None, :], 0.0) + + B = torch.matmul(A_s, torch.matmul(one, torch.transpose(one, 0, 1))) + + temp = [n - m + 1 - 2 * (torch.arange(n - m, device=dev) + 1) for m in mask.squeeze(-1).sum(dim=1)] + temp = [t.type(torch.float32) for t in temp] + temp = [torch.cat((t, torch.zeros(n - len(t), device=dev))) for t in temp] + scaling = torch.stack(temp).type(torch.float32).to(dev) # type: ignore + + s = s.masked_fill(mask[:, :, None], 0.0) + C = torch.matmul(s, scaling.unsqueeze(-2)) + + P_max = (C - B).permute(0, 2, 1) + P_max = P_max.masked_fill(mask[:, :, None] | mask[:, None, :], -np.inf) + P_max = P_max.masked_fill(mask[:, :, None] & mask[:, None, :], 1.0) + sm = torch.nn.Softmax(-1) + P_hat = sm(P_max / tau) + return P_hat + +def sample_gumbel(samples_shape, device, eps=1e-10) -> torch.Tensor: + """ + Sampling from Gumbel distribution. + Code taken from "Stochastic Optimization of Sorting Networks via Continuous Relaxations", ICLR 2019. + Minor modifications applied to the original code (masking). + :param samples_shape: shape of the output samples tensor + :param device: device of the output samples tensor + :param eps: epsilon for the logarithm function + :return: Gumbel samples tensor of shape samples_shape + """ + U = torch.rand(samples_shape, device=device) + return -torch.log(-torch.log(U + eps) + eps) + + +def apply_mask_and_get_true_sorted_by_preds(y_pred, y_true, padding_indicator=PADDED_Y_VALUE): + mask = y_true == padding_indicator + + y_pred[mask] = float('-inf') + y_true[mask] = 0.0 + + _, indices = y_pred.sort(descending=True, dim=-1) + return torch.gather(y_true, dim=1, index=indices) + + +def dcg(y_pred, y_true, ats=None, gain_function=lambda x: torch.pow(2, x) - 1, padding_indicator=PADDED_Y_VALUE): + """ + Discounted Cumulative Gain at k. + Compute DCG at ranks given by ats or at the maximum rank if ats is None. + :param y_pred: predictions from the model, shape [batch_size, slate_length] + :param y_true: ground truth labels, shape [batch_size, slate_length] + :param ats: optional list of ranks for DCG evaluation, if None, maximum rank is used + :param gain_function: callable, gain function for the ground truth labels, e.g. torch.pow(2, x) - 1 + :param padding_indicator: an indicator of the y_true index containing a padded item, e.g. -1 + :return: DCG values for each slate and evaluation position, shape [batch_size, len(ats)] + """ + y_true = y_true.clone() + y_pred = y_pred.clone() + + actual_length = y_true.shape[1] + + if ats is None: + ats = [actual_length] + ats = [min(at, actual_length) for at in ats] + + true_sorted_by_preds = apply_mask_and_get_true_sorted_by_preds(y_pred, y_true, padding_indicator) + + discounts = (torch.tensor(1) / torch.log2(torch.arange(true_sorted_by_preds.shape[1], dtype=torch.float) + 2.0)).to( + device=true_sorted_by_preds.device) + + gains = gain_function(true_sorted_by_preds) + + discounted_gains = (gains * discounts)[:, :np.max(ats)] + + cum_dcg = torch.cumsum(discounted_gains, dim=1) + + ats_tensor = torch.tensor(ats, dtype=torch.long) - torch.tensor(1) + + dcg = cum_dcg[:, ats_tensor] + + return dcg + + +def sinkhorn_scaling(mat, mask=None, tol=1e-6, max_iter=50): + """ + Sinkhorn scaling procedure. + :param mat: a tensor of square matrices of shape N x M x M, where N is batch size + :param mask: a tensor of masks of shape N x M + :param tol: Sinkhorn scaling tolerance + :param max_iter: maximum number of iterations of the Sinkhorn scaling + :return: a tensor of (approximately) doubly stochastic matrices + """ + if mask is not None: + mat = mat.masked_fill(mask[:, None, :] | mask[:, :, None], 0.0) + mat = mat.masked_fill(mask[:, None, :] & mask[:, :, None], 1.0) + + for _ in range(max_iter): + mat = mat / mat.sum(dim=1, keepdim=True).clamp(min=DEFAULT_EPS) + mat = mat / mat.sum(dim=2, keepdim=True).clamp(min=DEFAULT_EPS) + + if torch.max(torch.abs(mat.sum(dim=2) - 1.)) < tol and torch.max(torch.abs(mat.sum(dim=1) - 1.)) < tol: + break + + if mask is not None: + mat = mat.masked_fill(mask[:, None, :] | mask[:, :, None], 0.0) + + return mat + + + +def stochastic_neural_sort(s, n_samples, tau, mask, beta=1.0, log_scores=True, eps=1e-10): + """ + Stochastic neural sort. Please note that memory complexity grows by factor n_samples. + Code taken from "Stochastic Optimization of Sorting Networks via Continuous Relaxations", ICLR 2019. + Minor modifications applied to the original code (masking). + :param s: values to sort, shape [batch_size, slate_length] + :param n_samples: number of samples (approximations) for each permutation matrix + :param tau: temperature for the final softmax function + :param mask: mask indicating padded elements + :param beta: scale parameter for the Gumbel distribution + :param log_scores: whether to apply the logarithm function to scores prior to Gumbel perturbation + :param eps: epsilon for the logarithm function + :return: approximate permutation matrices of shape [n_samples, batch_size, slate_length, slate_length] + """ + dev = s.device + + batch_size = s.size()[0] + n = s.size()[1] + s_positive = s + torch.abs(s.min()) + samples = beta * sample_gumbel([n_samples, batch_size, n, 1], device=dev) + if log_scores: + s_positive = torch.log(s_positive + eps) + + s_perturb = (s_positive + samples).view(n_samples * batch_size, n, 1) + mask_repeated = mask.repeat_interleave(n_samples, dim=0) + + P_hat = deterministic_neural_sort(s_perturb, tau, mask_repeated) + P_hat = P_hat.view(n_samples, batch_size, n, n) + return P_hat + + +def neuralNDCG(y_pred, y_true, padded_value_indicator=PADDED_Y_VALUE, temperature=1., powered_relevancies=True, k=None, + stochastic=False, n_samples=32, beta=0.1, log_scores=True): + """ + NeuralNDCG loss introduced in "NeuralNDCG: Direct Optimisation of a Ranking Metric via Differentiable + Relaxation of Sorting" - https://arxiv.org/abs/2102.07831. Based on the NeuralSort algorithm. + :param y_pred: predictions from the model, shape [batch_size, slate_length] + :param y_true: ground truth labels, shape [batch_size, slate_length] + :param padded_value_indicator: an indicator of the y_true index containing a padded item, e.g. -1 + :param temperature: temperature for the NeuralSort algorithm + :param powered_relevancies: whether to apply 2^x - 1 gain function, x otherwise + :param k: rank at which the loss is truncated + :param stochastic: whether to calculate the stochastic variant + :param n_samples: how many stochastic samples are taken, used if stochastic == True + :param beta: beta parameter for NeuralSort algorithm, used if stochastic == True + :param log_scores: log_scores parameter for NeuralSort algorithm, used if stochastic == True + :return: loss value, a torch.Tensor + """ + dev = y_pred.device + + if k is None: + k = y_true.shape[1] + + mask = (y_true == padded_value_indicator) + # Choose the deterministic/stochastic variant + if stochastic: + P_hat = stochastic_neural_sort(y_pred.unsqueeze(-1), n_samples=n_samples, tau=temperature, mask=mask, + beta=beta, log_scores=log_scores) + else: + P_hat = deterministic_neural_sort(y_pred.unsqueeze(-1), tau=temperature, mask=mask).unsqueeze(0) + + # Perform sinkhorn scaling to obtain doubly stochastic permutation matrices + P_hat = sinkhorn_scaling(P_hat.view(P_hat.shape[0] * P_hat.shape[1], P_hat.shape[2], P_hat.shape[3]), + mask.repeat_interleave(P_hat.shape[0], dim=0), tol=1e-6, max_iter=50) + P_hat = P_hat.view(int(P_hat.shape[0] / y_pred.shape[0]), y_pred.shape[0], P_hat.shape[1], P_hat.shape[2]) + + # Mask P_hat and apply to true labels, ie approximately sort them + P_hat = P_hat.masked_fill(mask[None, :, :, None] | mask[None, :, None, :], 0.) + y_true_masked = y_true.masked_fill(mask, 0.).unsqueeze(-1).unsqueeze(0) + if powered_relevancies: + y_true_masked = torch.pow(2., y_true_masked) - 1. + + ground_truth = torch.matmul(P_hat, y_true_masked).squeeze(-1) + discounts = (torch.tensor(1.) / torch.log2(torch.arange(y_true.shape[-1], dtype=torch.float) + 2.)).to(dev) + discounted_gains = ground_truth * discounts + + if powered_relevancies: + idcg = dcg(y_true, y_true, ats=[k]).permute(1, 0) + else: + idcg = dcg(y_true, y_true, ats=[k], gain_function=lambda x: x).permute(1, 0) + + discounted_gains = discounted_gains[:, :, :k] + ndcg = discounted_gains.sum(dim=-1) / (idcg + DEFAULT_EPS) + idcg_mask = idcg == 0. + ndcg = ndcg.masked_fill(idcg_mask.repeat(ndcg.shape[0], 1), 0.) + + assert (ndcg < 0.).sum() >= 0, "every ndcg should be non-negative" + if idcg_mask.all(): + return torch.tensor(0.) + + mean_ndcg = ndcg.sum() / ((~idcg_mask).sum() * ndcg.shape[0]) # type: ignore + return -1. * mean_ndcg # -1 cause we want to maximize NDCG + + +def neuralNDCG_transposed(y_pred, y_true, padded_value_indicator=PADDED_Y_VALUE, temperature=1., + powered_relevancies=True, k=None, stochastic=False, n_samples=32, beta=0.1, log_scores=True, + max_iter=50, tol=1e-6): + """ + NeuralNDCG Transposed loss introduced in "NeuralNDCG: Direct Optimisation of a Ranking Metric via Differentiable + Relaxation of Sorting" - https://arxiv.org/abs/2102.07831. Based on the NeuralSort algorithm. + :param y_pred: predictions from the model, shape [batch_size, slate_length] + :param y_true: ground truth labels, shape [batch_size, slate_length] + :param padded_value_indicator: an indicator of the y_true index containing a padded item, e.g. -1 + :param temperature: temperature for the NeuralSort algorithm + :param powered_relevancies: whether to apply 2^x - 1 gain function, x otherwise + :param k: rank at which the loss is truncated + :param stochastic: whether to calculate the stochastic variant + :param n_samples: how many stochastic samples are taken, used if stochastic == True + :param beta: beta parameter for NeuralSort algorithm, used if stochastic == True + :param log_scores: log_scores parameter for NeuralSort algorithm, used if stochastic == True + :param max_iter: maximum iteration count for Sinkhorn scaling + :param tol: tolerance for Sinkhorn scaling + :return: loss value, a torch.Tensor + """ + dev = y_pred.device + + if k is None: + k = y_true.shape[1] + + mask = (y_true == padded_value_indicator) + + if stochastic: + P_hat = stochastic_neural_sort(y_pred.unsqueeze(-1), n_samples=n_samples, tau=temperature, mask=mask, + beta=beta, log_scores=log_scores) + else: + P_hat = deterministic_neural_sort(y_pred.unsqueeze(-1), tau=temperature, mask=mask).unsqueeze(0) + + # Perform sinkhorn scaling to obtain doubly stochastic permutation matrices + P_hat_masked = sinkhorn_scaling(P_hat.view(P_hat.shape[0] * y_pred.shape[0], y_pred.shape[1], y_pred.shape[1]), + mask.repeat_interleave(P_hat.shape[0], dim=0), tol=tol, max_iter=max_iter) + P_hat_masked = P_hat_masked.view(P_hat.shape[0], y_pred.shape[0], y_pred.shape[1], y_pred.shape[1]) + discounts = (torch.tensor(1) / torch.log2(torch.arange(y_true.shape[-1], dtype=torch.float) + 2.)).to(dev) + + # This takes care of the @k metric truncation - if something is @>k, it is useless and gets 0.0 discount + discounts[k:] = 0. + discounts = discounts[None, None, :, None] + + # Here the discounts become expected discounts + discounts = torch.matmul(P_hat_masked.permute(0, 1, 3, 2), discounts).squeeze(-1) + if powered_relevancies: + gains = torch.pow(2., y_true) - 1 + discounted_gains = gains.unsqueeze(0) * discounts + idcg = dcg(y_true, y_true, ats=[k]).squeeze() + else: + gains = y_true + discounted_gains = gains.unsqueeze(0) * discounts + idcg = dcg(y_true, y_true, ats=[k]).squeeze() + + ndcg = discounted_gains.sum(dim=2) / (idcg + DEFAULT_EPS) + idcg_mask = idcg == 0. + ndcg = ndcg.masked_fill(idcg_mask, 0.) + + assert (ndcg < 0.).sum() >= 0, "every ndcg should be non-negative" + if idcg_mask.all(): + return torch.tensor(0.) + + mean_ndcg = ndcg.sum() / ((~idcg_mask).sum() * ndcg.shape[0]) # type: ignore + return -1. * mean_ndcg # -1 cause we want to maximize NDCG diff --git a/utils/modules.py b/utils/modules.py new file mode 100644 index 0000000..cccb657 --- /dev/null +++ b/utils/modules.py @@ -0,0 +1,41 @@ +from collections import Counter, defaultdict +import logging +from typing import Union, List, Dict, Any +import torch +from torch import nn + + +class Identity(nn.Module): + def __init__(self): + super().__init__() + + def forward(self, x): + return x + + +class Reshaper(nn.Module): + def __init__(self, *output_shape): + super().__init__() + + self.output_shape = output_shape + + def forward(self, input: torch.Tensor): + return input.view(*self.output_shape) + + +class Normalizer(nn.Module): + def __init__(self, target_norm=1.): + super().__init__() + self.target_norm = target_norm + + def forward(self, input: torch.Tensor): + return input * self.target_norm / input.norm(p=2, dim=1, keepdim=True) + + +class Squeezer(nn.Module): + def __init__(self, dim=-1): + super().__init__() + self.dim = dim + + def forward(self, input): + return torch.squeeze(input, dim=self.dim) diff --git a/utils/optim_utils.py b/utils/optim_utils.py new file mode 100644 index 0000000..4d98597 --- /dev/null +++ b/utils/optim_utils.py @@ -0,0 +1,389 @@ +import logging +import math +import numpy as np +import random +import functools +import glog as log + +import torch +from torch import nn, optim +from torch.optim import Optimizer +from torch.optim.lr_scheduler import _LRScheduler, ConstantLR +import torch.nn.functional as F +from torch.nn.utils import clip_grad_norm_ +from pytorch_transformers.optimization import AdamW + + +class WarmupLinearScheduleNonZero(_LRScheduler): + """ Linear warmup and then linear decay. + Linearly increases learning rate from 0 to max_lr over `warmup_steps` training steps. + Linearly decreases learning rate linearly to min_lr over remaining `t_total - warmup_steps` steps. + """ + def __init__(self, optimizer, warmup_steps, t_total, min_lr=1e-5, last_epoch=-1): + self.warmup_steps = warmup_steps + self.t_total = t_total + self.min_lr = min_lr + super(WarmupLinearScheduleNonZero, self).__init__(optimizer, last_epoch=last_epoch) + + def get_lr(self): + step = self.last_epoch + if step < self.warmup_steps: + lr_factor = float(step) / float(max(1, self.warmup_steps)) + else: + lr_factor = max(0, float(self.t_total - step) / float(max(1.0, self.t_total - self.warmup_steps))) + + return [base_lr * lr_factor if (base_lr * lr_factor) > self.min_lr else self.min_lr for base_lr in self.base_lrs] + + +def init_optim(model, config): + optimizer_grouped_parameters = [] + + gnn_params = [] + + encoder_params_with_decay = [] + encoder_params_without_decay = [] + + exclude_from_weight_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight'] + + for module_name, module in model.named_children(): + for param_name, param in module.named_parameters(): + if param.requires_grad: + if "gnn" in param_name: + gnn_params.append(param) + elif module_name == 'encoder': + if any(ex in param_name for ex in exclude_from_weight_decay): + encoder_params_without_decay.append(param) + else: + encoder_params_with_decay.append(param) + + optimizer_grouped_parameters = [ + { + 'params': gnn_params, + 'weight_decay': config.gnn_weight_decay, + 'lr': config['learning_rate_gnn'] if config.use_diff_lr_gnn else config['learning_rate_bert'] + } + ] + + optimizer_grouped_parameters.extend( + [ + { + 'params': encoder_params_without_decay, + 'weight_decay': 0, + 'lr': config['learning_rate_bert'] + }, + { + 'params': encoder_params_with_decay, + 'weight_decay': 0.01, + 'lr': config['learning_rate_bert'] + } + ] + ) + optimizer = AdamW(optimizer_grouped_parameters, lr=config['learning_rate_gnn']) + scheduler = WarmupLinearScheduleNonZero( + optimizer, + warmup_steps=config['warmup_steps'], + t_total=config['train_steps'], + min_lr=config['min_lr'] + ) + + return optimizer, scheduler + + +def build_torch_optimizer(model, config): + """Builds the PyTorch optimizer. + + We use the default parameters for Adam that are suggested by + the original paper https://arxiv.org/pdf/1412.6980.pdf + These values are also used by other established implementations, + e.g. https://www.tensorflow.org/api_docs/python/tf/train/AdamOptimizer + https://keras.io/optimizers/ + Recently there are slightly different values used in the paper + "Attention is all you need" + https://arxiv.org/pdf/1706.03762.pdf, particularly the value beta2=0.98 + was used there however, beta2=0.999 is still arguably the more + established value, so we use that here as well + + Args: + model: The model to optimize. + config: The dictionary of options. + + Returns: + A ``torch.optim.Optimizer`` instance. + """ + params = [p for p in model.parameters() if p.requires_grad] + betas = [0.9, 0.999] + exclude_from_weight_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight'] + + params = {'bert': [], 'task': []} + for module_name, module in model.named_children(): + if module_name == 'encoder': + param_type = 'bert' + else: + param_type = 'task' + for param_name, param in module.named_parameters(): + if param.requires_grad: + if any(ex in param_name for ex in exclude_from_weight_decay): + params[param_type] += [ + { + "params": [param], + "weight_decay": 0 + } + ] + else: + params[param_type] += [ + { + "params": [param], + "weight_decay": 0.01 + } + ] + if config['task_optimizer'] == 'adamw': + log.info('Using AdamW as task optimizer') + task_optimizer = AdamWeightDecay(params['task'], + lr=config["learning_rate_task"], + betas=betas, + eps=1e-6) + elif config['task_optimizer'] == 'adam': + log.info('Using Adam as task optimizer') + task_optimizer = optim.Adam(params['task'], + lr=config["learning_rate_task"], + betas=betas, + eps=1e-6) + if len(params['bert']) > 0: + bert_optimizer = AdamWeightDecay(params['bert'], + lr=config["learning_rate_bert"], + betas=betas, + eps=1e-6) + optimizer = MultipleOptimizer([bert_optimizer, task_optimizer]) + else: + optimizer = task_optimizer + + return optimizer + + +def make_learning_rate_decay_fn(decay_method, train_steps, **kwargs): + """Returns the learning decay function from options.""" + if decay_method == "linear": + return functools.partial( + linear_decay, + global_steps=train_steps, + **kwargs) + elif decay_method == "exp": + return functools.partial( + exp_decay, + global_steps=train_steps, + **kwargs) + else: + raise ValueError(f'{decay_method} not found') + + +def linear_decay(step, global_steps, warmup_steps=100, initial_learning_rate=1, end_learning_rate=0, **kargs): + if step < warmup_steps: + return initial_learning_rate * step / warmup_steps + else: + return (initial_learning_rate - end_learning_rate) * \ + (1 - (step - warmup_steps) / (global_steps - warmup_steps)) + \ + end_learning_rate + +def exp_decay(step, global_steps, decay_exp=1, warmup_steps=100, initial_learning_rate=1, end_learning_rate=0, **kargs): + if step < warmup_steps: + return initial_learning_rate * step / warmup_steps + else: + return (initial_learning_rate - end_learning_rate) * \ + ((1 - (step - warmup_steps) / (global_steps - warmup_steps)) ** decay_exp) + \ + end_learning_rate + + +class MultipleOptimizer(object): + """ Implement multiple optimizers needed for sparse adam """ + + def __init__(self, op): + """ ? """ + self.optimizers = op + + @property + def param_groups(self): + param_groups = [] + for optimizer in self.optimizers: + param_groups.extend(optimizer.param_groups) + return param_groups + + def zero_grad(self): + """ ? """ + for op in self.optimizers: + op.zero_grad() + + def step(self): + """ ? """ + for op in self.optimizers: + op.step() + + @property + def state(self): + """ ? """ + return {k: v for op in self.optimizers for k, v in op.state.items()} + + def state_dict(self): + """ ? """ + return [op.state_dict() for op in self.optimizers] + + def load_state_dict(self, state_dicts): + """ ? """ + assert len(state_dicts) == len(self.optimizers) + for i in range(len(state_dicts)): + self.optimizers[i].load_state_dict(state_dicts[i]) + + +class OptimizerBase(object): + """ + Controller class for optimization. Mostly a thin + wrapper for `optim`, but also useful for implementing + rate scheduling beyond what is currently available. + Also implements necessary methods for training RNNs such + as grad manipulations. + """ + + def __init__(self, + optimizer, + learning_rate, + learning_rate_decay_fn=None, + max_grad_norm=None): + """Initializes the controller. + + Args: + optimizer: A ``torch.optim.Optimizer`` instance. + learning_rate: The initial learning rate. + learning_rate_decay_fn: An optional callable taking the current step + as argument and return a learning rate scaling factor. + max_grad_norm: Clip gradients to this global norm. + """ + self._optimizer = optimizer + self._learning_rate = learning_rate + self._learning_rate_decay_fn = learning_rate_decay_fn + self._max_grad_norm = max_grad_norm or 0 + self._training_step = 1 + self._decay_step = 1 + + @classmethod + def from_opt(cls, model, config, checkpoint=None): + """Builds the optimizer from options. + + Args: + cls: The ``Optimizer`` class to instantiate. + model: The model to optimize. + opt: The dict of user options. + checkpoint: An optional checkpoint to load states from. + + Returns: + An ``Optimizer`` instance. + """ + optim_opt = config + optim_state_dict = None + + if config["loads_ckpt"] and checkpoint is not None: + optim = checkpoint['optim'] + ckpt_opt = checkpoint['opt'] + ckpt_state_dict = {} + if isinstance(optim, Optimizer): # Backward compatibility. + ckpt_state_dict['training_step'] = optim._step + 1 + ckpt_state_dict['decay_step'] = optim._step + 1 + ckpt_state_dict['optimizer'] = optim.optimizer.state_dict() + else: + ckpt_state_dict = optim + + if config["reset_optim"] == 'none': + # Load everything from the checkpoint. + optim_opt = ckpt_opt + optim_state_dict = ckpt_state_dict + elif config["reset_optim"] == 'all': + # Build everything from scratch. + pass + elif config["reset_optim"] == 'states': + # Reset optimizer, keep options. + optim_opt = ckpt_opt + optim_state_dict = ckpt_state_dict + del optim_state_dict['optimizer'] + elif config["reset_optim"] == 'keep_states': + # Reset options, keep optimizer. + optim_state_dict = ckpt_state_dict + + learning_rates = [ + optim_opt["learning_rate_bert"], + optim_opt["learning_rate_gnn"] + ] + decay_fn = [ + make_learning_rate_decay_fn(optim_opt['decay_method_bert'], + optim_opt['train_steps'], + warmup_steps=optim_opt['warmup_steps'], + decay_exp=optim_opt['decay_exp']), + make_learning_rate_decay_fn(optim_opt['decay_method_gnn'], + optim_opt['train_steps'], + warmup_steps=optim_opt['warmup_steps'], + decay_exp=optim_opt['decay_exp']), + ] + optimizer = cls( + build_torch_optimizer(model, optim_opt), + learning_rates, + learning_rate_decay_fn=decay_fn, + max_grad_norm=optim_opt["max_grad_norm"]) + if optim_state_dict: + optimizer.load_state_dict(optim_state_dict) + return optimizer + + @property + def training_step(self): + """The current training step.""" + return self._training_step + + def learning_rate(self): + """Returns the current learning rate.""" + if self._learning_rate_decay_fn is None: + return self._learning_rate + return [decay_fn(self._decay_step) * learning_rate \ + for decay_fn, learning_rate in \ + zip(self._learning_rate_decay_fn, self._learning_rate)] + + def state_dict(self): + return { + 'training_step': self._training_step, + 'decay_step': self._decay_step, + 'optimizer': self._optimizer.state_dict() + } + + def load_state_dict(self, state_dict): + self._training_step = state_dict['training_step'] + # State can be partially restored. + if 'decay_step' in state_dict: + self._decay_step = state_dict['decay_step'] + if 'optimizer' in state_dict: + self._optimizer.load_state_dict(state_dict['optimizer']) + + def zero_grad(self): + """Zero the gradients of optimized parameters.""" + self._optimizer.zero_grad() + + def backward(self, loss): + """Wrapper for backward pass. Some optimizer requires ownership of the + backward pass.""" + loss.backward() + + def step(self): + """Update the model parameters based on current gradients. + + Optionally, will employ gradient modification or update learning + rate. + """ + learning_rate = self.learning_rate() + + if isinstance(self._optimizer, MultipleOptimizer): + optimizers = self._optimizer.optimizers + else: + optimizers = [self._optimizer] + for lr, op in zip(learning_rate, optimizers): + for group in op.param_groups: + group['lr'] = lr + if self._max_grad_norm > 0: + clip_grad_norm_(group['params'], self._max_grad_norm) + self._optimizer.step() + self._decay_step += 1 + self._training_step += 1 + diff --git a/utils/visdial_metrics.py b/utils/visdial_metrics.py new file mode 100644 index 0000000..fc9a383 --- /dev/null +++ b/utils/visdial_metrics.py @@ -0,0 +1,322 @@ +""" +A Metric observes output of certain model, for example, in form of logits or +scores, and accumulates a particular metric with reference to some provided +targets. In context of VisDial, we use Recall (@ 1, 5, 10), Mean Rank, Mean +Reciprocal Rank (MRR) and Normalized Discounted Cumulative Gain (NDCG). + +Each ``Metric`` must atleast implement three methods: + - ``observe``, update accumulated metric with currently observed outputs + and targets. + - ``retrieve`` to return the accumulated metric., an optionally reset + internally accumulated metric (this is commonly done between two epochs + after validation). + - ``reset`` to explicitly reset the internally accumulated metric. + +Caveat, if you wish to implement your own class of Metric, make sure you call +``detach`` on output tensors (like logits), else it will cause memory leaks. +""" +import torch +import torch.distributed as dist +import numpy as np + +def scores_to_ranks(scores: torch.Tensor): + """Convert model output scores into ranks.""" + batch_size, num_rounds, num_options = scores.size() + scores = scores.view(-1, num_options) + + # sort in descending order - largest score gets highest rank + sorted_ranks, ranked_idx = scores.sort(1, descending=True) + + # i-th position in ranked_idx specifies which score shall take this + # position but we want i-th position to have rank of score at that + # position, do this conversion + ranks = ranked_idx.clone().fill_(0) + for i in range(ranked_idx.size(0)): + for j in range(num_options): + ranks[i][ranked_idx[i][j]] = j + # convert from 0-99 ranks to 1-100 ranks + ranks += 1 + ranks = ranks.view(batch_size, num_rounds, num_options) + return ranks + +class SparseGTMetrics(object): + """ + A class to accumulate all metrics with sparse ground truth annotations. + These include Recall (@ 1, 5, 10), Mean Rank and Mean Reciprocal Rank. + """ + + def __init__(self): + self._rank_list = [] + self._rank_list_rnd = [] + self.num_rounds = None + + def observe( + self, predicted_scores: torch.Tensor, target_ranks: torch.Tensor + ): + predicted_scores = predicted_scores.detach() + + # shape: (batch_size, num_rounds, num_options) + predicted_ranks = scores_to_ranks(predicted_scores) + batch_size, num_rounds, num_options = predicted_ranks.size() + self.num_rounds = num_rounds + # collapse batch dimension + predicted_ranks = predicted_ranks.view( + batch_size * num_rounds, num_options + ) + + # shape: (batch_size * num_rounds, ) + target_ranks = target_ranks.view(batch_size * num_rounds).long() + + # shape: (batch_size * num_rounds, ) + predicted_gt_ranks = predicted_ranks[ + torch.arange(batch_size * num_rounds), target_ranks + ] + self._rank_list.extend(list(predicted_gt_ranks.cpu().numpy())) + + predicted_gt_ranks_rnd = predicted_gt_ranks.view(batch_size, num_rounds) + # predicted gt ranks + self._rank_list_rnd.append(predicted_gt_ranks_rnd.cpu().numpy()) + + def retrieve(self, reset: bool = True): + num_examples = len(self._rank_list) + if num_examples > 0: + # convert to numpy array for easy calculation. + __rank_list = torch.tensor(self._rank_list).float() + metrics = { + "r@1": torch.mean((__rank_list <= 1).float()).item(), + "r@5": torch.mean((__rank_list <= 5).float()).item(), + "r@10": torch.mean((__rank_list <= 10).float()).item(), + "mean": torch.mean(__rank_list).item(), + "mrr": torch.mean(__rank_list.reciprocal()).item() + } + # add round metrics + _rank_list_rnd = np.concatenate(self._rank_list_rnd) + _rank_list_rnd = _rank_list_rnd.astype(float) + r_1_rnd = np.mean(_rank_list_rnd <= 1, axis=0) + r_5_rnd = np.mean(_rank_list_rnd <= 5, axis=0) + r_10_rnd = np.mean(_rank_list_rnd <= 10, axis=0) + mean_rnd = np.mean(_rank_list_rnd, axis=0) + mrr_rnd = np.mean(np.reciprocal(_rank_list_rnd), axis=0) + + for rnd in range(1, self.num_rounds + 1): + metrics["r_1" + "_round_" + str(rnd)] = r_1_rnd[rnd-1] + metrics["r_5" + "_round_" + str(rnd)] = r_5_rnd[rnd-1] + metrics["r_10" + "_round_" + str(rnd)] = r_10_rnd[rnd-1] + metrics["mean" + "_round_" + str(rnd)] = mean_rnd[rnd-1] + metrics["mrr" + "_round_" + str(rnd)] = mrr_rnd[rnd-1] + else: + metrics = {} + + if reset: + self.reset() + return metrics + + def reset(self): + self._rank_list = [] + self._rank_list_rnd = [] + +class NDCG(object): + def __init__(self): + self._ndcg_numerator = 0.0 + self._ndcg_denominator = 0.0 + + def observe( + self, predicted_scores: torch.Tensor, target_relevance: torch.Tensor + ): + """ + Observe model output scores and target ground truth relevance and + accumulate NDCG metric. + + Parameters + ---------- + predicted_scores: torch.Tensor + A tensor of shape (batch_size, num_options), because dense + annotations are available for 1 randomly picked round out of 10. + target_relevance: torch.Tensor + A tensor of shape same as predicted scores, indicating ground truth + relevance of each answer option for a particular round. + """ + predicted_scores = predicted_scores.detach() + + # shape: (batch_size, 1, num_options) + predicted_scores = predicted_scores.unsqueeze(1) + predicted_ranks = scores_to_ranks(predicted_scores) + + # shape: (batch_size, num_options) + predicted_ranks = predicted_ranks.squeeze(1) + batch_size, num_options = predicted_ranks.size() + + k = torch.sum(target_relevance != 0, dim=-1) + + # shape: (batch_size, num_options) + _, rankings = torch.sort(predicted_ranks, dim=-1) + # Sort relevance in descending order so highest relevance gets top rnk. + _, best_rankings = torch.sort( + target_relevance, dim=-1, descending=True + ) + + # shape: (batch_size, ) + batch_ndcg = [] + for batch_index in range(batch_size): + num_relevant = k[batch_index] + dcg = self._dcg( + rankings[batch_index][:num_relevant], + target_relevance[batch_index], + ) + best_dcg = self._dcg( + best_rankings[batch_index][:num_relevant], + target_relevance[batch_index], + ) + batch_ndcg.append(dcg / best_dcg) + + self._ndcg_denominator += batch_size + self._ndcg_numerator += sum(batch_ndcg) + + def _dcg(self, rankings: torch.Tensor, relevance: torch.Tensor): + sorted_relevance = relevance[rankings].cpu().float() + discounts = torch.log2(torch.arange(len(rankings)).float() + 2) + return torch.sum(sorted_relevance / discounts, dim=-1) + + def retrieve(self, reset: bool = True): + if self._ndcg_denominator > 0: + metrics = { + "ndcg": float(self._ndcg_numerator / self._ndcg_denominator) + } + else: + metrics = {} + + if reset: + self.reset() + return metrics + + def reset(self): + self._ndcg_numerator = 0.0 + self._ndcg_denominator = 0.0 + +class SparseGTMetricsParallel(object): + """ + A class to accumulate all metrics with sparse ground truth annotations. + These include Recall (@ 1, 5, 10), Mean Rank and Mean Reciprocal Rank. + """ + + def __init__(self, gpu_rank): + self.rank_1 = 0 + self.rank_5 = 0 + self.rank_10 = 0 + self.ranks = 0 + self.reciprocal = 0 + self.count = 0 + self.gpu_rank = gpu_rank + self.img_ids = [] + + def observe( + self, img_id: list, predicted_scores: torch.Tensor, target_ranks: torch.Tensor + ): + if img_id in self.img_ids: + return + else: + self.img_ids.append(img_id) + + predicted_scores = predicted_scores.detach() + + # shape: (batch_size, num_rounds, num_options) + predicted_ranks = scores_to_ranks(predicted_scores) + batch_size, num_rounds, num_options = predicted_ranks.size() + self.num_rounds = num_rounds + # collapse batch dimension + predicted_ranks = predicted_ranks.view( + batch_size * num_rounds, num_options + ) + + # shape: (batch_size * num_rounds, ) + target_ranks = target_ranks.view(batch_size * num_rounds).long() + + # shape: (batch_size * num_rounds, ) + predicted_gt_ranks = predicted_ranks[ + torch.arange(batch_size * num_rounds), target_ranks + ] + + self.rank_1 += (predicted_gt_ranks <= 1).sum().item() + self.rank_5 += (predicted_gt_ranks <= 5).sum().item() + self.rank_10 += (predicted_gt_ranks <= 10).sum().item() + self.ranks += predicted_gt_ranks.sum().item() + self.reciprocal += predicted_gt_ranks.float().reciprocal().sum().item() + self.count += batch_size * num_rounds + + def retrieve(self): + if self.count > 0: + # retrieve data from all gpu + # define tensor on GPU, count and total is the result at each GPU + t = torch.tensor([self.rank_1, self.rank_5, self.rank_10, self.ranks, self.reciprocal, self.count], dtype=torch.float32, device=f'cuda:{self.gpu_rank}') + dist.barrier() # synchronizes all processes + dist.all_reduce(t, op=torch.distributed.ReduceOp.SUM,) # Reduces the tensor data across all machines in such a way that all get the final result. + t = t.tolist() + self.rank_1, self.rank_5, self.rank_10, self.ranks, self.reciprocal, self.count = t + + # convert to numpy array for easy calculation. + metrics = { + "r@1": self.rank_1 / self.count, + "r@5": self.rank_5 / self.count, + "r@10": self.rank_10 / self.count, + "mean": self.ranks / self.count, + "mrr": self.reciprocal / self.count, + "tot_rnds": self.count, + } + + else: + metrics = {} + + return metrics + + def get_count(self): + return int(self.count) + +class NDCGParallel(NDCG): + def __init__(self, gpu_rank): + super(NDCGParallel, self).__init__() + self.gpu_rank = gpu_rank + self.img_ids = [] + self.count = 0 + + def observe( + self, img_id: int, predicted_scores: torch.Tensor, target_relevance: torch.Tensor + ): + """ + Observe model output scores and target ground truth relevance and + accumulate NDCG metric. + + Parameters + ---------- + predicted_scores: torch.Tensor + A tensor of shape (batch_size, num_options), because dense + annotations are available for 1 randomly picked round out of 10. + target_relevance: torch.Tensor + A tensor of shape same as predicted scores, indicating ground truth + relevance of each answer option for a particular round. + """ + if img_id in self.img_ids: + return + else: + self.img_ids.append(img_id) + self.count += 1 + + super(NDCGParallel, self).observe(predicted_scores, target_relevance) + + + def retrieve(self): + if self._ndcg_denominator > 0: + # define tensor on GPU, count and total is the result at each GPU + t = torch.tensor([self._ndcg_numerator, self._ndcg_denominator, self.count], dtype=torch.float32, device=f'cuda:{self.gpu_rank}') + dist.barrier() # synchronizes all processes + dist.all_reduce(t, op=torch.distributed.ReduceOp.SUM,) # Reduces the tensor data across all machines in such a way that all get the final result. + t = t.tolist() + self._ndcg_numerator, self._ndcg_denominator, self.count = t + metrics = { + "ndcg": float(self._ndcg_numerator / self._ndcg_denominator) + } + else: + metrics = {} + return metrics + + def get_count(self): + return int(self.count)

j+k0co+M!zj6cg_@lGxryz+$KtTfZ$yz~BlHH79QQi?XGEPP# zdg~$VjTeQ@^9xULai$Zh&)A4rq0a@U3*wLC4MttSL$7BN#uAax=F>LtL7nxv)|&#P8R zJ5m%DE%z0iSj&GKuecNI@&xPsSz-Z{XU81{d|vKEf_trXI2Y!~LqG+PtV>BrYs9I&J+1)RPoMq?3}HFT0UCVP&=fkXeM=@3JqeF*5-b9@Wd%-bxiPS$?- z=l@VHo1Mlo_^?A_rtj|3RpWlf-jKo!$t#OMECNIm%NJZ*H44>dUSn1H;k0ly{_R>6 zGCw1UjoDrtKAu~JG95P}+I9r4p6!Whf~9~=Q^^5wz)_h!e+;~4td`Uo@Z*;WGL^25 z&V%1#>w)h`2s!+K*KgRE8M7dFmF&o(B;=4d%rlkF3mf~=XxzLg@_tbqnrJ}n4I|pb z!1FM(M&p0{P+gD1nB=jBsiE~YjI~9nq6I_?q>2SBP<`S{#7|6>!NoyE3&>bN&C*Dw zt#}}`fN5R$O9QOX^yD_I8P3Qr z{U%|sP!`IgVn0XJldftrBWIqRtOf4}^aS@JKQXQ-9`s`2Ym8L(G6!182ue6GFOAaW z*rkmo(CjfD9=(Fw?F-9sX({NZtjgR0Z9N?l&h{CHKgU*u<3biE&1N1Qd=H@v)YAMB zM%f^&UdZ7^vdQDEYbkV;;nI4F>w6AJIJ8JsF_bH!jG7D_lvKLijEZ&vXBb!yYW8A2}twx*ABL%lYAQPr+C ze0+QiF-(ffq;NwjjhZ-cpQ-hS!VZa)KD~fiZ&2FK{=G*kYo@pQ*e~WN(W5=4 z^|^c=KVL;KKVDh;@G!W{lmbP!=bi2iYWJ#cuFG*IEB2 zh6l!+z^>tiS;*jOmMhr@JD>g#Xcdk7duCy?Pbc)q(gU3ihf3iz2D`Aa{c!Zs7eRaB zE)T#->H@CfG?y{)qh{HP46PyY!up7ZYf2zv z?VSv2yoR7=6;bG)2MOV*iPFTqG-d%JDWnWS^r^1w+qaKvYpfZa!o$Nk!bKuo{QNCt z!j%-+jKa_6E}RDcRkKqC#Nu@#51V}(7vR~Odq}D9Eq-i6eNu>_vr~7SIhHK46hMdK zE;1X{Xuf#NRNSzJTCx;cu|K_1@v`g$JyXd2-no z1IuBjQQ^VYy$82zl%Z22p&B-dkIRN4PSw$(e@(RL#=Mz-GmjtQDit@?HlSOnK`loq zzmq{S?{O3v&gj(B3oH3`q=xsf*eoS2FyO``_V`p3e>G{;AtlF6+hcjgd!+3Nh}w%5 zNR9;v*&=Qf+LRR$*-~a1P3m)W#h7giF;NEH(xhW~l>4(9%E?$iGb}6ChLfOstY0rQ z$(aErgp!q;E{XjUG?3YqN80Yl4XDth+Xi7nr^U}wuRC}6_+aGU(t)!@**fxtaW4w0i&iMdJVs&EKW=1(S6ob>j@ zj4s)wm9c(9(ak1v!uT1=!+z4egjdzn!od?uN7UmO`K29FWG5#|_4mha7p7;B7p9l% zghtDbOOQh=ly2#ZWj>BfFNSWdSdqZ4&vad}d5FN>jLC4@fnD7*15WF4>Q@w^^c26D zA|^;fgAmF@xn61IoNyl}+|QaKP?}Da5Gs0oz>lS_U)#2A!M}1aR&-0<98%)^oi#(s=?FrWWX6-9=`jI&BLv(&x)r z02F(e*2}(wI}rcto6?kqaj&9qlRUI+`(gduCT!;>{Ej^WbHY|!V&CG)m8a~S1u7TG zt(BuBp|SHO55B!CIH?~7$m<&W82?>lWFwV|qO|z!)B7b0 zXD&trELEveg>#uA;K;+n1C=UO;>Nml>lOz(>1$w;Pva3drD-A1ix!*O^wCsydT4j; z@(mn5b_f(VWh`Z2&-U=}nx5vF%Y#mw#hZ^WQ$5a*zpkyCcI4s>`C|ipzApAZMqHHw zz5wLLw|vcfEbthiWGcV#;=#RyxcM5T(5#+4dwKO5L2H9>SxL5)xX6bHh#+z0P^+Z5 z61mE&of_6g?9Z>D*xl498R9?TO++Ma1cu?dx-Ix6-eomO4K>r%n7=;1!?TAEa3?qz zCy$(D+ciXf<`JEE{CF9S7oUljB6Z8|BU_~}np8cgsMXSCH||QZnIvR2`H7g2MVKpC zQ^sy!ydMw0sTGx;8qgYp>`I$K+~LxbvBbIPXn~J-yssZRb?Ssp!w%wtf^4@s3KqMG z7Lc(3Jv%jO)QH<;P6!Uf$7+Ewblo+z?utH3A`x?UHT)E%3Z#JkP5#)j%L@yoKe7~~ z*dIfNZjg9M(dbqvGw3Kz9v+Nw0*^1Vp5BW^v#GN@FOKsK+_H*vwwO-2TF z;^o{u;UNbM(YV*}P?`R0+3oPRKUUlgM##VlNtnz{ZN_2dE)SUn1RQ#zV+A4v)36Y* z<^KZD&U(XtdN~IKf!|E6otZev%$9 zLvZJDag?f2Qf7|&RPlF}#mE2A8_9R?-f;^#-aVDhwP}+8k`NH3k3vLKB$p?g(njWz zB}=e>|9(&$qF7`taPh_wOdZ)r=Xk@om-n&%kRM#DREJ3+ejADj{%3LR!|P~{En!I zaLx?H%UZ#*XeD%R$X*P+xQJu7iIh^l#Nku)Q{16yTN~KsRsEYU-`5DwU8tdq0uB+J_+Ky*gO#9>t~eqF=;dbL;NlxgvSSy=)-tA zLe^m03_BF!q8m(*(Pch7&quL54`LB5kX|hC9q%3-z|NgJvGde7L+O8GqRO|$2E_9Bu!4GyuI~mq<1}ZgQ0dLwA$?l;n6BB6jSJa>?+Hd}b_|1yW3G0}gdgIWAwrRq8 zRr{G?)#)1I6EZs~X{hP=O1dYhPOw!UqQdX9I_Y&9KKyn)fiFPZwhVaNWenzetiZ}< z_7WC(7Ty^Wi~tlyy&`#%j38F%ZUF+9$YY8CD`g-PwaJw$m)<<22r#2Jp}M&Blc$!e zt1IUu*iHXBKHEeD8W_;M; z)yr4Ws$C1i4`_f9)^GY7vnKRcE;;TcZk>r>=WS5eHZROf^Ppbq%E0MB_ys+}cl zF>~!D4eb4udCR>9A|7Gal#4ig#0Asl_JLEWl+3P^G8fIXpdHF)Q$N(h7+JNQo_3DqVGM@OK5p}#1x;Hz5AQB=e zv3}z*-Om?02b6~Pl!Lq!%|B^fGJX1VuEVKQr?_>I=Do$1q6I_?h!#j&77)F&Qu=xk z;N*T8SI>E1dc~G-b1KZ>B(bD73nYZ1{)3@i`(R3q+>+^i!Sg5Kj9sfV$`$6*R;IU^ zr~G_){we~Llz~{ZxQmF00C`2}0zApjipC*%1Z3%2$bFV%7?Xz<0a;`#+AQ)E)OBh) z_X`X)K*!K<)-NNpzaBD|PK?7rvP zdufqQH7b__pB_+K{ZhLq83VPnU}sjZ64_!M?XO!aB85J>bf<^u>cQd&O0Lg)hq zA~0_E3N{onmdpFefmGl;0Kkytpce6vk*#R^@>MBawa^rL z-GBJ-IvUzn(?RABgq=E$4a_Ucs_S@cc5j2m#j;D}m?B598tCIb8N0idV4+?+F?9V+ zC<^vcH*n`RO%eI>rn+WEc|Pz&AQx_EWo>Cx`cc^7p5t56WGcy!N7vB1ODmQ3l#;<) zRz%f55?*GQ@?nRJ7=HUDxo{+DT14&1;N=ymU9AEFPaTu5Hq7yd=Xh|5Cs8p)*2ZPf z*wYcNfB%JkUVkdzCfVVS-z+U+vM#{SNSvJeH`bn$xS(dQgw|7MWA(A!_%}2Vo2M!G z|7mIi$2l`GZD>R0BPc0Pc45xkQ+TR9zRycAvQHN7cW*J~k6VBZyvG$-VxkJllU11Y z+=Rf7zqp6r@fEiWiwN-|AuY@6a+V^h^CNM*{YvbGz=T zuZWxm6lzE%Eqc8X@LHvOX}K8*4+RA9Wo%%RU2bFIB7vP6nS(nM4LZe&DktzR;vjRk$r~iViKxqLzJeRBcj1`Btw0@}zhc#QJ5M zjZEvl0I_%#uoZLsLlZ7}v38htU?HXsX@;7WY+;!zlkip$?3=-y0sCzy&%)Ym15rbQ z_kY~G8wal^CMXhgklpo+XI>O~EDdTm0mZ}7mMqqC-}WdkA*_<7<+dA*iGo-`sSB1u z{X1g7q|R_O7yf#@!^3O0nM*wtD_Bi;hi@G#Nk|2IBVBhXCVTKPyusLeHXI4GWMQ~- z_NinPD_D5Vz>Y3uB*e4SZ#m{HsUZ@mN-QLPh!zknAX-2Z3(&({Le>xEjBUdI;F`!3 z+lUqrEugCfOv|B8d&YRrExH}rc)Tl(nMTJPPl3QpYPwr)e z(EaWu`q>L)%xI=l%pt{eIsd(n#Tf2`Pjh81NT$eUo)a9mO87@8$tE1&!V*HqFY<@9I%jt3umZV2*sd$;i=mIVlTu! z#W~-g1ozVH4KZrfFtoMH4UO*-ldLG{&;wKFwU&^!-NfF2hbc;vXpy%7_g090v-QCN zpzN+7_p75z+6r9c`B>SU9UNsN_vVPq6I_?h!zknpdSlJmsR=^CrS}5AX-4V1t^W= zEktqt=R2^XjQk=>c~9|-Vha#jPel_@iO91wc>_$K63L~F$hqVT4?1ZGo_XI5E3c6+ z0IwS_Uw+)*>6jk8o7OiZ=<*A%o<0TlNK(TZh0Jubu4|{(AY!VtRQBxMgOWCODZ&n} zi(Q&I{*@+U56KnE#;SnwDGM0kn^q|z%l>X&63sf4WqkuN#s8Kh4)z-!-A?chkp;n& z525Z%dBzBT`SN9T&60gSKC2C?woCYZ`}Oc0UYHSul34U!G?Qav&0HOub zt_3t*2-Bi@)TmJ^!7uXkB5>@FKmL%$-qA7d0mfU2_s-&vlk>^Hoz`?7$r;Po`^LmD z!Y)HT`!Z1B!iihV4EfRP04Dhs~R|Nkt7*58bGV1J@ue#U7G3 zVde5=R8K4kBfPMAPE>cOoe&4Ri)D%-cR?xel^@Avgy%=fkv%Ic3uodF4fYxP)f{#% zRZy8ZtHmF=fnBHG;b&%p4QGUc$s5g(+b?{H{111znHNRVCZ&;=BOViuDKv|)UT!~Y zA(X2xq0;*Ae|Yhpg5~7e7~~kZ&wwmSzeiiLe)n8<<1Y7tkTFvWK7aa-!^}Z-V5jcs zMlJtCag^H;DI;4r4!7^)3_GF8x&0Wt`jC2__q1l=AN=_BMG_Uo3ef_h1w;!Ntpy7F zTY&vM6~$jo8g)oilAgUzpFYiPiM6tOYTr-Oj}C1lOp(`utT^#Vw18*<(E^%TfIO3E z(WMG?S0{;51!_{rON&a|wr!I%=Tjw;9^{=xi$eN;M_|^{rAyJfcW+Kdsy9?g*5ck! zN~N&e`}gmmc2(xpW{~m|&yM_<029JZ6qRfisM^06 ztWum%OOZ0hTo;e8A3reqH7fZ~xIm6%D4P|ztR$XYpMT<~vTKu!5z=PY!muq*cA-GR z$9Q<<5u!U5R?m55Ruxs-vVIFGTrmnE*B|4RQ+`3%;b+Due*^(3U=&)z&_;zkwG6p# z;RX@^h!zknAX*?5Euav{q6fQ!`}g3`zTMcd?+C^+?u9(La-gD4Y`v*CJ8@{y0-^k&{wF7Ed3cWGF#ctB?_1 z*xI}dIt{1?@0ky9Gx9xRt)g&KDexuiXngyo8QQ06{~1x|hGNpl zE1XQ$z@UZJE#w79h1NbIsAW)di^4?k;(jtvqP$~5w0b4v56>l%9 z<3SpdEx)KEpo%=i_%?h${*%t91gIsi7eD^*^l4*lgNxUXgTF8IHTSreS1@P7a`?U| z0hfidv9!5WvbW)*#@Xizz=+qFdbGL2jvIjI4njN20^u zU1aLCJ@^#!nLR|>VC$*_;L{&!DN6J-__# zMVK+o9o|!hV*b?OsBBkSw2^25(E_3c3~GU_Su(?^VQrk?hQl1CNwC9f+A6Qnx6$a`1On@a+~h-6S%;eoO6@Nj7pzD`<^j2+UGim?D$yv@jN z5mAqlF*EJE7P4j@KYDi1hjHZ_J!}-_b}o+O1n1DKUcOGaX4=n??@{JK z>CNn#%kcv6XASj9z{}N;b8u?X%uqw2z_)J zzi#$KhV7H#I4)2L5|%K)r_Wyz6~U)clng3kg50cWGfJ{2Q%CgjS%``Clzn5F`5ip5bVf_rG>SPoV$hnw zaA9O}ii%m+p6I6JoTBz(ooE5k0-^DCFpTX!UJxsn%8$d;?CD|~!>xY$Bse&>s= ztu4sqlt;h#PyRfeqat6=pQleAc@iRI{NkGsG-184pQigfg2&6$w4b5c5rRi9Z&VtT za%O+cx&4&*lQU;d1f11Z8aBy;e@9Q|nw6iSTGO$0LM>P+bd%9;c0M}}VDf~O+I32$ z)+bM#M82E_(uB(snaI9oUCjO4Q?Kr1hBSS-QYG;A-3R2&lPl>kQbzbDXjmps((`!(uMDI?@59va=gGdkst+-3psJZbUYvE?~^b zgayS+m)N;gXzr_kwGnPtI>*4S^QW5ocZbQ(< z^_b7OT`}#fT+q?02L?Mk!Xb$}q#1IQTZ)aB>!IZaPmJ)mmk?X%Fdl>Zw1a!+|6yA> zKWsIYNs4-i77#5UTENIHAn%c&NL>!dB3FgQ3+IaO7I-hA70ZZWBcC2YBeJlBl^cj|I_$FKoz-F(K#a0BH&BjC5i`>_&$n0d6`1s ziwClVE?kQGnwTU!DNsrzWrcLel`EH8@J?C(^i*H6OmWWJMJY(2@nk>a;gL;n>$ed> zj6BQ5(;ajBRniNf^)&h=8hYDfQTQy>C{P#GEo!m6??jwpoaJc15wvRB(KwY;pjBhX z#uztiFoI5;HEJO4RUC^IdUXj!1{A^luyD}-Ecuei2wxaQEu`-c<(skNOej&y9!>~k z(MnXx$bn#S_;}$krZBA8X<;2yAwY{OrpRWV6WP>we-TjJrPCxyAH#jbeK$ka{CU}? z!x-O{|Buu`TKer`$~^sC9FQ|;7o%#rgDnHSkYoJ>^ln%PnKb~We!YKygC4Umdw*nt zjdDAnLt`7+xDBJVUS?Qzx`y~px+n)C|$UA7ZeLUbogksdJwq815CokM2tm1ks^XDTJVu45`k5U z`jQ-qW28l)e5@hW@gSFQJZ<;spR}^EwUw0~+V|wsQ#xpw&m9z1w}HyNUkF;6BYGx5p!-{S`m`t3dn=C?*=+ZrfcwiGCKP}@SGd)4jg zg5nL0jYR8<$rtPj--;_Q&g0d$=Lu8G4V($RsSwCAtJo7^Q9U&>foZWeI2P4LN!wUF zkNh9=^r(zkwF(J9hd6wR`G_w`fUiU`1ia?Wofl+Rv7~?n435W{!JABr;bcG<0`HT}$>D zAnapcGwnXI72Sum;zl`j>Xi8Vr)PW9OFi1eqN@dZWnVQ%^aaq>dSXA(0*0~xam4V^ zBgz~E%qZ+8Tjoq0nT??o5#@>&5G^2DKwAs+@7@;9{l=>Wwdj8sc}mejPWU#GfUJm! z2yEQA5d>h#7Xp(gRFOQds4W3kB!|E%^6H|EKqp1u6^+%qcW#0&m1NDmqpp^pAm879&SC< z5+TWEfvWwB!Ro7){q!@Hv?nEF5jaj92Dkss#F}%I7c(4ZSIlCY{8X;OfAVOo3p$Vc zpXJYGMG==#nAokP$UZJ_8u3`PfM@~H0-^=dj0McjpFW0ReRTHQ)$c^Ve!-{A*^qJ({z|+&wzS=)y4Ep9>`x%b^Mt1AJ&`%N9V>EINc3* zuY_RtVIO#{n}Xim2BClV0fG^f@A9FB1fm&J3dwBo*-)K@mR@~%PDc5RmYHxfBvj`t zI)0yS|EakzfEmnl6AxE7o;?2!6v)Qu68HQ%w(PpkA{0BoMjD1Fqb7D9I)QG^NrRkZ zTWNn}68{$Ww_Zjd@!g{kT68aqa^_zUdHgC42mI1bpoJZ*`W0t>Ln5f9so~5lYoXto zc_`?;1oM4wGH*RaB@$N;M=ChMLeeIV!9=&3C}^hOv{;pC>lka}Yh@()6V? znDVsdqctwAM~$V>eM{?jV_F*%Ggbzh0{r8+PJ=PFYjZ&|1vb<{(sQ_ zkm@Kj+z-3XMdFi&SE702I{5G5U8SuFSR!653M(XzEb_ME7jZXk+)(?YNI&ERKG8-1 z7lBn&M;m#4DFU=e8S(<7v8f#&*R51Z1t+Kv$)_K0V=A=3A)RQm$Wt)IRin_Tk#27I z_oOUvpjMH%XE^3}3ejA{Fl^}83K<0V9o>7foA$qFhXR99FS|XO+d6Y$hKh6|J}qM? z6mGcZ_!cyC{7Wl!C>`S9seQ3z=PYy`(-|KBOa*~d>HsbIK{92@gsSzcV8q)uWvph{ig!wv&au#A01R%%$(kPDTG#5u+Tt;Hy(Uq7tyfzAEF;&+=JTF>6v_Lwv0EKPQde@i=t=s8kvRFh5XlntpkOyIk zv+`&wDLL(9BXMBDBKTqih9^gk*jKcGXaO}A=z6PGOU-=&)Ckkyv@pY*Z1d<{OVN>S zRvkQX(yKYjDDf)bdlj>_#=mC|@rOx1>1~d#KZFD<(VHOh=;8~3V+2$QWfJ(bi8+GB zd$3KGzo9&>}1%Tr0K z!HJ-W+<^35u3o;*iEPxwL1WQ}PaVeG#U5zWw>4awcL$+U`Y7ba)n{TaTt9mQqvj4k z`?g&$!exv~(G+{QcGC(>a380#ovtT&R(D(TKTs~4oyKCyz1A2~uQ__Zh(h?INJKw>foCtjNF3fWA(wSQ6ewr~o07ID zk~gz5Nn*Wd0nq}#i3KQ3fM4hRCQ}xtnMN(3$+M8zC^wfhI=ytLwpm$>y>L}Q`jd1x zS0z)@hDle62(db~E%5n1R!?C0nn0sB7ljAvdCv&Q6bce+R;Yt zU78f?L-CBlS7hY!MPQhnogEhkNr2Xf5hJ8=l$yxZM;p?OcX6BApW-=H$Jps(OnDg; zYgWOoBIl+>*#R^v1scOA>MDFRYOH;u_5S(v`!vY4f8e9+SBUFtMlCSh@gqUtzp5gm~dklc0Jq1d4K6T z_k#gDHI6x)x!eOcLN8(Jn#l$OwD@_L=QhV6&w(gYrz8eWb_IDhDJleHm9(+Lp1ny~ z*cG)`R(JK|W%x#{!?4SJFyZ1Lj=7)rq@zAp^`D3dOrPvYpdK~Qluxw zMKECquS zxJqqIw(bJgRmYiJ#Sa}xr3h-++)oNgl=!*xbCn}zQ%ImCA;=;UwI7T)WbyDW68n#2 z1Z6RT!L;1f>i*zKtB4fs1EO#2Otew^t+=M_9u%s?jdv6ar1~e^$J&xg2}N@Ia`%^7 zc^c3A2Oj!QV-{s&)QU!}l{uKLL{jFTJ! zT6R75<$xCgU{-}K0Rb|a7GiXN^YJCB*Q~C#%i{G5@HqND2QFz#lBHI-k_HsM*s^C! zl&)QZ1GAJgL-VF>a3mlx4p><`VLf@tk*&yPea?5pf}5Tkctt5F6_qcspS7~BA{kUi zsU+`){D;=Aqf!QZjeC#qyNrgtK1(ZTF8fc`W5F6UZTy!=oTcny8Fl@j;$B1a>yYluD<`0^H z(YwMV{jwl$j?CK0khJD>>)1nw`!^P^&TU4w7V{EqlqoyRv#R+jN$i|vFpFV?=r#^p;~cK2tII=O{6k9*D3^4 z#!Xvo&>F-?`C(pNC2w9oze4B(_CLciCvs<1{?AFL3!6%vXo0H^XJE)L4#z%7KLro!@f(mez3MF33^CRjY5Fd&`I8C*Q!0Xt~!9t zyVs$cOJ`6RoIZ*sKox;8r=yN@;7pe@%{fmabz@VwVRgH@GU1Vm`Vd#v-ox9`ePlPi z@nk6)M_HXyM<Uhf z1HC%CVdcU#Xwz$q;elAwqUhs)6!CvIX8c)+W%6!5pI*+ zu>jp0REz<9rI*L_{h{xa2)uHaMf{_s1=Ku!E0e}Ti7xEHP=5v}*!RZn;M45E^(xyg zBPQ4z&mKm9_9M+Yxg^3WUUhxzooU^@a=BT0@soC{>&8*!gs0yn^IS8jM6 zJ&Ir4Sf>%Xt~VUm+2~!{vGL|dLHqYOxx^EF8DL=5VKk1*=(h~>JCtC37`O(Q%cx{bhY={N#=SB-ZKvZL%bz6x_}o; z9Z*8$H;H*L9r#DV{mAa2M`Vu{>|um~kTdJ18?Hh8sLDMa-IcB zC;A(mpv7nV_U%>9_|2O)SiO2Rs#K}Mg(A{hVqG2z{7g*zl=%YCg1BMBhTN7tOLmp| zq{PY5Lp`~Nbb44%$&wJZH6JhDe8q?%Q#r4f^;f6%0uBuQl zK&UVt9+rJ+>X5Q*|2}r#jt2k2DelQ>%v*7v0dAvl(5nlY%IIg0v0hU#-=4Wxu04d~ z&wp~#RQ@5r$IF)iNbEs;>L5(*WCtrw3E_MdaREI=XwmMn{6X1^!g;tW##^!xU);v^ z|GudlTJgyk+}L}7i8)Za+0=Xpjq!R6= z9!yOzYh(w({V1_V|1KEKz3h93x1adCSc$A8)%7snqnF(GVgNR;>&U)?_u;+#v;>6I zao(nuXyRO-$-0T{m!jlA>K_QZbOFaHywIT}awgGDuHthz_IOQ)Mk`{dFy?majpp9*t3 z-JvoAmG0uwWA$MP;6tQXSXIwvCFLH(6Xza(V+b0{c%ImxsiR#|E+O+Gs8!!appa&} zp79=nhH-Cj>&ydIp-3rKZC(j|$2SplP`_(htPPH_ix}_U2Bj3-CT0b#QCGbfNsCxS zh1}+lK&K9MP$kKQFh`YUjaWRJwxt|ul}v8xH6bdiNH@T=U{!SQK!~X#G>26yATUum z6H`fyNYq^PQRLEOmKVipXn#}Cm{vo&V?afDn`DG_{l@4?=;`Tuxci#&QRzBwc9U1E z$z-uF|AAYwv4=cjXIUG~DyqS?DDKjIBHFWUo#mTEg%N?dTsh~$izP@6r%)#hPvVOfvbpo_8;sURRxh(>7x+R z;$qv6LtY4hAtZ(n8DUZ9PDCu~>S7Mbwdh{x9n^1LPbgaD{_E$jasJo^Y+tzphx`uV z*?-!_wcopTAJ@;`P&h`ha>Y=M*>U^PElJMXcd3P|A?H9YWttRX=O>$GGt16>4ze4E z4Gni;Y?;X%nw8u%lB7rLb}g}T(<02DvJ%UeFIR{p5xP~kZc8o(kcAs$$?|B(ulh2!+xnV9W!A76hw!SN+~5h86} z6!nKpz@nY&;eT`^Hg27P3H=)&ah35Ek-nR;CsW zI7alN0K4HEA?{TaZqhnhK`J3>BZWJbs9+-xGAL}QT_umM+1jB}kxUBunxSBk!pyBk z_d@LO2d_qhOUeBq1j~dZSZc+-!`%x6wArGmT>*u*H7!yKP1zgr;}L3wB{s0Nfo2g zKxBKo@|Q>`*eFt}-aJA;}SvnmZTQxz}ESa?vq@*>uW$io| zhy|-QV^IIGpqMdLh2r22?>~k)bG*=PP;2yRKLnE|xhn)URLN0xjsTaxEL(Ehm$F}Q z@55bu{;B@W3$dt^TN7Vq+;PX}*iUdM)C|=vYJudgKePgF(*|fnn)T$~6Kwh09~T2; zQoOlFcX@L0*2?ZB`Kbf+X$POUWrK2ccc1yhvQ&+o5VBNBq_PFcuG9 zjQvl(vc9*mZOb)Atko0+O;XM{7Wpi>Saupwn}^r*@|#b<0d4f~POe@AC@6bz)vxyz z_QfuWznV1akaAZ@9O-wo0Fh}?j4a)c6o07AcQd*6A~!AiPE@K?iHng}Uo=Dq3e!!PI&5@_pqS4j0ShjHPTv4)F5bzx~9Ya|=c z(q=|tTR=#>MXZ~tO_-3JYeHbtwNnoe5FEmJQPG2aa)^q^yM<)bY26oB?moq)RR`4q zTD<-Qw9WCF#WBVcX%&$v>5DO*AA>$Qk0TbJ*f3usVRe#y8k<*cDIGU%rC8u!gl70mpWYu{Lluw-J~{<>75rUL%Q;$cu{r zt=dg%qg=JJi6`Xt%yXN=-nll0Uv*8w>R!En6>Q&|)N@Ntg!C}E9#~RAk{u!Qdyn@0 zaA5BtwSX2c!@;pW_W1`P*2Dt&>>RoHK)UC2Ep)Gww^u9I(b&9)fm#z+ih!1`#x&M` zuWw?{vI|n}veoU4g+cz<>@yyN2ls&Mh+&wueFOIU^hZsi{P-Mz1rz-k(+8C@=s3Bz z9H7OWV1F_qPo?GZeM+0MqC1eqB$^f|3+F-8 zS&SiLqTaa>yVp(T7`3^=rs6M`yb+UZoE8M!UVqkxeu?F^JKn-hb(;w@}Y zS-~4DH3NS8h!0SBXJQ;}FANc=6yK zBiRCqH>rY3VrZf2OJJb0fXXhyxd{-+##g0+Ysht4#^0=<*O)K`ik_tpDIx;)z@-HA-M$Am_a}7q%AB8&2>^agc>p!f~abU+J@>NwF z+d=;YfcE_pfHqZa?d#O0$mk>`N3m>Lg&iglkcR-bn<1ebAV%QphV21p)nouxEb*5i@zPc=vAr=`fDw^CU~~<9Vwdbq zF?u#jTUa_5G6>Z*%ZZ{+-7#@mQ`wi7Wg4S(BP$i_+f1-(+yw3UwdCiA2o2X})hJX# z+)u6r=%L=#)s_2=))%P2Gk#Ncmz4CjNvM<5{NB}P{) zn#6-BF7hD)A~Y7L$A;>417dLh#yvKsijY1nG>Qv9k9mv<9rkWGv8opu^9=dCjJR+F zzf$l7$DddF`C4H}B-cD95|_?CWnr>SQPhII=E%w@v&$%4x_%n}uq+Nf z+qR=}`7&r)za|(d3~E;`k58Y!;%?|;{ECam$>1ya`7;(x9UO7_MkHD_?t~$3lasA0 z&lpdD*37>r;{2sxc+Xv+6G*13GXI`9C=+f-o>}rGJ_e{>ySjX}%yG>77%UpM803jn zvvCcXb6=S)sWj{4BvY^GfIPEyuieAR(Zm~!IJCY5e?zvCS!Bfh@7ELL%UM9HutOOE zIv()X(wPAUbG_yzJDim65#rRc%2yU6r}c-mO$kh#y#n_hhGF!;p2%Qog7T${BS-eE zxOn|87#$Hp9);sb;2HGk)&+I!8)N;leJOfR>1aBxTL!bwhz|K59^HA17yrfJ?c3a_ zI-?c~Pyc~;kK&NMcovu?&7PZ_A=5$M?}&O3idT}EWNX<34yBa&*=IvBM+Y>_9)N!( zF60)D`~H`jh{oXp#7hk%S$qVmK8jx zpj4knII!!c7D9QxF$>geP&#QC81pU)VsC-Dck2;P5%HEIeNrJm3rbe3$hf=MHQ03? zH&k0HD-K*D=_6(S9CN}Zm}3F-NDY}s|6jb0g@8E=J-Ul^(Oe8{R* z)yj;dIHR;aVdp2JF9g7kQZM2K?mT5rom!OWT_+KkKm#GnIK?63+-vU6JSF$RM~~n(5um5%?Z%B8THFN*O-)S`?$oADn{o?= zuV24n>(;I5{-J@u0t!X+nz0&D58rVQ{tfE(LX`>~aPxK?!X9Vl_8Zmf&7BK4cm?Cf z%!O-*fjD?_hr$$lS{q-|fhUXq@aY|#+BDD`S-d)Zh^U;1)A?{iYTvv_J1%viMV5ln z?q8pOL;iy7g@}ss=uQ~g4{*kejnhG)fWi{-D1tk*EKDygRF~j?&v6Y}_H3!dGc0NU z;+acGD~Z^h2;G<0^+Btq9kmKOlnT*dM^n;w9Yk|o&IAX6fHIFsix7C|3Laj23c5EN z)ak|Dt8~wnuyq36!xM%t;_m5Lo-7S!GnT%V-Rs6)GGzUN7ne_BWj9}V_6Wq5dDjuR z;}Nb0K0`DEu`-xOBba$Ddn~+#kncv|`EFDO{f_s~-$^yfTdE-Ps=%mBENxI$`gP6; zn<9B+y|tv0ggZH5RffNh-r`ZzhXlSThFckdFfk*2014;Xror@r)XZwNq( zbfNTd6wXPTI?fqQbr;*EZwrt|AKfqHEl8n&1U%`x5I8|ESw%og-G+JE7q$Mh zXQ0J>crWsU&+XR&{;AJ+cw`G^u3$ibr9IkI&8xYUBNDugH1D9erD@TcaO=tz#4mQD z{gBl%`f>bFUbE4j7dSAGCTQj=%-j)zXvzAElec6QBgSVy zguRCH6sxU8Ed%ZvIiU~BHWxH=CWfrKfQKA##9Y*$T)+bNnF;!6EYXZTu;gK_8A!pv ztIIEcN_vvKE7;&Q9ggH(q;X-{@a&zjoUXxzMQG)|J5eU%kh;8f0b0!r)>xW;8^W-;NjYJ2HN(2>D>0oT<=wY9{ zwkQ;kfF;^!pX!7_K%*uOoa(0ngY-HD3i;dWyB)-{L}c-k+^6UjEK{T`5vG#|6CZ9! zZTL)y%W5)mX_hImnpr)TwYH3+?lN^%>sLXa3B8kmSk&mw#XDTv!o>^A^pQUx4=>`( zq9X6%CEr$fT)tQZ6nS0}+Zr6koB7N7CgkCrYRr|!l zwdeR2G;{n*+Kj>wc~3+Ber?sR1y?7$p3)9RyknO26T-I~z`P;%aO=L3mtUVh;^o_) zc;|Z-D~FxMH4)1aT+#1{dC9-bvO;-lx$r_kOKz8CMYgF)(Fjz`VUs_HmM`AE;?oZ$ z*C|1$_*a1i=%HVeLYd<{JUsBER6IgD)rAxxL~lS*LRoTGwDRl7V=7KjbI=AjnbWC|mHTD0FA--nNfd&CF4|HM{8 z1=L&{b`9E27zOum7Jr&VW(l~=oq&R?=D|DRjlaxr20t(@ie4;LTG$}cZ7JHbO}cd(`>{lp{M_P~jAI9hwY!jXYvxVnU?Ec}4_H!bnibGB#a_w|uHU?Z6ahN{cwB#n7t`0YE z-i)|7)sK8ckkz9{4=!aAy<*cxAvwIP=NHc~k?caJ(?W;>xyl?n@h=ET&}Sjp6Wqt4 zR?XTNHlZKRT?)dwl|C}alRn2I)^u`XQdWp5J>T>E$W~Z`-(w|02(9AT;B8A4QPL`* zn%umoP<*1in^!^$#eXer3gG(jr16r3OcHW;_3~A{Un|mt5T}Xm6FAgqMDIx$GIVgV z;|vwekVjE@R8>)%G+UP;9zQ}ZV*P^Gig?hZ(~5ul0nwil4&!g!h5zP1P}a>B*}m#2 zC#7_xw7z4Cj2YFev(ow$)2RN09w{sI#7^#46uTvo11YnTSZ|CL;1MlCp9s++WRwst zUC~%_7o_jPty{N1C@&x1XpD0gbxOMy(Cm3x(fkN3n!g-ZH_pQR4#HRY>;Zb}9GnQA zhdFgEG<;peVnwD*$0DhmX9$f>COc*J;^?!4^b;`E(>ypvZpOqNJQ;mTXv6oN9c8*s z#I>V~v3^KxfkkR#{KCb!dTgSW@&qDu+RX^7x_xmlc$Gk({BU3d9Vd1VNB3gd%#C@W z6>N-ujGTzS(1wJ?jNz}&ac6%KqedsnRA z>5UcL%7cqcwakg!>IfhBzIyy5-RAhN#fh~e;KIAzGx;1F{zgAsThb9Vlf(t;r~v<6 zStlHeuGM7hJGvYj2e3HV1`U~wSe)j8TL@E)U&tzvtBPEjQGwj9jEqILHOu6XoOuh} zyja$So(?5bkak0EBI)>$7Ri*7P*EXLtgc(V~Td)M-a_JWTCe~QY*Cynfl;*9)Wz+O{|=B0%1}Tu#P38}xC4w!N4jU|{-I4- zF&X9N62Hh}xU%zNy=Vc$Sm5PJxKzTGP&uL#Ddy3e`(v&SVxJt!ED{`H5}u^~bnbgHheCF4inx zFB1bP-&UJrij|u*do=D`4OQ7~pnD&*9Mp_URj9I|l9QD3kY|gpP`iSXR?O4s{U`8g z4Yys}s+D&Z2_>+Mh|uIq(228L948S@=?fI%ncp32wZy8GtMw*VUUxbs;IvdV8?2eP z+2Hq@qVWw~m(lbdHa0$q^B>qqrOUz9uQ6&d^dn=IFl=vp6oIb_p+%50S}?rOEZaL= zpS26C{RzR!gF1UVqlb;=i-7KKvgtCntl4Ae=_!=|@Y*vh8Mqg@YJR}OH@C3n@N9+c zG_QPt6T=5$6vx zsus2^JAiIOTWZzMm>N4cI7nHF>0zI|u*d^NR}U6_&rSFn{=2g7>)WQkt30~5mo8n( zO@Hy?#oWEF&K9(WrFAL~_EOv}-IHPwEnp}MXufhVlm?>QbZCKJh(6+tLj88LP_$Ke zFu8`D7Y}19zj_4$Z01%i%b=uq7p9SWAPygIUuF#R`Qfy%1swDWV)blo%OaC>^94vF z=F?KmCQX`10WBiP8ai|+w?HtK1+$jZNfXV<18B#dZ3YJ#h?uEn&6*hFK7u1`(if1% zg-oglH`Lcf2)Po%iRw78BkDA>S1OjkF9Nl+4L4LOP;#Pr&8plUh3zF5fF$oWx1oJG zg0A^fR_dKJOVM1?b+{o-IOY>x5unA2*C;zFvyTuh^U@T7?mr`jhwHPkj5T zjeD{piDI2-0mEB>JfkU$iXPPI!CjwT(uUVw96_{zb{3%foxEcR+#4C&?p==Q`82uduz4`Tg{Pt0@9v(fDa8+)!vQUG{&4f5cle=9;CX zm}dBachO%ZXH8+IqOB4UVs#p|z?n-YxRkr(<)lmaQff|{bS5B+yiJT1#3J4JRFI^v zSVRjX#{#r2B>;vzLy=EkNNZSXBZd_Utz>|G&%h@8ej{H1`hR9( zV#008tZ8~HBotr2k=wUeL<{K80;WalV8Srs8zb_3R}`|T4wFK(HALwyi{Sf$2+KV& zwXW{GF8b3}l%(7OUvO=e8+Yw8R2~Aa3xLDap6FC8lkzTlJQM!EC|KL5POGNJ;ZjW$ zEtF~T@bu|Zy>nxw+N9FRz&zPFr3*}nLf{OM#S>@K>5Bnq(WV)Q%So4_t;f%Yw;y#G z20X!g?WVPnzaUE!tEBw+_CpGO{ZXc9PqxR{Y@`*m?Fner8TO6O)W__!fEv`?g3};j`vNVVjIe z8;UjQ(gLsEyx>CiPMiB4221 zL!j6drf$8uA@p&$XbRB+`n3Sdq}AAc9zu7{kxLk$ny_5IN{G^uZ-LAxWLs1sh9wAC zvJhL{?2-`8Cx0Bp60Y95hr-3nC_b5vYH1;03~y3N51w!_dltixVjJUSqfkT24w#aK zCyTF8t}7NIP;2g0&;nATB*yptk)4JS7=*xr|n=~tm3c0vmY25_rUH`w# zq6_^-z5pq5IX&Y&3_K3SdeP#7wzTFBXJFHa;*)6sLaZqB0j2XK(p3u!3l8NXw2M$L zy5H!&Gp=$M_dHxNwO%t+T73tJOBUnOQq)Fw3z*e)aKzTV$57d>wC+;Go}vX5S|B@0 z)pf#H+WuD9K&&)+3uJ&*b9cl?xu>|MZ{K~u?pn*2FNeKvUCjO46aSt#s1;*8AvHwArAe_c zvBtT_cUe=_=#;!Ha+~s9=*Ly7bGwRo7%A;;p4(iyuj$T9#3z5rJA$rcBZ2Fb0st0Ifmp7*b_3cGMC> zgA8EcR1;~|s*N+|&zp;W-P)p5u_CFah&Zrl0nq}Y1%wtj6c~&dQzjVRXIVI?xNj5| zaC$SC<7ol`Jf;47^YJA#bpa|u^draN-@7HQizW^ zq!fqgz5L8j5*?O)$ItQSaQdp6D35{#P;F*2bS}YS*uSR_%jnnX>?7{&+=zP`n?~FA z34%#ye$#j;v7u-I(E`7v1;|5-7~-jvE?pX-p`n;Mbt+yz!)G>-1Jf1CwXCX7W z;iD0{ttSR{J%J$Z%wZfj9ft3*mWmA)d8R$94gqMo7! z(zyj5K8eJ_HCxcL@4$3EQ{$Q*ks|OU1oxiYG%n=~tPPPWrF86}a7skxbYSlxj@(HT z#`xob$KY72rN-VyBtQ0hEM7l8wHT$`3XTdHmQGAhA||Nrb=2UrtX7d;dU zHV{PxRBYIA?P4#8-L;`uSFEcm;@bQA3-<21_OgniSg?1j*s)++#f}xRqFBI!@Xwtv zF$w7;Atdj8PBQb#efOP-AvwACJm;cZev%gD@YbWKT(X+dkwn}Pfk#B1qC#y=+SEhb zr*|-<^1D2L%pvDcyzV3mB<1`C-IjI0kV&OcrM8XC7X}Mhm(GW>0~_FvP3_UAqAfC+ z2#F=efSo8spp5G;{PuvfMIhz5v%(Ny2pB&Cg7Q0&Sd?bCX3ZMhzI|IN?T{k3j4LA0 zkrQm51;1`TX{)a{pMcv{UAiRQMELqYFsg1Q@#kOubFjx~3=9g#O$s)aD5*rSQjK>) zzG17dZ)Z*b>MG{VScod_m1MhN&*2b^`O`mDy|Rkt&0FKz+3WE1 zYN)K6xQ(_r+_qvne_f$gd2zj}lmEj16L*PR(Z4Nt?O6`<(NMs(7 zdK6VBStt@}+O+9>`smD=|4QN;YrA9e|Z}0$$xs zz&9=i$hx2{95P#`r)zBPbVi^oM{0HTQ%#Vkvzu&sh5$n#1p!K9CBo|3wQKyAhosLY z?2th9q?tv}qzq5mS)>%NcU5?G?@rP?#J%{TxOdV;Z13fP_Uk^U?h`f(OSof2*fvD0 z^g?-gf4ZI=!rn?)7_!jJO3``&<~*YA~91Y=T^NiZ!ul zTx3Kf+P3l*OelSB*0=?)H71#ANXqYheS0AG!)spoU6$lhYEVy&=9FTn2*MwUHpo-V zMo}}XmqH*9YWc6ivGIn}60@+$1uH2Z^n39-mW!<9zUWe+FT+Ojg_rjz<3C7>aO*Yt zZTW^4T$D@t=mKQ?+msdh0;=@r0Hm97Y7<_{=77vm}zKBf2%+k1(!p;_8K%(ys}p zzm-EgQhXA&7<0uJvM2knW7}oKRBs4J*(ULI5uOTeGZK{Fw_UFn9U_K6>f=g>Y1L zs|`)X>xnEYT+oFloXS=yqtf@=S8wx#)^CHmsq9M~YBZ`Lj^-NKaTGtsXLxtC>)jTa zvu0LkgQCEe`Y%Vs@!JafNH!3eH*$(EpLR&(l`)9EOZq3An`*kDwaq6yKKueNzX&T$ z!*kYLDB3tbawiy$$Vr2@Du$+Y4OYlzZ;xy$X3>3fTK!hvqm$uBFl6FJegLJBNRlw> zTVXvFAwYOCOckNS>NPX#$H znLAV&YcLWEx|IA$5G92pbj6jFh^RX7?o*E=vB*evI5q5vmc==8iI)z2iknZkjj7}j zS=7D3SWH|p8vbQ$krW+>zeo6CcuKTZ;`YlpJ*^?U#cT@=_*rb9O~T+t|6pAV)p2Cn z^i>G^;}|)kuL}UpYT&N_n2q}6Y`cIvO2HY>7L2FlH&|kCByK`$^D85J`?X)n= z`VO$gGXxj{3K57;NI=x%Xq=0?KDCg@wthVaYUN(vHrxl&Wm7PA;b^7g5*hD3x|c?C5IMHu$TEa(IRqD17f@=V zveZJs`2OGn=s#ePGGfkY?$xYvV*!ZFBT{e2?rr!ta7DU{z6)!TeKyu~L;vK7vaV`= zZIS!}=cgUS5nXJ6?%;;LjS3()49Bi$zG5{-koy^Y32Lm8bun@TD4anEX<*@SMt-x5 z*gZ*Bi-fZ%{7RidOav8y-J;i`Y)BX1!N3pJ-4|iq^xxr~Ln3+5(i6Rpd`EA2zE~GW z(HdER2ddN_Tf%$BD4x|KGnUT3p>OZ?n6v39c(O{KZK3YTHjL}C1wnkrln}8|)fuZL z;G^cVT+&dW_~`|B>claezj+s%_n%hNB(M8(a`O=#BWnL?Vj zgcZc46A`G@w5CR5)#>b9)LA1&Ec#(IPVPR1Lz^`Fj8W083RZ_K=C(tu!7INT3lk|| z#BvS=B-k@UfFWQg1c*oo2oMFUun;&yp>A69XiH)VD9Dmo6snb8WR`XJxtKeq5B@A` zE4ZilnafQ)yEp__EaUO%^b(BOq>9AiOgWZEgVK_k3f9P$OU*FbuwVpI?R&Sd`|uWY@9&MkC7a|b#!C#5dphBdY3MkhC0t4t z29Z$dRla@shFL@AVEl+FYOA+PD!-H8lm41!G@*5pIGSqCq2wCbIYWRUzz|>vm<|H8 zRU!SbNrG9LL}ke$AW3YIVmuLB`YZi0F?tdFoj7{q<56s#&>h|jM6pqcL2IzQj5|C_ z*Gb7Kl<|Tivd#wwV9BVEl-xg=c2$?z?BS5zQdKYY+7B&3z>(Hy&?K*V{aG&_0i~oC z!-yfk5MT%}1k48k`miB<;K-9u)_fK&u~K8qJ(O?{SO2?&-kk>G+^_{&dbCt)9$Dr0d5dNu^iU`&R#AWJMYSf< zK__F)Gt|M-kZe%^)yFkM5g7q3Yuj)55PlvTIc42sWP)9rlBirUKMLi^g3LdDAUQr3 zFYY|Vsf}+D_dN?7$F;zat_6`ZL1t5QT{xKzHZ0OSXCmTbd5#MNwZQhD1V0io}p~ieOGpbePAb z!&^5)qq#(E-9Y5H0qB@JIJHQXvTY7^>XZ^=4JKeiha(u_caBR@j6m4*AcWK!ES(yu zWVop}sUyb5NG(%;6|nU&1Q-Gg0W}dILQ6>y&_0T%T1kk{*R&`bLh>%47?- zg{{%AmMt>LWNlcqbVuVhr?F(fb==|fw^lfHz)-HArIKyc)p~)LM5nhn>puWPwniIl zHH9VwV()-52HWnieT%Nxwm;Zl>tho!1Q-J9AwWbEkxmsVRDcj&rQS&Sy#%FrA|vQ? zB@t%o5EJsPX;5of9-jVlG3&e!MxCau4LLGvz*r2dw4U3d&@RPLB0d})o3gc`sLHzg zER3mO39HOC(PLm%T=uDj4jW|tfN9`{%C3$BF)`>bbaiTltQS1cp0->a76PywJ|u z<)?bRN<*gGLD^0O!m4!?8z-1!&kO;E07HNwz!1pT2y|-Kjo;?b*j91u=rOn!bQ7o5 zwQAQAhjvjqC_sww8`f>q$mI!s0VwWRhTB?j87Sq?P=!dWJK^`SZ0cH->4ikzb?@FC zlm8im*?%oTP*9L~jJvx#PwY|DmN6A`Ofk%q>?_ z%5##j5C}4LMdfuecMfk1nB$EGVq^OdGG+}zJ_%95Kk)h8J1!zBr8M~$hXY4q^6=sC zA5;rPlOEtRGeb8lP(KIW!0}=AJ?v36O&rHv@hS5HF8v+ zh1pXJ{%j7Lje(0UriiXvA$#uJa1>hqJA;thaiXh_VF;b(k9p$X%Hr|v{bz{&x(Nex z`7GmWOd$N13V!Nxo{VRU-oq>`Ecio__bkm&5i+cvA;1t|2#63^(buOUiv`fvtHD2+ z+knBy3$aC%dwA$bC}?XyV<;51bm`_94D%Z;*Bw%fr|_j=V+Nt7M`bLWxk@eHm)x3< z9~M85vvPJU3i}71xtpMF(>ikJNK0i@WE9q(4n(#}S$Q+3;*Xg> zxI^yZxpDWNbBtK&pG=tCerc&Jh{`^F(0fq;R>yGj{S$=6zg2=ig>bQ=6ahp2{Zi@( zYh(y81Q-Ggf%HXyeww47(&)&ZHGBFxlg_hK?%|%pA?fVJ&*>@WFi)<0O3A4z?v=1_ zS19V&XpF7{T4Uz)*-FE;4!qopORvs|C$Y(&6=#!AVRFBzh>W-;u20KJ^uuVZp1B4a z?`}XgR}qOt_Cg-4#p7>}Q<;^e&rh0&b^MiUsDq@))sGYI%Z1sIxx?QtZ*n<3U1}g80;up zI43O36Ks=QH4z3B)<6dffiuZltn)<)B1J?p>8sFZOH!JD{P?i}!?d{7$jLd}vEmr6 z)1M~GYVcaL7oq=f|6jxlcZ9>xrI>s=8sBgEqDe}9;`;4a{!G8x43-6lVf4h}q8Vcr zW9mPrf967p{mTF+6^i!Y^e~H{c_WVw26oqii%*sR^O=DiVbd`L7y=9dhJf)PuxZ9g zTt4&wLzlNR9;XcG2}MIy@hA- z1D}71!`WBI#q-dKOU~k$S!toTPEz@O){HrzC^>aX{f2eW*{eG!LM^?EpPwJ^!lFfs z(%Th-&TpOl1Fp~7f<=K6`yV=RL|5f}D45JC?PlRVYJPo-M-lJw=Iu|{ELzmXxY-rq z9IyUI(Qf^{ej4D;HZ0#Rb#17NyAjd&`;Q&4b&tc{H`lOg-xNblogwFObE*Na=AE(q zfJpT3`0?XB`H~?QW28Jbj7VSMFfj%57-a%oAPO^}_T&7Vs&8@fPv8_u&>^e|aGu`#RwT zAEA}`bynU_TH}O2XJ|}FQL5pAqkA+SCw4?fCuW;s$l;fmkP~h`l~6JC9InQs0Q&k9 zUWamrB76%JL=!(ZjYup-rdYk%BG7V^*Rynr1u$F8*}_c_ft@>d@~a}jD}5Is6M#qx zBDm<96^1}s5wJ|F0XCi?zz|>vFa%5k0s3WEP+*LVx@sDWO2aCC_ZeUmX@^1@o2F4> zM9k6FfJ79HoZ`!G8A!wn6_?B|m{@rxPh|1e9KqGYwIAOmJkWeIM$E(WyYJxFb_{ZV zD}d_p|l01*_9*E6~8WP zj@J3vZ>#C|T1mvG4__20oax7_GOoX1;>3yk!M@1q2V-WHA)qb-0+D4XJu6`zVP19p zWc|z&fv~VJ@h%sN5MZAm6d}Xv83GIeh5$prtP${N)BtZszv82m#3WMgyl2*=V=REM zb)L32hKQm@jT)h^Zx1Q4c%En~F$C4})q+FT{Ge+^g*3Y8NJ}Z3%?&+D`QmfpCp62| z3e(0qoqP`3A4wYd}nW z|BN>;KO#OZ8j;73;%KE&*fXFEtPHe}vK*<^)ldFL5C(FAO~Vji2&5oDqyeQHR;*aj zAec}J85JV6^d&yePrx3`1_4HDna!f`cO>+*{?F04uzM%g{1bwck5jgj)N-mqY2&6fp7nJs_ag!K z<(Ue7dA75&Y?;tBM7e?a!_akHDkR*N&xQEP&w`Z1@@dlP4N}QZ^$)fFY0(5oqe!oDU-s z^7Rb8hD#SN^HWmjSXv7)b+mOLu`lblt>U*7H1rmM8`f>)#l38EfDXoNnd)8E&AN!$qGG7A3;~7!Lx3S*_6P_B5)l>YA&hkBNGKmBCJ0gK;)W2}BB>a!jS{=2 zeh?8j!1oVc-CiH_(V9rSD!uXz%{|Xh^7UYq^$XraT*u)pw{iLK2YmQ0v}Quiro~XL zWqEkkD}dbJ8M7rIquz5OULD?uNt^Df*Ii++La5fE0qWPPh$?km43=l8&>hyGGX#j7 zkR&L~E(Ff1n|EUt3!w4qNeF*2G^r(!t@N5T^xPVQ#0D5W0xVq1=x-5okRiYjU6Y%#+KDi~&E+Rq~79ujGh9%awr5Kx4eu8X8%{N#Ve@QU&JQdOrd6Ki@@ z#*^rWII;VZ-nJwp@hZwaG;|Si4k<#++>3SQH@N(F2qyKsfUy0Ngcc$59UnvQ;Mkwr zF+JcCB2A9dq6O*kNP33TK_~Db+BqBl>+24YMBX=8y3|0MPPI|q*+#!UOW~2?ID66?0)c^nEc#7v=w@ug zL>#?;|31|sB#BRf+)C9cjTMqA@Ir2^WOUZwfBy}A&7DTq*>EFAfDu_neuJ2M3;~7! zLx3TWz6cPJwEfTq7&_IE2%xtgUZJXcRlNZ~D)B@v#eI6mZ!<`9>Z%Z4GpEny1-po3 zA^|TF^3qokQVk7wpDtbdw~JIP082L%-CgT!vA8~O4_5pehp$R+_z!&A5su~myNsyJ z+!l!@QfMXmJn$?M$4|Twp=H+&lmG6678RV4C%ZK_uLW#Mx}jcvYQBZg3(q(Tk@LqQ zGjio~f~$L7bPkw?P4n8o1ut=a?ozBuv87L+C2flwXO9d4hCq5DK+#Y{e99IgnA)~& zE4NLyuQu02Y7v=5&!0Yh;!P02M!rxz{h&(EtS|&LMS!IoYKj=^&k$e;Fa%5#0s2ru z2bJdKyK|51cMrlMz0wXT-LR@#ZBQhYJ_`{|!Rt0-@uDR>0hQM62FX{_Vtv3Q!dWt*lvF{QQviH`abeV3R*;VDIg8S*}{bVJdtu*wpP zD_b8Uj=!`(rlytA<4AAJT+j-CjBAQsV}C`zc|MpK)&@O%vU9OSRKDZ+>i=-VN_53n zu?GbR{6HM{#WR|3Er=RiR2C%*N)-z`6fVz^T2wCG#iMs}m_mzODA&mg9f&8tx(^{I zUP+LU{7Ah%v~ST>oYt=D%ZgqdVa6E(W{3ch1VVZI_%VMf5L&jjwtR$^(5}m8`oAua zX!7h*WEd+90a*m-^-7U@bSNr})KY{Dt7ix>1Q-Gg0fs;d0+h~X$h1R>ZlZL(mJy2 z@wdlV_jr}sa|;~}eV z9^**(Be52jbSHMj5MT(H8UjQZ5n&~-=$lL$GGvInX?cJ2Id}h2H#p4(77HL3d>vN$ zCr{L&H3g<9AC^SclnJddW=jEhtePRf5MT%}1Q-GW0+KmxLY+RJx9`}lb)c#pfY)Gm?>uo|aGfbfj!p<%% z1kTKEz8cFV1$ad)lA?Mw%&OHzGCWLj0DGNEqQTB35g<0y!^49=Bb3%b2pzZ zQi}0=cI-OW$OgFh6@XO#~RJWt#Vut%@PQ5MT&s zi~#*gHgV!a{&2`G`pTrS5fdIDY^4_yEmBa`*HS6x@ZPhV@M`C!@f4J+_xR%jsd3q? zv!jP=KdCx(F9gN--`e*@|Ixp}&(BZ1tC8tDV$Tq5R zEvXoPBK$C~7(Z>wbY5(Wh9BB>5`>K|if@^rAQDcpM83NQN<&n)NN!E3?ig+Qv2??q zs3m7AfHKWe$f@TKuth_BdKA0Pi&VBOsyo5eUb53qn;Gql zk}UOkSQRXRT4hN@D*^XHj^Ir6x773H%!gtnbMer{huy-%Pf4l!B!9r;{~n6qwX;FC z%oeHp=wU6Q3E87Q5s=*3g+;&V6X}d?TUOZ0P{fifq1L8N8&K31D+~c`5ipHU58AGt zjbjKf1Q-Gg0WkvfA(+G#>4;DGB(7&CKM|m`!_7N3{H)N!*@2^b(4ui0jVud#S+avV z6!$^dY;LmET3r)ab$Itle2o8qMeAn4v-+>ty<@M|%J1@=Ai|A^H`zjIh@=#+P9frr z(hkpEIHyi`t@^NZLuuF&zi`{;wJC;tnW#P)-;Z3w`lhQfdhi}Bn-+@IlMZ0bxFC%7 z*n{BBpHsHf%ZkDsTv6n!q;$NrU3Mjb0H>&5y?q5yMbu`D`Ewa|Uw)0Rk`Y)|4k+VM zLe%HwF>KlU2-4D6N%$NYhT!14qCO=HqCigeRX_q|cFGVic?2YhD?_9hN&+fLqDlH8 z*@vAo1k^=9v%g*!-cI9whh}>OsEaP^#}Hr$Fa$Cv0+g;Gh%Y{hxt~E-p!7A-=4wP!$3hh#Y8RE|cWAv{b z(W>Jj9De*Qr7PFRqYf(aS5LA3e={+C?K#|e@*1z7KgQL4LHJ+)ML7PMI@qA3hbx?| zQidAfsf_C{;D6;{s>U>!V<`%u=f1+Yhfm zc61{)LkkR>J%SUPbY?D5-LXLJd(0_ad6#ga|S|r_zU8P3A z+PO9cOm7btaZ>`Gp5a(28-b0oK-OP8(Z5G&QIF5puzBoIw5`z!^{RG4m*1CSe^iR< zmYpa1v~}g^EW?$u9FZlYvYP{ub^PzCb66~ZfnHz!$rBAUlW9&PFj~U1p;jquw^*S< z1(?H|f}wCV*LfJTWv+Lgt(zgh5MT%}1hhhcasu_0d#EX65*dF}YHL7YLB8cirb#qQ zup_DbzI^6-ELyZkto%;w8|59!Q;ZkJYx_+3hrVtjQVl18FcJz=RVeq6@*)o%302iq z<8~p8j>7d=kwzf#TW*x>+#XZ*H^*;-i=tdL8)V_TSR!kM0w~$N3fivef`Ca?QPx6w zEW1(%fvhOh+7~N>2cbo=6i%v8e&n+im@UqRMSj#7;tSu}`IQ(fjm~p=bD@w~mGsel z)9YA{ZRUPr~qIDb^EC<@fm{VdF)DIh?v6(W-iO=J;vlzT|?v%(Ni zh5)@zD2z{8D4(@51FVf9zz|>vFa#I^3;}5bXxqUBYo_rzc8<=&Q*U=-zx8$ak5@T(7cgH2Z_;?vsX2jyF`t4ryJI7#KrxseW!*|tulndU7rStaSKR(Zp`q-e5r#Jo>(h;qzS8?LR z38g->=q#o1uttUeLx3T`5MT&MBS29}lzX^t-8$)pG+tf0a7iOkCW>J4F5W|GR?5}$ zap@~nr|AXd8Fug9ohPv-{5eA{<#!^k&KZQtKS-8=JeT`PAj*6^ZdW^LST}O z@rj>t;)UuhCL4M-)JyK6rV(_KzO!?NfUXd*%3c6&jas62|LSm*6X|AUTMQlp#$)5v zy*O|r5L*wf!=CfIuxFhwywZWh($%_|9mNPx)SHmkNxQtT!Vpk~03$t>p~KoT0s@Bq zF(xBm!hBQ@fi`=7=f1?HiUm+_Fzdw-UX!3@^aIRlem2UfpI&Wj^0t);r_$B zK#@thDxpUYXe`hqB7J`0BDMnXIq@S#RQO+-+=;kwg^#kb&*gwU>yK#^WkqRzl#*C; zU2Q%p>db``m^*!eM#5n7oF`E*zcW2RWL7ro?0m#l{X8D>x=PhiG#MXR#-$zVDw0am zXgVo}%;dr<`4e6}iN%w9-%_?TRI>1_xlpume&kLtfoLrwU4m7%yeLv8uk=kYQeUN= zWLKIZK%`bcKmb3CBHtKkp(%o_KSO{akdY8zq*g|{Tg+F607HNwzz{GB1cbCh(w5Rh z!CjH_6cM%k&<2n`m8ON#@n%+Egh!tr!oku()8XR&6j4Q~lwM7`VaD{CVvQ_u2Q^Q+ z`E-H1yE}%D9SpDET42nd{-8Q-3$LTaX@P}22;zx4P1e|{9k&)8rW&#oL&bN|%H}hk z>kuZK1 z+M-XJLc~wmY;M{N1rc*ZKs|hVk0;eywQH%B9mzq0Sp3pO%lXvBa~IB}i6|p2u&R|b z*8`)pL(>1!75T{04JGgL&vT2+Kk(`F5zHI=6e%0&{cL1s41p8`9P;Ex{rdI!E85|V z6@~yqfFZyTUAh=ksq!))kPBTP7{Uz%% z)sRvQDJqIm^$b}^=$)dMiWYKJD)g?cPXqk=^O0J^#tcGDkID#KvPq-VMQ!I5#tEs0 zx*!}gT8g3H^TM6dBNo8g`ZX?YdTxes`b)WoD*_j%c}|vds08u27r1@?M@k1v z*fcDOn)RGf$UZYNeOAJ}kbstjl6ECinqJczoCz3+L0h9!mev*vuZ%$Bd{(0CA5jQt z(+jg7>u%+R{#t{B14<)h2HhEEmeK_Q63k*DaOna)o0K8I5YRCKw7uc`_wRYDibAy* zk)>nMnK_1lSt9W6<>EZ)5es0JV6#OVBLcb#1qwTQirayQXsq{RPGN zraPKr+|*&vm14YLU)eJWd+8$gkmVdILHXM^d`?L?w5U}X{pZ(2$!}_sRi>Z_uLK&_ z^b>(?`-9PKP%FOT`0?W^b4q@WWM}FiK+z29L^R0SqEKy8lz;c`9d6#diMY5p*)Hsw zA;1t|2xx^sty;D4F(Xp{|tQwY~Qw&Q;aDD*F5N(TQTbI)3Ov>@1_@9IAthPW$A{0S8;) z9{2s%%H0XYOhDybr}!{q3;`oVfXJ&QOO_xcB!nlx3Kc2@H#axf+H(JySz!n;1oVc$ z&{r2^c$eERvFv(5X`=^zPjox)4-kq?X=ZuFNn)fFZyT$XEzShV72T)ns6=ZvV=m1A!G2!p;kAQ#x-W_GpZB(&sfH9`r45lKq!M%a$$h_V(7=0Y++R4ILZE z5MT%}1WXG73I(QvN_;{*|I8j#BS2|~v|Zq|=~Gm9mg#Z+LO80r)drDcvgPr&$Cz|! zBwTV9$A}95gM+1mY!{{1h7^5Q>WGp?NwN5@16uQ9@dN#QwT{$^w}{7y7st>%|F2TB z3TcN&jvN7YN8`&IC z`S)UQWcpbO0Ake)0o@`%Um8o6EQ!{wTkF;^v&Il$2rvZHM4(EQDpi#Fa%5;fxy5(af-r(-xqMp&8hX0N4SK%Gsjo}d1;44gglRaE*DED zXD2agVy0?dzXBQMM}OIz5!%6}Y0Z zT2PGdaI_N!jqa4wG50qn~ovC5J-(c@#4in?@9gp_eW@GXevQ168lqC7_+4c zA=b_iURi)B35wvv$E?nJ*L&uLI^6q^M`=dLoETyxNek3Jh-m)N+ zEm;E9t5n6kXE%8jURm>N@2%ho8KFKt@iVqQ2$IKU30=g`>8<=Oc0|Jy%G*4&>m){v z8G-t(t77(FOVG`yi&|C=yxfbmcb16z?ti=;RUK+d(v;6V^q=x4PKTf4@6phH zKHL{O@i6{GxJPcKN}zEAPwYQ(0u5_7m+r)_7y=9djS+CL&nM1p*LW}+kR}8u{CfEC z;aISiO2Rh7B90v00gqZyJv`jsXKB_IESKSODWd zpLxL$U^u|F=22Q6m(Q5TLijCvG3w=>;5AoetU;S zYt|xv!OUn{zY8c=k`;!4?h*Kk*LNS`K3f>VVrTQ~=#sdp8F($E}v??3qa zU*awF?Aa4ViWEtMH8xZh0m4)e#FUMG+rE7}e0_b9H*a3qVeFbAzz|>vq#FXwnl;0e zDN|CBT0@2m!PTo*dA}4zYMBP9m2S|pi5UV60fqoWz#I{vT*5WMb8-6IDNGpB8*gtO zRZ3pTVnieg9jzMIMZk#u2s;;n!Q*~|NBf4jS>(2CcRtV1C9_MadZ9v6`F;EP{Thoz z33iO-nH1w`E1bT*Jy6r5GE^zXcW~~Ei?7Z|MYK_>;n;n?xVP#KhW_3~<9kG8WbJAd z_(Qly6K43LT$%D1>N`oCFKR59rKcZB-*cnVuudr2S3@tXvcN9caKw#<-Wj<2dt6yO z9)q?<8*JV}f2~32fYPus(2Tb@B5V7Bjr?pxxG*A1x4;vgiZI={aU**5>cvmk{L!#w zKoK-=nwr$13iO@Q6 z;)M8G-if8WN>;}ZUgjp(SgT$P=s3@pIX|0qc5(BMxF2x;QWQrwFNTkIOP$@L#&z8I`%kX}RzwISeYJ*7UVAte z)9`S~4x6ux)MBqAhJY>*pa=$ke}DcEc6cGXw58#tOP4@eHLRpF0hl@sO*6bgg zi50X4$)_YFL`PujoEg~n?3>z7{i)kw{;YU*(hwim!Q7K z0@l5@;-2Y(qdp!++_PM{a)^qG(%3^5oux5kYyd-mA;1tYO$3Awz_hweGfv|2{RgJG zP%T$QB+9?*=HX`KC4{V)fs(}vYiUXTFq^DdFr-Hpw1}#W9^0lMvs)H8WGw*SGD9Ix zBU=!9Cu@7wA2Z_gwvFa*pT0V1?UPw0!>xw2r(^64M~N?(P@vSWi5qVN2vi2d*ZNoBa`6`5Tp zGpgvjwwTF^#ZUNihIofU!6x0KtD8=v@K<{*7&I(R(O7~_MbC7PHZPxsKmVG|zb z&F+pKe|1Eg2EV|yP%dPV=S1>XynA>T7xr$&+?j{)2%qsecX@Of-wKuTi72nM`OQXW z1O$>g(2n-Aa9aNf^@6J84)O5l^V72ntWyL>JM(UN- zqWP#0bGB;ec%C_#G-DWMOvK1gdIDeD<}LEa zw}jVNF>Rc|?$OFQe{qWOTNt~Q!Cza(;l35J+1n$VGH2qhW7*VIB37%sH|8wpht?%? zC>z01Zds7K*e_`MXDL*wTm&O}uR!?LIq3H-E4IvUfudRE(P7F>YTN3NCqL@fug?#+ zv$NCI3>(J~U4afaES0ik8a0r6@v%)iVSb0t^8&Lx2P~NOh5p&tDV^6`2_< ze6AsdW*Lga67VH5i{{L1^%V;iPsW}d`{4Ck3%;3@-@EyA5xSbyGbzTO*nJ6cpWdNK zn|cU4dWy$~NUTNEMj3>}k_6nZS4R-ZNkkee3<3Qi@Ci49*I?e6S6paTL;N*I4H8Sr znas#nryFL>X$#tXHEwqhRvddNFQr*(lrAsoRrdtt!_gtT{hlu8VYV0o83_TA2v$1` zT6LXs`#M$)YR8F1^}?JpuT?HXp@3FWEbg5$ zS+Ow%Vp=I;StKNu7#oQlbN)zK_y0K2t<>8eD|Uvp7$X8iYDsFN$n%kfYso`})iDGZ z0t^9$07HO7fRw*UJWJoXhKj%@VvC5HijBJBZqz&s?llgh$BtCg-E8VfF+OkxrA*ATKOoHJ;HV*R|~<)$Jk zOYYQ};ncV_`d2xMSrL!1ZR=I|HgASPh6~V=>lLfi4Fa^yA&Y*~4VD?&O42KwS@1th z4t*rOjO!to&mH!ShGXVHPZY9IC$=RXPeYeu^!!l7N?QYBk6_hQ?kL|M3j^A~RV{m* z{(bCatm7i9H(i&o$oqB?{|#!1+_Lkix{kYykQuwMR%|Z|a%N*W)v91K_I48fqa7`% zkRYJE!iX$+sIWSQ07HNwzz{Hd1Y)9JV%fiQc?EcV3TCMSn&#fKZa!N141HW;=CvsH zO_>Om;!*0gBqQO$Erju(?+e4TrVDat8)IeTgo^cCfQTEw)rW}w^aF)*s`KSmJx`VO z+O|I!-3GPdyBt4$T;UfLWj0uwVgx9ffeuzO76Kwctd`t%eiON9Elw4FVE{U~+Gx3m zB*g!>AB&05D&H9s26selXG&zItrX88c)?IKI?99>XRN@hRITRb`EXNU!kP19m6_cA5QfUty;dXBA3ZBriZ!{1SdpAcZdybmm zqO~sX+lV;}7pErA`1uq+#DuKDT3YMBqO~TykHv>v9H}MZLlh5WEk=#NkRe0(%n@=@ zkr<$1{&E>LOw2ik07HNwzz|>vq()%=lK)|N|86?pA}{q!s%uDvd{Cc`*uIzhl*@`3 z0or=9cb8VE=vGQxmtH3Y9rIz^s#&1d4J!-*-6D{LPjBBMhBulGxpQVogZWIznmvmR#Fk^OSw>e|pH|8}%fFYnZ0$aWp z<#v84g654pOnnC!wJ}lMkwSVWPMpXe4!H}c9$>;fA}(CPja%2@-KvpRt4w-z3)`1Y zgp*TMSnx+@^jLZb$D*{?C+pLt4fciZ1x1jt0v?B%3+CaE?(KC12S*%S4~7SKze+5< zg+wi^Hg8xPk+=T?y?)HSBqv)TXR)HF+^B@;sFx3REVWGsFN=7*`}j2tb`tRJ#YfTj z?AFL+l?GF6s8Jz6Ix`j)7W_e4WvrMZ0-2G=u^_kbSVXMdjO|j|R+h+Cp(lb59z<}T z3d%R1;GxS5=ceOv@L({e%8k4d=291DPJ=5dl2ZyJ!mTQbr%F-Gf#Nl5ql&ub#Qj`R zx=?oU6+1B>1X#+U`P^%^QicFSfFYn10V1;Kpt5PkNj${^{@ffNLQibOgdx4P&|>b)FcQo!BEy2<0XqXx!?OvIGh4ywcPrN)bPI~@9Z7d}F3V1G`*)y&J5ohz_# z>L}GXBbr5E+ySZGgOjaUdMs0_eF!;ilVTc74+-7X8y6> z3;~8fS`e^;edVU;TRt4CuBT{QkvU2e98eR^1zV10ByxZqM))F?_Oju?{()cg+MJ@xe^U(YW_oE(u-60%a2&C67ZR@5O?lfK=SiT zNWQlnhbFXyBf>G=dn)E#PYIFG(CuFv)xp%cbMWb-_Mu)HPHB|gY5n^{_n>RrraJQP zBO=zV#K?1R(rk~ywEkYcoQ2X^a`|ju;}8=S%N_6V`kSi1vuTFjqzz;)RvL}$Xo(59 zyJ!M!=x1XfY}fXQJbU78TFLW*tr0GVxb*9W()xCr{>%sT#6cDyCu03;`JgXggfm zzJjt*O%c_KhWRzN@izxWBiFW{bYnk5kDFQ35FF}_-a{(QszMV)AKujT+Zcm=?W$=ylZA*}S$ow6IP>;+rU(-EspL zPR8KDogWhTS-`q1_xYl6NmT!}G%DI>f(7HYB=AvjYF8S~dR4&M`PYEY$1u5n4%jRo zz-@DA3$?hYFEKc^Xb$`qr{uwAuZx~7OK275rNUE%&Gl+D!k|(8_;&h|0?Zl`&yi|O z7eFCotbrkrW&|wlT~WKk2=4Gj^tEev^yxir?+QW)Z3lRL6DE)Rj0p?-qjnx;v;aqF zUE7Qqql36yK`KSisBb6Kbj-}1TOvo1awzm@4Z2R=&$qG%hJY>+`1|j_Rhm=w>QytPsUHfct$@$BAf{svlCD1uVL7f(gE^y3}eiKM7HCzNu@3-%vJ5m2n2 zA&~JAxO?|9I<(M2nKbD+PVc_T0Z<0ry(<4Cw8W6)Le&N};JEk}r?mPUFSsxCxm3OP zh{ygsX;jZ02f|LF70j2^dh+TjI<;y16O^=^3HgRK{jjaWQ?wtxD=pUevGuvgzSWx# zqirkmA+;>CenafJFs%IRE*`#;2VpW2BV%x#j^G=pFu6H;*Rn&Vv}i%eo5p18Y*DdG zCv@F;7r_q`fQP#=uH8dK4DEn6_1(D7Ci!8XU6$VZf%sR^xO3?|_HWvbz@v{-(8-6| z!@SYFSXP6gZf0kcJbQ*W=p{lLbpzjp2B=oNbz>t@X1wimpFbGNze z067f=g(WEl7q{%=NUSR8Jd@jMxk4V9T)}UMzM)B^c@E?&Li0Vtm8duHa!tJ*V$zE! zT+t-wP@(gz!5k1^-^Vl5UCsi>juA*UpU=hmyE{pb@aSqhXJ5T&tE8BlxXQn=7DL&> zIrQfjv&;}+2S%Dmg>MJM{AZSg4MyBFvVXt_H^QuK8;v$gjG~H zRu1L}Esk$dSzf=zwL$x^F3=0TOWUxBEtPDjXV@f#1uusnbYdoT15!F#+f;zF!@Lhc+Z@QJ{6?n!7c4epi-$k9I2&7%5w4- ze0a;wblaWP!6Q7h%oOWD!R%;XyrT zxJoI*f5L-vXSl5uSz!o(e=j?6;sg&xaN!4%*c%q9WRgOUHbA z2mcXLO`5^Gq+x%}G|wBvR?QGd9|TA@D^n(G9i_6#tRd+oj%+{0Y47DllhzebLW{^O zvRKeDA0qGG=k>F4)@8!TLK3DIG1tEE`VC)J6Uz5~&OTd$J$2rY-Wu+wAP9BC) zKIP$%4&MN7aYWYk0~>h=ma==Lc^l!$Fx4D4;~Jqja!EZubE9<4s<1z@2O%3m zP&ivVc#2iv;}LykJ2r&e)!ScXO1o=iZExVsU5JY6PshAkm+lG6a+( zpykJC}q zHkA^_FEIxp@2+60*iZ7$AEWD9|Ma`*YJ|zP^;4Xk-UuVmu#0ke~e3^7kLqQwbB!1hqG&jKn6j8J`4-ui`lc9Ct315`Z*fbsixyQ#*rsc z7qNQ!RJ7lCAE@brX{`&V`lVBoNr(3H!JS)oH5pYs-X|&_>_UJ zV{qMEi{QhD4{7%^16Z*56oVVbxgbcsa8c!BTf;xt8-BiZ(56c@wCr6SO?o#$@5S9Q z`JWd4kD#B@Ggq_ z4U$nkmDn?w!{hM}&csS;J?d#bW>#+qq{DABdRq%K%!!t7@8yB^>r%y(bJ)b-_51+{ zm=8?t9*Be7he=OWBIxoE{dg2xxi>BE1;heLm&Bk^m=Xj`+2W7I>&L>^nM48=m1ns3 zcWaCn+u{7Xk^>%obr5v=1Wy`)+t)SnV-gzJ%5bk@adxup2*&^)^powQXj;BL9xtLE ziRMsC3|_PJM5R-+Muvb9BS0w%bWqte<0RhR5VPBSow+<%Sz735sXq|2e-@njZcDM3 z7Yzo^!tx;vP%^vB`H`Ey8S?FXPW~=j8;J< z*~v}sIz9pKQ?gbpJgcC`Z-rqWpE@nz$Cs>d@brLB|1Frih(4>t<9#egWaUxzdBODH z(#eXlJE3ZuuBh6&1BN||#=|Euc=_Tbp1n#CMZa0tAaCLP$X~D!N)+cdvPq?@r4uih z5hFrCa#NQK8~wKMO2c4%!~z)6eNycT7lm2#H!SG?4FSuKaMV^T9zKi37ZgG^)q|yb zaKusV!PBs?#x-0!vl*+7JW6RNLH90bT(cS~IH$7epFC08Ov)9Znn~w@V>8g`AC^ekBV2bdvh_Gvh07F28z=aDJP_C4& z^2EO4`Qt|t(7r*~;!$Yuav0VQX@kbav=4)uy<{EeFy}IB!k=0$U&uE+&233J3zM2T zrYT%bkrSmk5v{A&pDAiKt@>;>u%j3^j@`2QB`=&3Q?pvaf|C+CcB?RblOkp-3v%SN z5}GpfvxVX%>v>(7VOOvyDshL>l5YMf^@=qz1k4Ko``Q?B@E}IWTeYPHZkNL}6i$c1wKh78phJ!sn^Nd7D;RP-kkk2R6>Yy*vnd^Y zepb>M7e4ifz5_buK(;KxFMu|1?Jx_emZ=O&vZbh9Q9X@eB|{;=h^!2CyOcS5AOD>a zJ}`4i=R+4_OF%m`;KQ)E+`w}aFsIE~T$wNk^$S(Tz_tR3<$$VVULkoz2fJQ3+kfXtcIc( zRJpD6tZrd@Mk)?CWZh`{M1*Adf1(#8keKM{&Uf<0{nt;CA(T-M=i zPdLpMjH!5bYy$7!d#V)k>8pP zRR%0a@_>}qq&K**Y9ZSC&qI?_PqFR5FnAS6NxG76Kw<4jUmw(~)e}|R%^>_o1_jDB zJb5-yrdESXA;&QP#JUaY2(bX(*fz4RoGmFeu*%6rxfR>jafP#K{N7?lJFCx-2spv5S^X43ix!X_PBrIY-m7pNAJh&0ZOgzx({&|@u*P-AQ;c26xxSA0pFy$n-se-SQIJzI|)jUXvPi@Fp?gTB9^NlNd;^+&KH zP9l9=D(A2Y8VqlZ1{%JKrK7u2xuv*5og78Qqge|>fFY0p5O8;Q$CKz6`tj5{S8f@&U<5Bd~V;6U1gpog!kL`2!wq4MRxCcOX-4R31^RU{|CRmy6E@ zVTEkL#>00ID}GDjl;$t*!J5T;xGYOocvdYcLvp1u#wtt*ffp}cpm5>BQY)gr5tKho zhoWMwsDagIGz3cEm%7{s<_#ox6M?X%-Qe+$59*^Rya(2Tn}%dhs@1WcJfzlm{dby?)Pz@ zP`;d#aA`8n);6*DZ{>YN#Y->AB5M+gHpq^fTRtOZ`fm6ia)w)#{M;|>RNh;OlP z@FYAMk+(>+j8l#uQ45XjlJSKjzihth@&BB(o2GO1gTwj3L%hsX6cvlgrZ0cP>xcvR z=YRiVqvUpoE_KoG&#vg+<`+0-)#8oEbkH-&l?Xe#(BdSc-{?!BhldA-3>jjQ>t>6} zI0#reRz=6oRS>Z$0wHthkoBDt`5HPLT`T00ZD7|XjKI5h?>OBxXQ>qi1_t8Mqepxl zWs=A%?5~(SRPN}l_UCU1__H?3ST<;8_<&@q%F?pR?6Fa%5j0ViiC z%v%KR_Dwm`qlB#2XGr-XjK9???S0ECAAux(FakQ<=QQ~wOGa%+&OasVcf`= zjiXSoU{zQ+Ngmb33jPl!cSj~_s~Lm{`G3Sz&VTsS1?0+QdLPCul4Efz_yYE=ls@(@ zyo5a*i6x?>l93qk4A)jfVE@t!*gf|$4z78ULShkg+;+{=_hClQ^SEV^I*LmrxaQp9 zM;z`Q4#w!#T~N1SKMdoxKqG4KXW>$L&Tquft}~@cEb8$16jlr$hVJ7I;@)R1-+X>f zr19Cd{lVfbtSLf^72P60ySfmrbjU`(HE!G(4<67D->fhM(h&j6JgCrfJpP?I7JVBP zk#NKw<-G@E;=*Yd*0cz0L@j@uoV=aI0!W}_4yUJ2pGL!m4W*V!q!vk{2(la-l^1 zrgG8_e+sz+Ezz!hWx0`F%Doh9aM5NRYN3v*{{bKG;7%lcqmdP!=RS~c^@01JS>WJe zo?1i7ab~RyfsBcOqjP?gEm;Dw?=*XlPYBc|TYu-4DZI@sB@FDCLq@ZWNc;l!6n>(!(%%c*?KZeA;0w5EqKj zU=oVwN)s>mR?|X2RBS^X-xBfR!gd7lJ8YDIn`36t-2CGQL`Oa4cHWS!m*~Py83Gv$ z0s3Y4`0?ZXQG|PKn`>#};fYJvZ)v{#yu~s78#3G{AO z2KhCg1(A27P_ue1Ek>Ho5L*9@+xInGP>MkR^GisUdz{DfRqc73#U}*eJM}r&9aXd- z8*g#CSv@*;($GKFJ>3!L)&D}I4q^c;xEMA49!dCmeLtqnJPXNe&-lA9IV~Dt?nF*- zITXtx1kI#;s5vkIJJ0UKxwC-?oYoHIc`p1TuCLgM!%+!(_F3>ty_8b_(!w zP)Gyi7t(R{D*fU4S%}%XbmjmH)J1(yYpml1wPFwxd;mMTl!UjG zpw=^7-oE?iHiRgKvW00AZ*7VTsy3|#$GPNh1kPQJLaap!%ftm{sTE!&XWFEgo486$ zm0G?j$Wcr>iq+f}i+y-3remPpecZgY4vR}?l`|u&VhCg$1W0^?4k|CgPjZhh`Ezr7 zs8XdqE?ql~CiQD*wsgzF=s4B~K_}+n(C|4JYc&8vI=I1+{|$)~Z;Fb*mW^vM^4uHl zJ*v?%r^wB_4x@S{Z_Ru&vEFVa>S5oJf8o`lp;4~v#JLDmuV$RSr4_Ir$%WB) zX;;*gPIlAItW_4+aXJjFsDr>8oZYw|S5mrWtI!T(#1XIw zm5vxa#1p^RP;RFK^7#ycOZIPQJ9r=BK8GXZ_*1kk=88-yHrbQuB0z##W5gd#y=BVw;uTi{?eMTz~L3g@Z|T>TKFP{iJh1&0&fmg zGGbi-Azy)RPo9LbW_y>aSE+~Y{kr0h?(Jcp+g1Y{ERmyp8!TV-4*mPC!K@+S+>v^? zV~5e$`Bzhv&My8Yn!1yM8p>z8cr_AZMmA8;!#t`Rc-F=A1;hFLP|fa<{_#op@)hG} zEJ4Ka+xnj@9cD=Sni)A=?4h%ad!`7l-d%hjg)_UOM14zi!-Ca)(J;Sc7&+JU<}Qv4 zeUKM*yKp-M@r0HzMHUop(Hec09>cub+_s;`?%-K3R}|I!tw=D)o-+^vzyJO_Zr!?t zrAwD$z<>c@#8w8ndCXOYfQcax85xNU8#Z9uwrz4(CMyUiuM_*zB@dO1SQobflN&h~^8r_^d; zI{}Md5Yd$#&Mo{gNkW(_F~|>H3uY0`VO0(_$4QW84g9fSa2+iKuEZ_?woTErYfA3n zp~)EYk0|HR`Zq81FDUcjO=6hh)1T2+YAMPmJ;I}_6w#kLM^U7bpSoW0+^mHmVEhOW zktL`uzJB+@_#M`hha^lje)tH4aS=9}m+UCnVgUA>UXG9nEv4QA9Xkw0NXT~F{l^>b z`Lv6N2;Lcr7EN23wRo0rPZ~FD3BtqJ%7J5N;KzMoBr!Ht7y`ON;Kvhg>t$XkD=%vI zX@+{TBo>$H{OQgO91*K&{eqV6j;SL+ZJbcPcFHzVxBt)HmB7`M{qe8tDY7I)5<*3` ze^Df|8xt+|B_qQi`#P4&GWKmEj4k_;5VB>dBxH?{os1<}8j@wk^FQalcVG8y^{%Mrvi@ zqGhY-GQVQR$x#>}h?%8o{387WaBPO7%*z%~2hDzNAXi5vyhGv#N!TnJb$;C*K{`bh zBM?Gs)wZb^Zk!R~Nhq@>96kFwd(D2&RTr*eU| z9{g4>Ll(GnztDZtp;d3CBd|(_K*kXGj<+P{Q9ReV5*pW07N|5Ccg|nMYkmL=OVm~R z1z<@SRF>G*C49h#&&=hMhpeD{Qew-+#RW5G&cwlk2f@g#g0k{#o(zGULx7T5)FNx% zym@%~^eIlCKAoXR@WL4oA2U|+2LeT)XR!jC?{5nP9gt=`9c{6q$KQKUNNF6im>7fx`55?QIr?cr`)E@MkZT?J46i(l02ty6auj{jJtr1jsp z6HTHK*X#|;itG_m0uZZW2;_MLXj-~19e%=woxvD6s7J1t&zh}4m^^wMv-**&2DN_j zo$3vW%kQJq{mq`WOBs0RB&_N+KogrrSvycJlU}$a`GV*2-+1y;LsFzfY1C+EgtClG z(O^Z3qErbb)}7y8;Q9$^S|0N6k_BpI_WMK)v{I*O#KlwiYwu#NDgEYM)wlBM$jXK` z4NFdHnT9PuHfWHEA$)v%Ko4~abw6y^t{rF)`57~2pmgcdC|9l=%+1Z!>CW0P1Q-Gg z0kshL`0*oNzI@4LpQ7=yD5<56r7mp~9v;q(@k2$tP4-5v))Hi{Q4!lcc%bh8c~yL{ z`3E_a4p|(PdtAYfwBE1u9np0JJ!rZ^r9xC!k~E37{q~RpD#qu#mO_;l6VZzvGx@so zKQ+RE7nkxHZ>7c&BoMss0Q_1;ON<#mhNhn)i7TQ#vD#u!kf!Ld_6&hMgMiCVo)|Ff zCoV9&xtU3h>V5szUF_I@0{eG_<)|LHZSdZ1L(r|aBRV_TqoHM;998e$qj)S?yB(WW z9n4WZa$@j8g+Cx}`w46d)i6rDp(Q-qRzg{l8juxr5%?FMzWhrXmz3%7?}M8Nz5Q8I zR|_5fS52-3-#iIVZ%ACq%anv}F&ZpBdrIQl1nG-OQc_a(49Z4H6M=8vzTxrX$DFm6 zjg1XTmE!VWrrC$xWC$<>7y_CgKr^i-BqZST=g)Ze?wuxG(`?IL!_$O^-ON!0L^p8C zXFMiFO57aL0^M7hX2|tJtMmAH7jc9juIz6?oHJQr2;?6GXja2kty*ytDpjHszT}^& zWoRbU`e(}cS?K-SG(-lkN68Y!GbBgtPU92ad`rg`fV$KT9ybSbeV4KLS#rSAm}k?+ zE+zO(MsUCqRIOZ5u7!q|K0mxQ?2+1>`Ww=XGi>m9W=@w13p>*q0)?nS>N#YjTn*`T2jh1hP|coj21rp4YEyVm+9c2wl zeLCndi4S|-O5a1CR&+6FHiSf=6aO;zio<6ZCktL)`^rx=?Y3rA}araU&lM4K`x+S zb*grOd#}wH(!&IW+Hb&_qrbp07wDB+SCr|+5XkEYj2`>Ov-w*EeT+h z(4u6Cp;1kE^dFViVa!tfhYT8n6{}|F$Qq5Bz6fuUzF^L*8Cg2V+${XZ_tL1_w>>=D zsP-Q$Ry-MRUcAKhphvj(w=PV6?|>2R#?b#P%FR>DJ-QjxMk{x7Y+8R0xUvajy*^{K zXEW3)@)~D1Z^oZ7A0@h);U_0^l$X)`KYWP4g;N_hVaEDvk~@vizhj*YXQ_}8&o1%| z0t*%_;G)1!pFSNWO62?(#d!uerYJ*zA)qw`sI^x4^5r>VYuBz_8Me}5q?Xo}gbC6P z0>x3fY-u7YQ6kO?7QRz3!u2N%w@_{}ubpu5L&O$fqO)Rvyqjt5qB~(g#ad`fxU(C4B@aPCS|A zJ8@{{{SMO^k|!Dy-hRfi`5V(|oxg8?|6Cm9ENhY@oq6h5qjl#PY#MS7(Y`0JrMf$Y zTbDv1#$}}g9KBr@wtc#x?aqZb`ROy_LpNbOIpm9OOK0@4uaH_TipTz;Q!xJM)6_Z= zTFbP*JGwW>XtGs-C=E{Q)vgb38*!v@>gUc%_9C!p(sFrwHq@+OGA(;u~ofB zLpXbk&(bxb5#U=mdvg0>-KyOzu$j8+Br1eLh8F19n|^tfjN2P;<8cZ0uc&(P6+&_I zPMEWC2%4)3++E{mc>8uly^@7eMe3A*ZYe$}skmC#t{>)%X^tw{{MEJvA+_k2C-h*X zR_YRE#~FPgq?TEeCQV|5R(1f+#$X6A1ky!-T4`0RSdokMC*PQ+!lfw=>7lA*^PezP zYOs2S07HNwzz|>v!m7Flby261T&Y1DTXD=TCB zfw~;lHfe&sBgUbxi}u%O$ARNmvt=KbF@VNa%c5fXc0RF?%;&ZMKSYJ0Te=tr;g872 zxcaOK%*r!jOT9f+3>EGB;?MnN*tc~*wr`Cl0pe+?j@HBbz_VX#G&hlFy!26}F3pzk z94J*EZj*k&$X-ohQY!l~Pki^9i`_&urY|fk2suSUdqw#2Cr=t4I&=t~J9lPeqW0is zk{ALE0WBcl?(U8`bLL>om@zWaXmSf08;}e*=2v_cI#fIO1QbJ-;k;PEe#vRMH{)JQLS76~_n;aprs3s8?PNH?|*4&ZV zK)_TUE3ybsB8$H8(LqS7xpcy%a|MZ=)* zp-}jG;U}}s5~9J*83F|vfvbV@P4m4iKwev5pC8_NP33~BFZDyDrdvI_{fa#Y{(__H zF#NBf1$sKSgK4!YFgG(v6B_Eb78~~fAt%q_()HUUO^sS>5eY47^E$&;*Y998wdlMT-_?e99>|uwmE;EQ$tfCa%Jo z!3~i1Z~uRh5IPTTUOSLzGX;Cs41kp`GpI;=0a6gVVHn)VGELmO27|5AMp!KCI}$@@ zp{3VuRGYXL#|B#=PyI$s48`P@UI?x>5qpmfhE<+YKJC?HchyIrLx&ECjg3vy$55HH zG?^{>%aG=CrJu16VwLr0bqoQ907D={2$a?@4HF|1&fkFMjAkY05%BQvkp2;QbS4FH z4-#@-sa&oBC7vjuHF&@{oH-eWh|AZpVAT$sj*LR*whpkYZ3^(QY{)zQt@}@K)fzokjG`Fzh-MhQQz> zO4sQ1+azq>b5OcQwvF5|WuhYslBIkbaJ7YWQV@UQGD1SXr_oBut$N0=Fd_enep5|= zDe0B#s^}xmKjyhkIi^s7L4Y@Dpc6iG=8W|3IW>oKb#=`g4!R96XwghOa`QsaqE*;w zyND1iG!UNhB1#CupR)*wg;tn2$%TVQXSh`YD zi~jQabM2qlv}O}(Th&4Xy9TJefu1a&hBC0SsgBzI^1ceME<}(~8L6c%^wbilYxgdsc^8ZrD(-b9`kF#_2YX<> zecE7LJ@#Hg8l5J4=i7A@QdTU8cUq8B*zryqh64T&Y!2=q>a z{L<3&@`)H-SPkBSxWV~kI&2yY0W}dQSFT*TsSK5gQXsNs_|Cu_pE+>-)dhc@Tm$18 z#>)D!I)(s4fFYn21p1BciwCzJB4}+8R;^lzO@9SQzfsi608EJ52vBQWdeBn-vjz9b zeqmhM9JhdLPg67lOtQYnXv9rXVl2*Fy@(TY7K!C?Q!}q`R-lu|KA6wljCHPNklB8ui|9!Z zhRg&@rlnDD+vdt8XAKYHuM%I&=gm^836tPG2it)XHcDaHF= zB*vb{)r%pR!>vL5cynhnW(X8C1Y}(gx59GCuV_YJyrr&& z=5X~Jf$nCh#E~d53M##)}t;z5gEk7?vEbe@OJ-p()+zHIYtGW7W!$&Z5J`^!`T zVUvjH_0td?d=+yyPlc;MKY$Pc7yiO{4?i*a#EqHS-e;8Rm|?2aQ#xmEz7dG_>7_m~ z#trZv-e25=@r%}`>Q_`BdL`u97FF5^>j`;Bu^A}DhQEIg!HdR`gTz1Et0GofavXwu zeK3t93MKvcdCgq{Z`ax~#8#R(cs9jLerUBmGpW0D3?1m%IAe_cK1@4u4e{O0YjqNi0L>iSXNd7PsT#5Epk7XZJ3Er;QIVz4^cj|uwEm9SFwK4KETrt z$FAPyusb*3NlK!mtB?m zb7u)z^;Pz!=sB(&xkBo$;K-Hdgt`)ze-KLomM0pzU`Pj3F^QC^Jx0*_aFg0RoiWs%KLd8@F%3xDn$8ci1UIfFY362!zWqSx=um z1~uENZfug%sbVMY+O+a{fIM*sEDJh-S>~^k3 zKi`HBv7O`R}ocr1dW*CO%wEj$_93|57y{13Q& zc&{Xi{Tz6EG?17W(LOCO*qfMVy&Qo>^5$hKRU>9Zw@+ZJB#78*?_Q~M)-{FQ;AvQm zB)BaSKMN|w$loAL%J5-M5}z?0ls7aWEj0f{EQ-H|BXm9N$Kba?Ed-`X;`w^?zl&YL z#K$r|3CRk-Z=T_CwMp1Ju3hRH>zbk6up#gaK8N***Kq5}7c{dXCjW#x5#lgucvm?b zreM+g2ZYeMB|lS@*O}8@UTkrgG-(NY!W&Wcs=H~b?;$tNJqLIWdW`k*CS1vP5gB}o zm=#Whl^)&bncw4-4IW3j2Qpfj~R+Vb`sW&>!b%$yB_H8ahjOlMI$~b1qw^6(KEvd&G8>a4jedu>UB+E zW?`1&$}j~O0t^9$0FOZDKAkYN&ooA4@qlE*CrxeGs#Pm)q*5hH;Y&7*$%e>V2waJ| zjFgm53QAM6t?KR`3iYfa{~=JgP&`6^JBE{7)Raul&(IQ{r=8GP@n7mp3eJn&i=(1> z9aL1MdLcbjt6vw@RNZIw1qFddFIrVe*A^fkAOQ5Bg$ANgC#o{nID%fT+42uZCpkDbGukT(bW=N{$TpAWm z?O{(yE#lUuezCJcO^&=!zl*Y#I;O7J5a+7w7FSo;$b|fUh6?kvYOr&(l9De{A$rwe zZAX4n$pD)k4rO8E)(7^)7gSvwGN-##Tj`08X&Vgj+yM_6;z~>o-E;1NIV~MHx2OZLXKiNpxH3$OqJnXC&NnsDt~naYJX1vdl6ojxf_y$p!pF~qp5hcK z4pZ0VP`$LpVPsN+bc&YFU-m?UXGXSTj$P?QT#0~fJ6o+PAbK2%nHFwvvGBr*3~>KhqZN}{a1fy8qYgi{l&0P*I5W?=nRWjPv-OZVU7Tc%}YRu}E} zFDUyUC+GR($rH}{jatBEkM*0t|By^v!QYSr;~%`dM?)mlfL)zRa>NpkR%z6Qq2UF%Wq_w4#rY*Q!Ng~L@@*y0{I$&TJ>w;+MTPQPSmV01Q-H2gh10K zXNSny0;GINfvUh+G)g?R;%Z{uG=~&s!!iW&Is#wuoP3!$Y{(bX|EUXlxjUeBv)ZUq zO3fGZygq%Vf8Inu#|RA_8v(?0pk zxOgCr_(yj~Kl3Ztw(UGF-nN5_RT`T(e_+XG!4O~wXc+;csugiD_>z{TGI6R9pb=$# zeSNvxGlr}npE(#{QI(RcKF1KaeEkxtSE~WnuD!9;{|~7if6QEtpo6nvC50vb zo)FhJV~1L3{Ey-kb&CH$k>tN|AzU0`w~&nq8X6WyAyu)l%2b2_HEGHZMIjJL1}4SH zc#E5dw{Qol+n`^+&iL7>39M_Eg)+O542+UvUFy}Y4{sY9ahkB?rl#B{`@s;P@t@wk zjOX0i3=Q>Bl0lNC2*{`5qcNbSw>1%4&gs{Nea-vuP18b4UG+*p-!PrDke`$Bp2oMJ zW=Lw3EYV%B5!}W!K}XKj(3k{*Cut4sTVjR@`Hjm*j-N(d4LhU4E1K4@3C1)rR$*zV zY7*J8$K_LW(y0HxqAi^V(N@296V$xFENu%dRqE$JJ@phxuN2WQqssN~J5paa9^ z&k)D~1Psd?;*aS|6h@|j;K%(o33u+(*dwgucLe_ZTnV;QIzm~nibBP{Z;4z}^zQQ1@)S%m`fPBEi80zC=NZhHouW#N~^+|2?~j zyU)JDN+BTqS3J9WQ$;K(flAWT^ye&kb{A398!y`ni3=66hooR6_9sI(V##Pb7|L1H ziJn}+8?ET2i%K;puvb*Bz39zz+@XIi)N;SfD%~Z4;W^@}2}(ylf_>*vk~EUMyXg@; ze)XJ7aR}F8Xu%OhJV@!UH%&UA`5x!xtNAHngUHEt)3fB||M?dh2W%F-et-+Y`B)6X)P=`!K{_Wz&BZlj zuIGZWl&%e@e_C^;J?MNd;lx7kRLm`CpG$b~TCf+iz1|wFwW_(M)^m6r-7lCooxc~B zt~-mE$7*`_b9sPCC>=A zH@`o?zBUvue?+}jri?%@6{k6xepQ7|tePQEP!XtC+ak@Wr*}Wi&g>>bpui)b4@>uf z81GtN$%{O(*b3Q#X&#=i>p(0i)|^B%iLoV@Wj@yMuehD#JS)I+*b0ABuco9LnKoi4Z_}8YV}eGCG`!sAlT2M?&6vJ zs}*tgIu(3HJNOkghGhp!BI^o*Pu*3F-KFtZ>CKsBQap7+?ZD^hPx90}%ZQBF0(?hu z(mNu)A{sQWr$A^ylz`~{N5pzQi^t1%8T(&etUsScP}M%r6qBseUB{$3dbxhY>0rRQYg4&^_)6B^=ZCk#8Y5(XA?!drV9*GS>l4>! zJySI9W&$K##IcB1>P3gwtBdwy|3@P4U&XDbitLr>=^aEy$0G8wl4$eEPjHovZ_^l- z)r)a!BYJ%uTl$Z~q*3c|h?tQ{%eBK;GinOPPCkXdmHd|F+P%MvwOq^`HrOD zsvdqg5c?W`2X4UcgVze=-ohd8S@?bSMZA^y4V*&SuEy9N^RaZDs-4Z37hhMiTSSXwi(dKTzIxOrl6U$Y~N*2#` z$W}y3Q!Gp7>U~BLKhaynESU|@9t*H0fc~Z83+=N2le(?OiANGvNSo^|dX1=QGc&f< zyo%CK5xzV+h2<2l@!JLSrVU;qa@h*_c3DhV$4}B8Do=DO!m>-&e zjw%P&@P>wajeEX^OjCG9xV^diF7nqG0UBb-nll6#0t^9$07F1+1WKZseP?(rUx`Z> z*JI4?hGPjYa$i!8eAAJ#tM=#D$Y+-MTe*T)%!j*XWgB z6rnGCG=2a*au2gb0uhe*{zA!+vd4}+^=BBB>fhi?Es79dKz ziU8l~B()*6BT~1}Irqd&S98gnci~3jzv9lKMBE6Ni{D6U!<;FFp=Us2%iluq{-ddS zkrhdKasfe0e}~6fb(0OIKLasK#N)69QBRV^ol>44YJ;XYWTEalmC(Ga6@o`k#(K0s z3oAk7d%ZenLDFwN+q52A<(WA3u#+6w-x(33(zC&tU)F>yqb%N=U|&3qe>q zelju5(_|lOG`iLs)4vfk!v#H5l_IKcXkJgE!AC?OJV_r`zO7N8%Ok3XI-OggPQX^g z9=L)>U8r(5AS}rQ zU5DC=>xtRR$w@14fcimp>5HKQ9ns8+(yY{c=q!TgZNZ_C)tFX97fa_hM|n9~?`^;) z?C#PZGeX*-Q4L*UCiOR>R<6V101`cK-U^(5TmjDO{v;9Nst~_lV#0Jh2rI`1<1YCM z;>xd0(7uL*OnZC|e|d-Fqk%p8E$S(0PiIZdo>I>_1^R|A#&CP+_`qc6G6(dIyjJUN()jM+8Q8aTP zU;i1&Zi{bWfmn&!7_es@T66fN_PHApf>4+LVNmnZR9RBK;d#({_-?pG2u(6y@2+rc zR}19`wxZYfa3)|oRt1D(O~0bh+fT>R)_RlmKYtu+gI|)=yv~>~#}#&T&B!n2FOM%` z=k&kGS|31A+xqb8P*Jd_IHeVTh+ZIK);2<5RYr@kgV3{YLkV6~-gO-D--K-;H?VDS z6l^!9m-T?m(ZK<&3@#yDVc*iB`F$$j+%0MyV=w(WW0cdiO?r%nh799g1D+PU5DFmH21GpV|!{dg#`N z%ZQ)Rt=<1%TdzW%54x3|Xy>P~XsSbc(9*DBLl_tkpPAfHbj;9w{sP3)m+Ig}@FItN zF?61ZRbw1wOkZ?N+hOcPV%9_mpy2s^$RX%uGX=Ybf5Sv#1fh+hW8{c2i@flR5XA~( z8M?w}wmmk?*rdMip-vSzjhTX>&*+?Ip$9oq3kh=MGZTgzW?_A{`yLXrsTN%bfp-i+ z3VIO@4V^J%habL8Cax*Z{=tV&gfKVEL}m&Z9OmN}nME{*>qIYnUF3(usomX*2_ zVv36nzZSvH&0!_;jx9-txc)V2csQYf%sq*^8QkM(Ojh$-I@QpkS38onafjj_Cer9L zw!`l|CVTne*_#jeL`Y(JpHs~SeTmS?1IY7C%+~z2U_m?TU!1)~j>gHv;N%7ORtSj( zkGg2llqU^zP{N`KTHBC-UDv{KHb%n8rZbFA^?GPw1H@7SKxpN}jqwg0J=&nWg7ucf z=aIJzqb&2qGuR$Y2(U(knDTXo9Y@H}!Hb}rRcj1f`YRzCh+iZnp_EvH!JsXMPUs>g zv}iZos%Ylkf)H+`&$SPz>fIOJI6{lN3F8jV=;dKTE)wwk6%BDm3r|=OvTv-rpgp~( z3uF5Z_<2wra{du7lfFPPsOVd~FzJQ~6IzQ2Ev{Qt*bR3@SNiuUDGm>xC|a@6W-{gb zYdky_PpayowR;l@K|@;*9eBNy?%^(PH6`f$@o_bDU)m2&Qv3vc5RWKgsV22VO^(Bf zWtT|r2I%+KuW;!gCbXzHor>mgnlJ(roXJKPSnO$My}#i_Y#c$6;M}b>nsI~{H!4ch zutm?2ZOEOMxEk|HEo-(^YpI{nb8uq;USv<#Xbk6pWDipD@yYnCxM=i_Owlp2gd??7 zRM@wq8UO4^_b#c+0FE*PX6Qnby++8r+vka$_)E$2)k#cf(Q$RFpwWDMqYhEdl`n0lC)tO~=p0|^m0T(gG$Q$mReP~-ULQ0tESh?Q zJ1Y&V!Ao$ASTlLr@SW`8IX3{u)(jv96qz7cf+rq9_E27X9F6E!_RXihFO4nWq4%2=%hbF6-rMl}`5RSna z&MoT5rPt(1t|oAHs-yV(R|1N3o*M1(j3BD2Pf-}Pn~HsV{V>s)Sj6##?m5Xb)|f=Q z??s=bb2Q5RSH4A_{nUm@2bny5sl9?Tlr$2$Nl{pM7pv$?2s?NSKieu=K`Ed|*xMFE z+hF@(>T1{u#=MmibuqkW1=o4?QS`tHS?jH2v5TR8HxJb2n9?r-VxtMnlvsuFjSXmx{sIeKPjB^Frl6 zi=vzfNu`kL$SBvKJggmSD_D*}uL|nemnRlSa?Mp;7B)boCWLwkxrFWhA<%WPMbqZg zs*IM>u%5IO`zERAtON&|bG4dvEz*IKW2xo)lZS{(BG)#}VQWz;^#*^YQvnTswt;?d zu$ZXiEbO$g-l;goE(^o~y|%DzWho(`h^cb({@8rGKd(i)pE@<#Vb<+-D%%yVSPAvW z-AI)!+x`*Lc!Q-@{t6cS)j`4B;q0rl!}L?6v>!_D&qxwUjti_I#Cs zSzGdr#?Pj(B@~E(DhCseV;C|dgxR7*iL?t`DxxK#FmvKTLGE32nb zDn=a=$H>W*9x?)nTUaRWJtL}DD-FGpyp4%2A@R0Ac1r2to8Em{c=#)-SG&OrxPz}t z{VYoKSSzPTWwcumia3?PrgNXJJ;8t;vc)v*^^$GOU1_en5+O>fD2cj&GhR`+t=9|_ z&Nfr1R;bWukEe}UVP*T9AF!|$28YH$ZugVBbPu<~;05&H8w);l8({F3v$Fltd?rX= zmG{%uUodKxo$^mkCI?8y-6P@T1-CL<^|nT38L7NWSsGSQ3ZoMef{Q3GCY!{pu*AyA zyb>x@tN>#|I;L80@$QEILtpp064o>sukX?13{}vOFzPZYNyp=fnU8q-_??2)PI+@f z2s~%Sy-Mn$3}u2URYt|~n()c|pyKH8QOD0C>i9VlHGLL5$DZbID*3DcQ)3c`EYqbN z8V~FY&JHYOJC+U}g+3&D_`r$#5qbQwY@~L%v6SK<*G7Cv(i%N~3HmQpdHWiuq!e_r zwl!Hu<{+PBDm5q%w9**{*eJ9Qt4ob$c!Vt(F1d5@YnH4$?`VId3HuS#YZ`${1JXT*uxfe&R?i8hJ_k zMG&`37?fW71EnF6xXM{|!Nffk5w>{;i2+4i#Yp)`2`6nqG4`QZ5+!F5iou}ple^e2%T_v=>rjn!#E z7<=1pb+OI+8m``ShBb{nCUrM#BTk~AjvT&?G93AP?2{po0R(8w4L>ufk?+3&2M{pW%Y~^afZF4hNeCEICk#=P#>L5_u z05zJlB1cQ~@p^`s$Y>nfcK{nsJr(pO7F$vK@drJ0>!Hh#u5fE_3tLMgluBc11Ol{n z>e{&vf{yIanmi^*eFSJY0ajEYP!6?iEP>!-Snt09HT4FQDLIRiXT#Z>l_Xq@3+Kbh*c97(cmhebrL$#Fdz= zstlUZ&8YPNcth$pW|TLXQR(k&$Eq@DHFsaOkkL&lP0D4w6ciKicu zaCgftarVh;!C2h)6DDwh=+oZ%G-KbkvEpO`R6&|hU`X3aWW`7+T^)^UK83%=7Fzti zU5l`@Ptdb@1C-!0b&`l*0(V0?gjz)@j%xK}jTiz90fs=XK;UBZ1x^nuiw4~1!TpCh zOQ+g(Yi6l_hxUiy@~v}NyI@rM&7?oLZh6;zKsWQ`swFXF)4QtvVtBZ zQQfX128Zh<&$7WIts`^h`+<^Js*fdqcu+rC-F+!XJ^~Lof0E-hIRh0(FUfnyA0v8@#0{ z4q=Oq4ie^p6Rn4e<`u}<3tYdWYP?T)7W06#AyGGLl*<}sOY{nt*PbBEktMoqSc|>4 z{V;AwE7)~tP7YgG*C>w9A3mlJhPGRf$lcad2X_z5yS)qRH@J#@5`(Yd?i*>0cMV4s zn7o~Pj8{q*nfQo4e1I4#nfj0lf}CY;z2#LUk?Wh2sD>RnV9@qW*c&z--8i4bYq)Sd zJsOty0)`(aDg1ysgQsJC>|ShM)EzCjH6xgjAY{cpB_lm4@*2@=@f`K>@jwjjCx6Au z%U4OTDWT6HZIwA3sRUI;ltH}}<)#08iQ*sQdYZ2^ic(n(Lx3Srun>s7eS@2@MO_Q& z#Iu^!q65*0?&V8Y)Jm#CYNkbHZ3y^FItO-A5D}mhU2Zr?aM9Y<==#e@Y&y9U$9DO^ z=Qk(Rm+?Umn{92m_LgXzT{;617f*41?ewLDzNE0CT?B-gU4$=wG|gexu3d5G&K>Oz zn2)5Xis%huXeEx8?gLjd4dTG)7@-;YhWuCn@l6*-=q7R4Z9HdV)!q%5=UQ83gz<43qd2q%3DBb4PeCjN#sJDT9*u_zoqMHq)}c4#OQ!Mzx& zSk)yI)knl0xPnJqpe7mV5GC9qfd}GAr7$IVU zw{hw~99Q%9ULsO0^aYKyar*i^mXd&3E_PcHBMsif3nr#p^(|p;z+Y$lv#@DR*ikvr z=W+4&Cq+S`H@JQBKnV}rN=Xj~2x45}4QXK94)l0m7s{!#R$#|fjMEnh7?uk=^3ey@&#>g;^x}{K- z;{WO%9>vQC%J_swC(ma-N;{`xde4_O$Kru!p9}%?I=qR{;LH{vUv7m{7Y}pus$yIv z+vZ18DN<9duI=2lHYSxt=aSuN8nre7CMbU*P@+8Q**js-?<7^?)gVG}O~J61)pBgE ziEk4)-*)QX&VTEkW6Bh;f!nulkE>U&7O+`sI9(DSghs7ja5j!ax#y1!nBeLND}^+S z>d2-M?K_j`+y@2n&SJ|1calCnvu2X&jL+II1adzDH0H_k=g+w>JT%odZRe|WrG3E7 zz@y|PSyj3-p#a|J>Jnn3`M_7y_b#ncghUs&gPrdzEKQ=;UwqVT+J{da7mPzYCgd|BJesLr!{K_3-pSTQ&)~HK`nrP-+8Ii%KvCF?IN_n(It%{Q6Px%{B z{z07Ys6Gi>UZ(<$sGtE+BUD5}ULNwkgl)f)Z>qh!!m(W~ZqCwxRKX;8mqA-OYdR_< zGwW@DI&DcR!H|}z&_IfoTV>G?Po5rIKi6OhrMT6_fjV1)VaLPZi#O{vdeMsd_FM=~bR{YFz-hQf5B zME8^zxVC*amWO^t9Wwp96qZaC`h0c3Q0HhY4yMmn5lrL961~Sg5?y>QNpr|b-a