From 8b3dc00aff049e7531159021a67118b8b142d0a0 Mon Sep 17 00:00:00 2001 From: Zhouxing Shi Date: Wed, 30 Nov 2022 01:30:08 -0600 Subject: [PATCH] November 2022 release Co-Authored-By: Yihan Wang Co-Authored-By: Huan Zhang <8021844+huanzhang12@users.noreply.github.com> Co-Authored-By: Zhuolin Yang <13509408+Lucas110550@users.noreply.github.com> --- .gitignore | 1 - .travis.yml | 20 -- README.md | 12 +- README_abcrown.md | 245 ++++++++++++++ auto_LiRPA/__init__.py | 2 +- auto_LiRPA/backward_bound.py | 31 +- auto_LiRPA/bound_general.py | 268 ++++++++------- auto_LiRPA/bound_op_map.py | 6 +- auto_LiRPA/bounded_tensor.py | 30 +- auto_LiRPA/cuda_utils.py | 9 +- auto_LiRPA/forward_bound.py | 28 +- auto_LiRPA/interval_bound.py | 14 +- auto_LiRPA/jacobian.py | 245 ++++++++++++++ auto_LiRPA/operators/__init__.py | 7 +- auto_LiRPA/operators/activation_base.py | 273 +++++++++++++++ .../{activation.py => activations.py} | 279 +--------------- auto_LiRPA/operators/base.py | 49 +-- auto_LiRPA/operators/bivariate.py | 11 +- auto_LiRPA/operators/constant.py | 19 +- auto_LiRPA/operators/convolution.py | 113 ++++--- auto_LiRPA/operators/gradient_bounds.py | 316 ++++++++++++++++++ auto_LiRPA/operators/gradient_modules.py | 145 ++++++++ auto_LiRPA/operators/leaf.py | 14 +- auto_LiRPA/operators/linear.py | 33 +- auto_LiRPA/operators/nonlinear.py | 20 +- auto_LiRPA/operators/normalization.py | 1 + auto_LiRPA/operators/pooling.py | 95 ++++-- auto_LiRPA/operators/reduce.py | 62 ++-- auto_LiRPA/operators/rnn.py | 16 +- auto_LiRPA/operators/shape.py | 105 ++---- auto_LiRPA/operators/softmax.py | 6 +- auto_LiRPA/optimized_bounds.py | 74 ++-- auto_LiRPA/patches.py | 14 +- auto_LiRPA/perturbations.py | 8 +- auto_LiRPA/solver_module.py | 16 +- auto_LiRPA/utils.py | 20 +- examples/sequence/lstm.py | 8 +- examples/vision/cifar_training.py | 4 +- examples/vision/jacobian.py | 125 +++++++ examples/vision/pretrain/README.md | 1 - examples/vision/pretrained/cifar_2c2f.pth | Bin 0 -> 406287 bytes .../{pretrain => pretrained}/kw_mnist.pth | Bin .../{pretrain => pretrained}/mnist_a_adv.pth | Bin .../mnist_cnn_small.pth | Bin examples/vision/simple_verification.py | 2 +- examples/vision/verify_two_node.py | 2 +- setup.py | 4 +- tests/auto_LiRPA | 1 - tests/data/jacobian_test_data | Bin 0 -> 747 bytes tests/data/maxpool_test_data_3-0-3-0 | Bin 11456 -> 10432 bytes tests/data/maxpool_test_data_3-0-3-1 | Bin 13056 -> 10688 bytes tests/data/maxpool_test_data_3-1-3-0 | Bin 0 -> 10432 bytes tests/data/maxpool_test_data_3-1-3-1 | Bin 0 -> 10880 bytes tests/data/maxpool_test_data_4-0-4-0 | Bin 10496 -> 10112 bytes tests/data/maxpool_test_data_4-0-4-1 | Bin 10496 -> 10432 bytes tests/data/maxpool_test_data_4-1-4-0 | Bin 0 -> 10176 bytes tests/data/maxpool_test_data_4-1-4-1 | Bin 0 -> 10432 bytes tests/requirements.txt | 2 + tests/test_1d_activation.py | 3 +- tests/test_constant.py | 12 +- tests/test_jacobian.py | 64 ++++ tests/test_maxpool.py | 27 +- tests/test_resnet_patches.py | 14 +- tests/test_simple_verification.py | 2 +- tests/testcase.py | 37 +- 65 files changed, 2029 insertions(+), 886 deletions(-) delete mode 100644 .travis.yml create mode 100644 README_abcrown.md create mode 100644 auto_LiRPA/jacobian.py create mode 100644 auto_LiRPA/operators/activation_base.py rename auto_LiRPA/operators/{activation.py => activations.py} (83%) create mode 100644 auto_LiRPA/operators/gradient_bounds.py create mode 100644 auto_LiRPA/operators/gradient_modules.py create mode 100644 examples/vision/jacobian.py delete mode 100644 examples/vision/pretrain/README.md create mode 100644 examples/vision/pretrained/cifar_2c2f.pth rename examples/vision/{pretrain => pretrained}/kw_mnist.pth (100%) rename examples/vision/{pretrain => pretrained}/mnist_a_adv.pth (100%) rename examples/vision/{pretrain => pretrained}/mnist_cnn_small.pth (100%) delete mode 120000 tests/auto_LiRPA create mode 100644 tests/data/jacobian_test_data create mode 100644 tests/data/maxpool_test_data_3-1-3-0 create mode 100644 tests/data/maxpool_test_data_3-1-3-1 create mode 100644 tests/data/maxpool_test_data_4-1-4-0 create mode 100644 tests/data/maxpool_test_data_4-1-4-1 create mode 100644 tests/requirements.txt create mode 100644 tests/test_jacobian.py diff --git a/.gitignore b/.gitignore index 3ace7db..264e72a 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ Verified-acc*.npy vnn-comp_*.npz *.tar.gz verifier_log_* -*.pth *.pt .idea *.so diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 8c80a27..0000000 --- a/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -language: python -python: - - "3.8" -install: - - pip install --editable . - - cd examples - - pip install -r requirements.txt - - pip install git+https://github.com/KaidiXu/onnx2pytorch.git - - pip install onnxruntime - - cd .. - - sudo fallocate -l 16G /swapfile - - sudo chmod 600 /swapfile - - sudo mkswap /swapfile - - sudo swapon /swapfile - - free -h -script: - - cd tests - - python utils/download_models.py - - pytest - - cd .. \ No newline at end of file diff --git a/README.md b/README.md index 5452da2..0c87c95 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # auto_LiRPA: Automatic Linear Relaxation based Perturbation Analysis for Neural Networks -![](https://travis-ci.com/KaidiXu/auto_LiRPA.svg?token=HM3jb55xV1sMRsVKBr8b&branch=master&status=started) [![Documentation Status](https://readthedocs.org/projects/auto-lirpa/badge/?version=latest)](https://auto-lirpa.readthedocs.io/en/latest/?badge=latest) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://PaperCode.cc/AutoLiRPA-Demo) [![Video Introduction](https://img.shields.io/badge/play-video-red.svg)](http://PaperCode.cc/AutoLiRPA-Video) @@ -13,6 +12,7 @@ ## What's New? +- Bound computation for higher-order computational graphs to support bounding Jacobian, Jacobian-vector products, and [local Lipschitz constants](https://arxiv.org/abs/2210.07394). (11/2022) - Our neural network verification tool [α,β-CROWN](https://github.com/huanzhang12/alpha-beta-CROWN.git) ([alpha-beta-CROWN](https://github.com/huanzhang12/alpha-beta-CROWN.git)) (using `auto_LiRPA` as its core library) **won** [VNN-COMP 2022](https://sites.google.com/view/vnn2022). Our library supports the large CIFAR100, TinyImageNet and ImageNet models in VNN-COMP 2022. (09/2022) - Implementation of **general cutting planes** ([GCP-CROWN](https://arxiv.org/pdf/2208.05740.pdf)), support of more activation functions and improved performance and scalability. (09/2022) - Our neural network verification tool [α,β-CROWN](https://github.com/huanzhang12/alpha-beta-CROWN.git) ([alpha-beta-CROWN](https://github.com/huanzhang12/alpha-beta-CROWN.git)) **won** [VNN-COMP 2021](https://sites.google.com/view/vnn2021) **with the highest total score**, outperforming 11 SOTA verifiers. α,β-CROWN uses the `auto_LiRPA` library as its core bound computation library. (09/2021) @@ -91,7 +91,7 @@ user-defined ranges. We get guaranteed output ranges (bounds): ## Installation -Python 3.7+ and PyTorch 1.8+ are required. +Python 3.7+ and PyTorch 1.11+ are required. PyTorch 1.11 is recommended, although other recent versions might also work. It is highly recommended to have a pre-installed PyTorch that matches your system and our version requirement. @@ -159,10 +159,12 @@ We provide [a wide range of examples](doc/src/examples.md) of using `auto_LiRPA` * [Certified Adversarial Defense Training on Sequence Data with **LSTM**](doc/src/examples.md#certified-adversarial-defense-training-for-lstm-on-mnist) * [Certifiably Robust Language Classifier using **Transformers**](doc/src/examples.md#certifiably-robust-language-classifier-with-transformer-and-lstm) * [Certified Robustness against **Model Weight Perturbations**](doc/src/examples.md#certified-robustness-against-model-weight-perturbations-and-certified-defense) +* [Bounding **Jacobian** and **local Lipschitz constants**](examples/vision/jacobian.py) `auto_LiRPA` has also be used in the following works: * [**α,β-CROWN for complete neural network verification**](https://github.com/huanzhang12/alpha-beta-CROWN) * [**Fast certified robust training**](https://github.com/shizhouxing/Fast-Certified-Robust-Training) +* [**Computing local Lipschitz constants**](https://github.com/shizhouxing/Local-Lipschitz-Constants) ## Full Documentations @@ -183,7 +185,7 @@ The general LiRPA based bound propagation algorithm was originally proposed in o NeurIPS 2020 Kaidi Xu\*, Zhouxing Shi\*, Huan Zhang\*, Yihan Wang, Kai-Wei Chang, Minlie Huang, Bhavya Kailkhura, Xue Lin, Cho-Jui Hsieh (\* Equal contribution) -The `auto_LiRPA` library is further extended to allow optimized bound (α-CROWN), split constraints (β-CROWN) and general constraints (GCP-CROWN): +The `auto_LiRPA` library is further extended to allow optimized bound (α-CROWN), split constraints (β-CROWN) general constraints (GCP-CROWN), and higher-order computational graphs: * [Fast and Complete: Enabling Complete Neural Network Verification with Rapid and Massively Parallel Incomplete Verifiers](https://arxiv.org/pdf/2011.13824.pdf). ICLR 2021. @@ -196,6 +198,10 @@ Shiqi Wang\*, Huan Zhang\*, Kaidi Xu\*, Suman Jana, Xue Lin, Cho-Jui Hsieh and Z * [GCP-CROWN: General Cutting Planes for Bound-Propagation-Based Neural Network Verification](https://arxiv.org/abs/2208.05740). Huan Zhang\*, Shiqi Wang\*, Kaidi Xu\*, Linyi Li, Bo Li, Suman Jana, Cho-Jui Hsieh and Zico Kolter (\* Equal contribution). +* [Efficiently Computing Local Lipschitz Constants of Neural Networks via Bound Propagation](https://arxiv.org/abs/2210.07394). +NeurIPS 2022. +Zhouxing Shi, Yihan Wang, Huan Zhang, Zico Kolter, Cho-Jui Hsieh. + Certified robust training using `auto_LiRPA` is improved to allow much shorter warmup and faster training: * [Fast Certified Robust Training with Short Warmup](https://arxiv.org/pdf/2103.17268.pdf). NeurIPS 2021. diff --git a/README_abcrown.md b/README_abcrown.md new file mode 100644 index 0000000..339f4ed --- /dev/null +++ b/README_abcrown.md @@ -0,0 +1,245 @@ +α,β-CROWN (alpha-beta-CROWN): A Fast and Scalable Neural Network Verifier with Efficient Bound Propagation +====================== + +

+ +

+ +α,β-CROWN (alpha-beta-CROWN) is a neural network verifier based on an efficient +bound propagation algorithm ([CROWN](https://arxiv.org/pdf/1811.00866.pdf)) and +branch and bound. It can be accelerated efficiently on **GPUs** and can scale +to relatively large convolutional networks. It also supports a wide range of +neural network architectures (e.g., **CNN**, **ResNet**, and various activation +functions), thanks to the versatile +[auto\_LiRPA](http://github.com/KaidiXu/auto_LiRPA) library developed by us. +α,β-CROWN can provide **provable robustness guarantees against adversarial +attacks** and can also verify other general properties of neural networks. + +α,β-CROWN is the **winning verifier** in [VNN-COMP +2021](https://sites.google.com/view/vnn2021) and [VNN-COMP +2022](https://sites.google.com/view/vnn2022) (International Verification of +Neural Networks Competition) with the highest total score, outperforming many +other neural network verifiers on a wide range of benchmarks over 2 years. +Details of competition results can be found in [VNN-COMP 2021 +slides](https://docs.google.com/presentation/d/1oM3NqqU03EUqgQVc3bGK2ENgHa57u-W6Q63Vflkv000/edit#slide=id.ge4496ad360_14_21), +[report](https://arxiv.org/abs/2109.00498) and [VNN-COMP 2022 slides (page +73)](https://drive.google.com/file/d/1nnRWSq3plsPvOT3V-drAF5D8zWGu02VF/view?usp=sharing). + +Supported Features +---------------------- + +

+ +

+ +Our verifier consists of the following core algorithms: + +* **β-CROWN** ([Wang et al. 2021](https://arxiv.org/pdf/2103.06624.pdf)): complete verification with **CROWN** ([Zhang et al. 2018](https://arxiv.org/pdf/1811.00866.pdf)) and branch and bound +* **α-CROWN** ([Xu et al., 2021](https://arxiv.org/pdf/2011.13824.pdf)): incomplete verification with optimized CROWN bound +* **GCP-CROWN** ([Zhang et al. 2021](https://arxiv.org/pdf/2208.05740.pdf)): CROWN-like bound propagation with general cutting plane constraints. +* **BaB-Attack** ([Zhang et al. 2021](https://proceedings.mlr.press/v162/zhang22ae/zhang22ae.pdf)): Branch and bound based adversarial attack for tackling hard instances. +* **MIP** ([Tjeng et al., 2017](https://arxiv.org/pdf/1711.07356.pdf)): mixed integer programming (slow but can be useful on small models). + +We support these neural network architectures: + +* Layers: fully connected (FC), convolutional (CNN), pooling (average pool and max pool), transposed convolution +* Activation functions: ReLU (incomplete/complete verification); sigmoid, tanh, arctan, sin, cos, tan (incomplete verification) +* Residual connections and other irregular graphs + +We support the following verification specifications: + +* Lp norm perturbation (p=1,2,infinity, as often used in robustness verification) +* VNNLIB format input (at most two layers of AND/OR clause, as used in VNN-COMP 2021 and 2022) +* Any linear specifications on neural network output (which can be added as a linear layer) + +We provide many example configurations in +[`complete_verifier/exp_configs`](/complete_verifier/exp_configs) directory to +start with: + +* MNIST: MLP and CNN models +* CIFAR-10, CIFAR-100, TinyImageNet: CNN and ResNet models +* ACASXu, NN4sys and other low input-dimension models + +See the [Guide on Algorithm +Selection](/complete_verifier/docs/abcrown_usage.md#guide-on-algorithm-selection) +to find the most suitable example to get started. + +Installation and Setup +---------------------- + +α,β-CROWN is tested on Python 3.7+ and PyTorch 1.11. It can be installed +easily into a conda environment. If you don't have conda, you can install +[miniconda](https://docs.conda.io/en/latest/miniconda.html). + +```bash +# Remove the old environment, if necessary. +conda deactivate; conda env remove --name alpha-beta-crown +# install all dependents into the alpha-beta-crown environment +conda env create -f complete_verifier/environment.yml --name alpha-beta-crown +# activate the environment +conda activate alpha-beta-crown +``` + +If you use the α-CROWN and/or β-CROWN verifiers (which covers the most use +cases), a Gurobi license is *not needed*. If you want to use MIP based +verification algorithms (feasible only for small MLP models), you need to +install a Gurobi license with the `grbgetkey` command. If you don't have +access to a license, by default the above installation procedure includes a +free and restricted license, which is actually sufficient for many relatively +small NNs. If you use the GCP-CROWN verifier, an installation of IBM CPlex +solver is required. Instructions to install the CPlex solver can be found +in the [VNN-COMP benchmark instructions](/complete_verifier/docs/vnn_comp.md#installation) +or the [GCP-CROWN instructions](https://github.com/tcwangshiqi-columbia/GCP-CROWN). + +If you prefer to install packages manually rather than using a prepared conda +environment, you can refer to this [installation +script](/vnncomp_scripts/install_tool_general.sh). + +If you want to run α,β-CROWN verifier on the VNN-COMP 2021 and 2022 benchmarks +(e.g., to make a comparison to a new verifier), you can follow [this +guide](/complete_verifier/docs/vnn_comp.md). + +Instructions +---------------------- + +We provide a unified front-end for the verifier, `abcrown.py`. All parameters +for the verifier are defined in a `yaml` config file. For example, to run +robustness verification on a CIFAR-10 ResNet network, you just run: + +```bash +conda activate alpha-beta-crown # activate the conda environment +cd complete_verifier +python abcrown.py --config exp_configs/cifar_resnet_2b.yaml +``` + +You can find explanations for most useful parameters in [this example config +file](/complete_verifier/exp_configs/cifar_resnet_2b.yaml). For detailed usage +and tutorial examples please see the [Usage +Documentation](/complete_verifier/docs/abcrown_usage.md). We also provide a +large range of examples in the +[`complete_verifier/exp_configs`](/complete_verifier/exp_configs) folder. + + +Publications +---------------------- + +If you use our verifier in your work, **please kindly cite our CROWN**([Zhang +et al., 2018](https://arxiv.org/pdf/1811.00866.pdf)), **α-CROWN** ([Xu et al., +2021](https://arxiv.org/pdf/2011.13824.pdf)), **β-CROWN**([Wang et al., +2021](https://arxiv.org/pdf/2103.06624.pdf)) and **GCP-CROWN**([Zhang et al., +2022](https://arxiv.org/pdf/2208.05740.pdf)) papers. If your work involves the +convex relaxation of the NN verification please kindly cite [Salman et al., +2019](https://arxiv.org/pdf/1902.08722). If your work deals with +ResNet/DenseNet, LSTM (recurrent networks), Transformer or other complex +architectures, or model weight perturbations please kindly cite [Xu et al., +2020](https://arxiv.org/pdf/2002.12920.pdf). If you use our branch and bound +based adversarial attack (falsifier), please cite [Zhang et al. +2022](https://proceedings.mlr.press/v162/zhang22ae/zhang22ae.pdf). + +α,β-CROWN combines our existing efforts on neural network verification: + +* **CROWN** ([Zhang et al. NeurIPS 2018](https://arxiv.org/pdf/1811.00866.pdf)) is a very efficient bound propagation based verification algorithm. CROWN propagates a linear inequality backwards through the network and utilizes linear bounds to relax activation functions. + +* The **"convex relaxation barrier"** ([Salman et al., NeurIPS 2019](https://arxiv.org/pdf/1902.08722)) paper concludes that optimizing the ReLU relaxation allows CROWN (referred to as a "greedy" primal space solver) to achieve the same solution as linear programming (LP) based verifiers. + +* **LiRPA** ([Xu et al., NeurIPS 2020](https://arxiv.org/pdf/2002.12920.pdf)) is a generalization of CROWN on general computational graphs and we also provide an efficient GPU implementation, the [auto\_LiRPA](https://github.com/KaidiXu/auto_LiRPA) library. + +* **α-CROWN** (sometimes referred to as optimized CROWN or optimized LiRPA) is used in the Fast-and-Complete verifier ([Xu et al., ICLR 2021](https://arxiv.org/pdf/2011.13824.pdf)), which jointly optimizes intermediate layer bounds and final layer bounds in CROWN via variable α. α-CROWN typically has greater power than LP since LP cannot cheaply tighten intermediate layer bounds. + +* **β-CROWN** ([Wang et al., NeurIPS 2021](https://arxiv.org/pdf/2103.06624.pdf)) incorporates split constraints in branch and bound (BaB) into the CROWN bound propagation procedure via an additional optimizable parameter β. The combination of efficient and GPU accelerated bound propagation with branch and bound produces a powerful and scalable neural network verifier. + +* **BaB-Attack** ([Zhang et al., ICML 2022](https://proceedings.mlr.press/v162/zhang22ae/zhang22ae.pdf)) is a strong falsifier (adversarial attack) based on branch and bound, which can find adversarial examples for hard instances where gradient or input-space-search based methods cannot succeed. + +* **GCP-CROWN** ([Zhang et al., NeurIPS 2022](https://arxiv.org/pdf/2208.05740.pdf)) enables the use of general cutting planes methods for neural network verification in a GPU-accelerated and very efficient bound propagation framework. + +We provide bibtex entries below: + +``` +@article{zhang2018efficient, + title={Efficient Neural Network Robustness Certification with General Activation Functions}, + author={Zhang, Huan and Weng, Tsui-Wei and Chen, Pin-Yu and Hsieh, Cho-Jui and Daniel, Luca}, + journal={Advances in Neural Information Processing Systems}, + volume={31}, + pages={4939--4948}, + year={2018}, + url={https://arxiv.org/pdf/1811.00866.pdf} +} + +@article{xu2020automatic, + title={Automatic perturbation analysis for scalable certified robustness and beyond}, + author={Xu, Kaidi and Shi, Zhouxing and Zhang, Huan and Wang, Yihan and Chang, Kai-Wei and Huang, Minlie and Kailkhura, Bhavya and Lin, Xue and Hsieh, Cho-Jui}, + journal={Advances in Neural Information Processing Systems}, + volume={33}, + year={2020} +} + +@article{salman2019convex, + title={A Convex Relaxation Barrier to Tight Robustness Verification of Neural Networks}, + author={Salman, Hadi and Yang, Greg and Zhang, Huan and Hsieh, Cho-Jui and Zhang, Pengchuan}, + journal={Advances in Neural Information Processing Systems}, + volume={32}, + pages={9835--9846}, + year={2019} +} + +@inproceedings{xu2021fast, + title={{Fast and Complete}: Enabling Complete Neural Network Verification with Rapid and Massively Parallel Incomplete Verifiers}, + author={Kaidi Xu and Huan Zhang and Shiqi Wang and Yihan Wang and Suman Jana and Xue Lin and Cho-Jui Hsieh}, + booktitle={International Conference on Learning Representations}, + year={2021}, + url={https://openreview.net/forum?id=nVZtXBI6LNn} +} + +@article{wang2021beta, + title={{Beta-CROWN}: Efficient bound propagation with per-neuron split constraints for complete and incomplete neural network verification}, + author={Wang, Shiqi and Zhang, Huan and Xu, Kaidi and Lin, Xue and Jana, Suman and Hsieh, Cho-Jui and Kolter, J Zico}, + journal={Advances in Neural Information Processing Systems}, + volume={34}, + year={2021} +} + +@InProceedings{zhang22babattack, + title = {A Branch and Bound Framework for Stronger Adversarial Attacks of {R}e{LU} Networks}, + author = {Zhang, Huan and Wang, Shiqi and Xu, Kaidi and Wang, Yihan and Jana, Suman and Hsieh, Cho-Jui and Kolter, Zico}, + booktitle = {Proceedings of the 39th International Conference on Machine Learning}, + volume = {162}, + pages = {26591--26604}, + year = {2022}, +} + +@article{zhang2022general, + title={General Cutting Planes for Bound-Propagation-Based Neural Network Verification}, + author={Zhang, Huan and Wang, Shiqi and Xu, Kaidi and Li, Linyi and Li, Bo and Jana, Suman and Hsieh, Cho-Jui and Kolter, J Zico}, + journal={Advances in Neural Information Processing Systems}, + year={2022} +} +``` + +Developers and Copyright +---------------------- + +The α,β-CROWN verifier is developed by a team from CMU, UCLA, Drexel University, Columbia University and UIUC: + +Team lead: +* Huan Zhang (huan@huan-zhang.com), CMU + +Main developers: +* Kaidi Xu (kx46@drexel.edu), Drexel University +* Zhouxing Shi (zshi@cs.ucla.edu), UCLA +* Shiqi Wang (sw3215@columbia.edu), Columbia University + +Contributors: +* Linyi Li (linyi2@illinois.edu), UIUC +* Jinqi (Kathryn) Chen (jinqic@cs.cmu.edu), CMU +* Zhuolin Yang (zhuolin5@illinois.edu), UIUC +* Yihan Wang (yihanwang@ucla.edu), UCLA + +Advisors: +* Zico Kolter (zkolter@cs.cmu.edu), CMU +* Cho-Jui Hsieh (chohsieh@cs.ucla.edu), UCLA +* Suman Jana (suman@cs.columbia.edu), Columbia University +* Bo Li (lbo@illinois.edu), UIUC +* Xue Lin (xue.lin@northeastern.edu), Northeastern University + +Our library is released under the BSD 3-Clause license. A copy of the license is included [here](LICENSE). + diff --git a/auto_LiRPA/__init__.py b/auto_LiRPA/__init__.py index 3fbdb43..42981d0 100644 --- a/auto_LiRPA/__init__.py +++ b/auto_LiRPA/__init__.py @@ -5,4 +5,4 @@ from .wrapper import CrossEntropyWrapper, CrossEntropyWrapperMultiInput from .bound_op_map import register_custom_op, unregister_custom_op -__version__ = '0.3' +__version__ = '0.3.1' diff --git a/auto_LiRPA/backward_bound.py b/auto_LiRPA/backward_bound.py index 411ae9e..01d973f 100644 --- a/auto_LiRPA/backward_bound.py +++ b/auto_LiRPA/backward_bound.py @@ -121,10 +121,13 @@ def backward_general( # Initially, l.lA or l.uA will be set to C for this node. if l.lA is not None or l.uA is not None: if verbose: - logger.debug(f' Bound backward to {l}' - f' (lA shape {l.lA.shape if l.lA is not None else None},' - f' uA shape {l.uA.shape if l.uA is not None else None},' - f' out shape {l.output_shape})') + logger.debug(f' Bound backward to {l} (out shape {l.output_shape})') + if l.lA is not None: + logger.debug(' lA type %s shape %s', + type(l.lA), list(l.lA.shape)) + if l.uA is not None: + logger.debug(' uA type %s shape %s', + type(l.uA), list(l.uA.shape)) if _print_time: start_time = time.time() @@ -311,9 +314,13 @@ def get_sparse_C( newC = 'Patches' reduced_dim = True # We sum over the channel direction, so need to multiply that. - elif (sparse_conv_intermediate_bounds and unstable_size <= minimum_sparsity * dim and alpha_is_sparse is None) or alpha_is_sparse: - # When we already have sparse alpha for this layer, we always use sparse C. Otherwise we determine it by sparsity. - # Create an abstract C matrix, the unstable_idx are the non-zero elements in specifications for all batches. + elif (sparse_conv_intermediate_bounds + and unstable_size <= minimum_sparsity * dim + and alpha_is_sparse is None) or alpha_is_sparse: + # When we already have sparse alpha for this layer, we always + # use sparse C. Otherwise we determine it by sparsity. + # Create an abstract C matrix, the unstable_idx are the non-zero + # elements in specifications for all batches. # The shape of patches is [unstable_size, batch, C, H, W]. newC = Patches( shape=[unstable_size, batch_size, *node.output_shape[1:-2], 1, 1], @@ -330,7 +337,8 @@ def get_sparse_C( *node.output_shape[1:-2], 1, 1], 1, output_shape=[batch_size, *node.output_shape[1:]]) elif isinstance(node, (BoundAdd, BoundSub)) and node.mode == "patches": - # FIXME: BoundAdd does not always have patches. Need to use a better way to determine patches mode. + # FIXME: BoundAdd does not always have patches. Need to use a better way + # to determine patches mode. # FIXME: We should not hardcode BoundAdd here! if sparse_intermediate_bounds: if crown_batch_size < 1e9: @@ -341,8 +349,11 @@ def get_sparse_C( # Do nothing, no bounds will be computed. reduced_dim = True unstable_idx = [] - elif (sparse_conv_intermediate_bounds and unstable_size <= minimum_sparsity * dim and alpha_is_sparse is None) or alpha_is_sparse: - # When we already have sparse alpha for this layer, we always use sparse C. Otherwise we determine it by sparsity. + elif (sparse_conv_intermediate_bounds + and unstable_size <= minimum_sparsity * dim + and alpha_is_sparse is None) or alpha_is_sparse: + # When we already have sparse alpha for this layer, we always + # use sparse C. Otherwise we determine it by sparsity. num_channel = node.output_shape[-3] # Identity patch size: (ouc_c, 1, 1, 1, out_c, 1, 1). patches = ( diff --git a/auto_LiRPA/bound_general.py b/auto_LiRPA/bound_general.py index d02ebe0..37e7b17 100644 --- a/auto_LiRPA/bound_general.py +++ b/auto_LiRPA/bound_general.py @@ -1,3 +1,4 @@ +import copy import numpy as np import warnings from collections import OrderedDict, deque @@ -180,16 +181,45 @@ def __init__(self, model, global_input, bound_opts=None, # List of operators. When we are computing intermediate bounds for these # ops, we simply use IBP to propagate bounds from its input nodes, # instead of CROWN. - self.ibp_intermediate = [BoundRelu, BoundNeg, BoundTranspose] + # NOTE Currently only operators with a single input can be supported. + self.ibp_intermediate = [ + BoundRelu, + BoundNeg, + BoundTranspose, + BoundSin, + BoundCos, + BoundTan, + BoundAtan] # a placeholder to save the latest samplewise mask for # pruning-in-iteration optimization self.last_update_preserve_mask = None - @property - def perturbed_optimizable_activations(self): + def get_perturbed_optimizable_activations(self): return [n for n in self.optimizable_activations if n.perturbed] + def get_splittable_activations(self): + """ + Activation functions that can be split during branch and bound. + """ + # TODO: Add other activation functions in a sysmatic manner. + # Do not hard code relus or other functions. + # A node must be perturbed, otherwise it is a constant and no need + # to perturb. + return [n for n in self.relus if n.perturbed] + + def get_layers_requiring_bounds(self): + """ + Layer names whose intermediate layer bounds are required. + """ + intermediate_layers = [] + for node in self.modules(): + for i in getattr(node, 'requires_input_bounds', []): + input_node = node.inputs[i] + if input_node.used and input_node.perturbed: + intermediate_layers.append(input_node) + + return intermediate_layers def check_incompatible_nodes(self, model): """Check whether the model has incompatible nodes that the conversion @@ -454,14 +484,14 @@ def _mark_perturbed_nodes(self): queue.append(l) # in_degree ==0 -> root node while len(queue) > 0: - l = queue.popleft() + node = queue.popleft() # Obtain all output node, and add the output nodes to the queue if # all its input nodes have been visited. # The initial "perturbed" property is set in BoundInput or # BoundParams object, depending on ptb. - for name_next in l.output_name: + for name_next in node.output_name: node_next = self[name_next] - if isinstance(l, BoundShape): + if isinstance(node, BoundShape): # Some nodes like Shape, even connected, # do not really propagate bounds. # TODO: make this a property of node? @@ -469,12 +499,31 @@ def _mark_perturbed_nodes(self): else: # The next node is perturbed if it is already perturbed, # or this node is perturbed. - node_next.perturbed = node_next.perturbed or l.perturbed + node_next.perturbed = node_next.perturbed or node.perturbed degree_in[name_next] -= 1 # all inputs of this node have been visited, # now put it in queue. if degree_in[name_next] == 0: queue.append(node_next) + # Check whether weights are perturbed + if isinstance(node, (BoundLinear, BoundConv, BoundBatchNormalization)): + weight_perturbation = False + for n in node.inputs[1:]: + if hasattr(n, 'perturbation'): + if n.perturbation is not None: + weight_perturbation = True + if weight_perturbation: + node.requires_input_bounds = list(range(len(node.inputs))) + else: + if isinstance(node, BoundMatMul): + node.requires_input_bounds = [1] + else: + node.requires_input_bounds = [] + + self.splittable_activations =( + self.get_splittable_activations()) + self.perturbed_optimizable_activations = ( + self.get_perturbed_optimizable_activations()) return def _clear_and_set_new( @@ -669,7 +718,6 @@ def _convert_nodes(self, model, global_input): raise NotImplementedError('There are unsupported operations') for node in nodesIn + nodesOP: - node.bound_node.input_name = node.inputs node.bound_node.name = node.name nodes_dict = {} @@ -703,10 +751,6 @@ def add_nodes(self, nodes): for node in nodes: self._modules[node.name] = node node.output_name = [] - if not hasattr(node, 'input_name'): - node.input_name = [] - if isinstance(node.input_name, str): - node.input_name = [node.input_name] if len(node.inputs) == 0: self.root_name.append(node.name) for node in nodes: @@ -730,8 +774,6 @@ def add_input_node(self, node, index=None): def rename_nodes(self, nodesOP, nodesIn, rename_dict): def rename(node): node.name = rename_dict[node.name] - node.input_name = [ - rename_dict[name] for name in node.input_name] return node for i in range(len(nodesOP)): nodesOP[i] = rename(nodesOP[i]) @@ -837,18 +879,11 @@ def _convert(self, model, global_input): def check_prior_bounds(self, node): if node.prior_checked or not (node.used and node.perturbed): return - for n in node.inputs: self.check_prior_bounds(n) - - if getattr(node, 'nonlinear', False): - for n in node.inputs: - self.compute_intermediate_bounds(n, prior_checked=True) - for i in getattr(node, 'requires_input_bounds', []): self.compute_intermediate_bounds( node.inputs[i], prior_checked=True) - node.prior_checked = True def compute_intermediate_bounds(self, node, prior_checked=False): @@ -901,98 +936,96 @@ def compute_intermediate_bounds(self, node, prior_checked=False): else: # For the first linear layer, IBP can give the same tightness # as CROWN. - if self.check_IBP_first_linear(node): - return - - sparse_intermediate_bounds_with_ibp = self.bound_opts.get( - 'sparse_intermediate_bounds_with_ibp', True) - # Sparse intermediate bounds can be enabled - # if aux_reference_bounds are given. - # (this is enabled for ReLU only, and not for other - # activations.) - sparse_intermediate_bounds = (self.bound_opts.get( - 'sparse_intermediate_bounds', False) - and isinstance(self[node.output_name[0]], BoundRelu)) - - ref_intermediate_lb, ref_intermediate_ub = None, None - if sparse_intermediate_bounds: - if node.name not in self.aux_reference_bounds: - # If aux_reference_bounds are not available, - # we can use IBP to compute these bounds. - if sparse_intermediate_bounds_with_ibp: - with torch.no_grad(): - # Get IBP bounds for this layer; - # we set delete_bounds_after_use=True which does - # not save extra intermediate bound tensors. - ret_ibp = self.IBP_general( - node=node, delete_bounds_after_use=True) - ref_intermediate_lb = ret_ibp[0] - ref_intermediate_ub = ret_ibp[1] + if not self.check_IBP_first_linear(node): + sparse_intermediate_bounds_with_ibp = self.bound_opts.get( + 'sparse_intermediate_bounds_with_ibp', True) + # Sparse intermediate bounds can be enabled + # if aux_reference_bounds are given. + # (this is enabled for ReLU only, and not for other + # activations.) + sparse_intermediate_bounds = (self.bound_opts.get( + 'sparse_intermediate_bounds', False) + and isinstance(self[node.output_name[0]], BoundRelu)) + + ref_intermediate_lb, ref_intermediate_ub = None, None + if sparse_intermediate_bounds: + if node.name not in self.aux_reference_bounds: + # If aux_reference_bounds are not available, + # we can use IBP to compute these bounds. + if sparse_intermediate_bounds_with_ibp: + with torch.no_grad(): + # Get IBP bounds for this layer; + # we set delete_bounds_after_use=True which does + # not save extra intermediate bound tensors. + ret_ibp = self.IBP_general( + node=node, delete_bounds_after_use=True) + ref_intermediate_lb = ret_ibp[0] + ref_intermediate_ub = ret_ibp[1] + else: + sparse_intermediate_bounds = False else: - sparse_intermediate_bounds = False - else: - aux_bounds = self.aux_reference_bounds[node.name] - ref_intermediate_lb, ref_intermediate_ub = aux_bounds - - sparse_C = self.get_sparse_C( - node, sparse_intermediate_bounds, - ref_intermediate_lb, ref_intermediate_ub) - newC, reduced_dim, unstable_idx, unstable_size = sparse_C - - if unstable_idx is None or unstable_size > 0: - if self.return_A: - node.lower, node.upper, _ = self.backward_general( - C=newC, node=node, unstable_idx=unstable_idx, - unstable_size=unstable_size) - else: - # Compute backward bounds only when there are unstable - # neurons, or when we don't know which neurons are unstable. - node.lower, node.upper = self.backward_general( - C=newC, node=node, unstable_idx=unstable_idx, - unstable_size=unstable_size) - - if reduced_dim: - self.restore_sparse_bounds( - node, unstable_idx, unstable_size, + aux_bounds = self.aux_reference_bounds[node.name] + ref_intermediate_lb, ref_intermediate_ub = aux_bounds + + sparse_C = self.get_sparse_C( + node, sparse_intermediate_bounds, ref_intermediate_lb, ref_intermediate_ub) + newC, reduced_dim, unstable_idx, unstable_size = sparse_C - # node.lower and node.upper (intermediate bounds) are computed in - # the above function. If we have bound references, we set them here - # to always obtain a better set of bounds. - if node.name in reference_bounds: - ref_bounds = reference_bounds[node.name] - # Initially, the reference bound and the computed bound can be - # exactly the same when intermediate layer beta is 0. This will - # prevent gradients flow. So we need a small guard here. - if self.intermediate_constr is not None: - # Intermediate layer beta is used. - # Note that we cannot just take the reference bounds if - # they are better - this makes alphas have zero gradients. - new_lower = 0.9 * ref_bounds[0] + 0.1 * node.lower - new_upper = 0.9 * ref_bounds[1] + 0.1 * node.upper - node.lower = torch.max(new_lower, node.lower) - node.upper = torch.min(new_upper, node.upper) - # Additionally, if the reference bounds say a neuron is - # stable, we always keep it. (FIXME: this is for ReLU only). - lower_stable = ref_bounds[0] >= 0. - node.lower[lower_stable] = ref_bounds[0][lower_stable] - upper_stable = ref_bounds[1] <= 0. - node.upper[upper_stable] = ref_bounds[1][upper_stable] - else: - # Set the intermediate layer bounds using reference bounds, - # always choosing the tighter one. - node.lower = ( - torch.max(ref_bounds[0], node.lower).detach() - - node.lower.detach() + node.lower) - node.upper = ( - node.upper - (node.upper.detach() - - torch.min(ref_bounds[1], node.upper).detach())) - # Otherwise, we only use reference bounds to check which neurons - # are unstable. - - # FIXME (12/28): we should be consistent, and only use - # node.interval, do not use node.lower or node.upper! - node.interval = (node.lower, node.upper) + if unstable_idx is None or unstable_size > 0: + if self.return_A: + node.lower, node.upper, _ = self.backward_general( + C=newC, node=node, unstable_idx=unstable_idx, + unstable_size=unstable_size) + else: + # Compute backward bounds only when there are unstable + # neurons, or when we don't know which neurons are unstable. + node.lower, node.upper = self.backward_general( + C=newC, node=node, unstable_idx=unstable_idx, + unstable_size=unstable_size) + + if reduced_dim: + self.restore_sparse_bounds( + node, unstable_idx, unstable_size, + ref_intermediate_lb, ref_intermediate_ub) + + # node.lower and node.upper (intermediate bounds) are computed in + # the above function. If we have bound references, we set them here + # to always obtain a better set of bounds. + if node.name in reference_bounds: + ref_bounds = reference_bounds[node.name] + # Initially, the reference bound and the computed bound can be + # exactly the same when intermediate layer beta is 0. This will + # prevent gradients flow. So we need a small guard here. + if self.intermediate_constr is not None: + # Intermediate layer beta is used. + # Note that we cannot just take the reference bounds if + # they are better - this makes alphas have zero gradients. + new_lower = 0.9 * ref_bounds[0] + 0.1 * node.lower + new_upper = 0.9 * ref_bounds[1] + 0.1 * node.upper + node.lower = torch.max(new_lower, node.lower) + node.upper = torch.min(new_upper, node.upper) + # Additionally, if the reference bounds say a neuron is + # stable, we always keep it. (FIXME: this is for ReLU only). + lower_stable = ref_bounds[0] >= 0. + node.lower[lower_stable] = ref_bounds[0][lower_stable] + upper_stable = ref_bounds[1] <= 0. + node.upper[upper_stable] = ref_bounds[1][upper_stable] + else: + # Set the intermediate layer bounds using reference bounds, + # always choosing the tighter one. + node.lower = ( + torch.max(ref_bounds[0], node.lower).detach() + - node.lower.detach() + node.lower) + node.upper = ( + node.upper - (node.upper.detach() + - torch.min(ref_bounds[1], node.upper).detach())) + # Otherwise, we only use reference bounds to check which neurons + # are unstable. + + # FIXME (12/28): we should be consistent, and only use + # node.interval, do not use node.lower or node.upper! + node.interval = (node.lower, node.upper) def merge_A_dict(self, lA_dict, uA_dict): merged_A = {} @@ -1226,7 +1259,7 @@ def compute_bounds( root[i].dim = root[i].linear.lw.shape[1] dim_in += root[i].dim else: - # This inpute/parameter does not has perturbation. + # This input/parameter does not has perturbation. # Use plain tuple defaulting to Linf perturbation. root[i].interval = (value, value) root[i].forward_value = root[i].value = value @@ -1281,14 +1314,6 @@ def compute_bounds( for n in self._modules.values(): # Check whether all prior intermediate bounds already exist n.prior_checked = False - # check whether weights are perturbed and set nonlinear for the - # BoundMatMul operation - if isinstance(n, (BoundLinear, BoundConv, BoundBatchNormalization)): - n.nonlinear = False - for node in n.inputs[1:]: - if hasattr(node, 'perturbation'): - if node.perturbation is not None: - n.nonlinear = True if isinstance(i, BoundRelu): for node in i.inputs: if isinstance(node, BoundConv): @@ -1346,6 +1371,10 @@ def _set_used_nodes(self, final): if not n_pre.used: n_pre.used = True queue.append(n_pre) + # Based on "used" and "perturbed" properties, find out which + # layer requires intermediate layer bounds. + self.layers_requiring_bounds = ( + self.get_layers_requiring_bounds()) def add_intermediate_perturbation(self, node, perturbation): """Add perturbation to an intermediate node and it is treated as an @@ -1369,6 +1398,7 @@ def add_intermediate_perturbation(self, node, perturbation): from .beta_crown import ( beta_bias, save_best_intermediate_betas, print_optimized_beta) + from .jacobian import augment_gradient_graph, compute_jacobian_bounds from .solver_module import build_solver_module, _build_solver_input, _build_solver_general diff --git a/auto_LiRPA/bound_op_map.py b/auto_LiRPA/bound_op_map.py index c33d52e..7c490fa 100644 --- a/auto_LiRPA/bound_op_map.py +++ b/auto_LiRPA/bound_op_map.py @@ -1,8 +1,12 @@ -from .bound_ops import * +from .bound_ops import Bound, BoundLinear, BoundPrimConstant +from .bound_ops import BoundReluGrad, BoundConv2dGrad, BoundSqr bound_op_map = { 'onnx::Gemm': BoundLinear, 'prim::Constant': BoundPrimConstant, + 'grad::Relu': BoundReluGrad, + 'grad::Conv2d': BoundConv2dGrad, + 'grad::Sqr': BoundSqr, } def register_custom_op(op_name: str, bound_obj: Bound) -> None: diff --git a/auto_LiRPA/bounded_tensor.py b/auto_LiRPA/bounded_tensor.py index cb3302f..8b44413 100644 --- a/auto_LiRPA/bounded_tensor.py +++ b/auto_LiRPA/bounded_tensor.py @@ -5,7 +5,7 @@ import torch._C as _C -class BoundedTensor(Tensor): +class BoundedTensor(Tensor): @staticmethod # We need to override the __new__ method since Tensor is a C class def __new__(cls, x, ptb, *args, **kwargs): @@ -54,8 +54,8 @@ def _convert(cls, ret): return ret if isinstance(ret, Tensor): - if True: - # The current implementation does not seem to need non-leaf BoundedTensor + if True: + # The current implementation does not seem to need non-leaf BoundedTensor return ret else: # Enable this branch if non-leaf BoundedTensor should be kept @@ -64,26 +64,25 @@ def _convert(cls, ret): if isinstance(ret, tuple): ret = tuple(cls._convert(r) for r in ret) - return ret + return ret - if torch.__version__ >= '1.7': - @classmethod - def __torch_function__(cls, func, types, args=(), kwargs=None): - if kwargs is None: - kwargs = {} + @classmethod + def __torch_function__(cls, func, types, args=(), kwargs=None): + if kwargs is None: + kwargs = {} - if not all(issubclass(cls, t) for t in types): - return NotImplemented + if not all(issubclass(cls, t) for t in types): + return NotImplemented - with _C.DisableTorchFunction(): - ret = func(*args, **kwargs) - return cls._convert(ret) + with _C.DisableTorchFunction(): + ret = func(*args, **kwargs) + return cls._convert(ret) class BoundedParameter(nn.Parameter): def __new__(cls, data, ptb, requires_grad=True): return BoundedTensor._make_subclass(cls, data, requires_grad) - + def __init__(self, data, ptb, requires_grad=True): self.ptb = ptb self.requires_grad = requires_grad @@ -102,4 +101,3 @@ def __repr__(self): def __reduce_ex__(self, proto): raise NotImplementedError - diff --git a/auto_LiRPA/cuda_utils.py b/auto_LiRPA/cuda_utils.py index 912ac6c..5918bc4 100644 --- a/auto_LiRPA/cuda_utils.py +++ b/auto_LiRPA/cuda_utils.py @@ -1,6 +1,5 @@ import os import sys -import time import torch from torch.utils.cpp_extension import load, BuildExtension, CUDAExtension from setuptools import setup @@ -24,7 +23,7 @@ def _f(*args, **kwargs): setup( name='auto_LiRPA_cuda_utils', ext_modules=[CUDAExtension('auto_LiRPA_cuda_utils', [ - 'auto_LiRPA/cuda/cuda_utils.cpp', + 'auto_LiRPA/cuda/cuda_utils.cpp', 'auto_LiRPA/cuda/cuda_kernels.cu' ])], cmdclass={'build_ext': BuildExtension.with_options()}, @@ -35,7 +34,7 @@ def _f(*args, **kwargs): try: import auto_LiRPA_cuda_utils as _cuda_utils except: - print('CUDA modules have not been installed') + print('CUDA modules have not been installed') try: print('Building native CUDA modules...') code_dir = os.path.dirname(os.path.abspath(__file__)) @@ -50,11 +49,11 @@ def _f(*args, **kwargs): print(sys.exc_info()[2]) else: print('Set environment variable AUTOLIRPA_DEBUG_CUDA_BUILD=1 to view build log.') - _cuda_utils = DummyCudaClass() + _cuda_utils = DummyCudaClass() else: if os.environ.get('AUTOLIRPA_ENABLE_CUDA_BUILD', False): print('CUDA unavailable. Some features are disabled.') - _cuda_utils = DummyCudaClass() + _cuda_utils = DummyCudaClass() double2float = _cuda_utils.double2float diff --git a/auto_LiRPA/forward_bound.py b/auto_LiRPA/forward_bound.py index a090208..f21066e 100644 --- a/auto_LiRPA/forward_bound.py +++ b/auto_LiRPA/forward_bound.py @@ -1,10 +1,7 @@ -from auto_LiRPA.beta_crown import print_optimized_beta import torch -from torch import Tensor import warnings from .bound_ops import * from .utils import * -from .backward_bound import batched_backward from .linear_bound import LinearBound from .perturbations import PerturbationLpNorm @@ -32,7 +29,7 @@ def forward_general(self, C=None, node=None, concretize=False, offset=0): self.forward_general(node=l_pre, offset=offset) inp = [l_pre.linear for l_pre in node.inputs] node._start = '_forward' - if (C is not None and isinstance(node, BoundLinear) and + if (C is not None and isinstance(node, BoundLinear) and not node.is_input_perturbed(1) and not node.is_input_perturbed(2)): linear = node.bound_forward(self.dim_in, *inp, C=C) C_merged = True @@ -75,16 +72,14 @@ def forward_general(self, C=None, node=None, concretize=False, offset=0): prev_dim_in += self.root[i].dim linear.lower, linear.upper = lower, upper - if C is None: + if C is None: node.linear = linear node.lower, node.upper = lower, upper - + if self.bound_opts['forward_refinement']: need_refinement = False for out in node.output_name: out_node = self[out] - if getattr(out_node, 'nonlinear', False): - need_refinement = True for i in getattr(out_node, 'requires_input_bounds', []): if out_node.inputs[i] == node: need_refinement = True @@ -97,7 +92,7 @@ def forward_general(self, C=None, node=None, concretize=False, offset=0): def forward_general_dynamic( self, C=None, node=None, concretize=False, offset=0): max_dim = self.bound_opts['forward_max_dim'] - + if C is None: if hasattr(node, 'linear'): assert not concretize @@ -142,7 +137,7 @@ def forward_general_dynamic( return node.lower, node.upper else: if offset > 0: - lb = torch.zeros_like(node.lower) + lb = torch.zeros_like(node.lower) else: lb = node.lower node.linear = LinearBound(None, lb, None, lb, node.lower, node.upper) @@ -158,7 +153,7 @@ def forward_general_dynamic( linear_inp.upper = getattr(l_pre, 'upper', None) inp.append(linear_inp) node._start = '_forward' - if (C is not None and isinstance(node, BoundLinear) and + if (C is not None and isinstance(node, BoundLinear) and not node.is_input_perturbed(1) and not node.is_input_perturbed(2)): linear = node.bound_dynamic_forward( *inp, C=C, max_dim=max_dim, offset=offset) @@ -211,7 +206,7 @@ def forward_general_dynamic( if C is None: node.lower, node.upper = lower, upper - + return lower, upper else: return linear @@ -220,7 +215,7 @@ def forward_general_dynamic( def clean_memory(self, node): """ Remove linear bounds that are no longer needed. """ # TODO add an option to retain these bounds - + for inp in node.inputs: if hasattr(inp, 'linear') and inp.linear is not None: clean = True @@ -236,7 +231,7 @@ def clean_memory(self, node): def forward_refinement(self, node): - """ Refine forward bounds with backward bound propagation + """ Refine forward bounds with backward bound propagation (only refine unstable positions). """ unstable_size_before = torch.logical_and(node.lower < 0, node.upper > 0).sum() if unstable_size_before == 0: @@ -274,10 +269,10 @@ def init_forward(self, root, dim_in): raise NotImplementedError( 'For dynamic forward bounds, only Linf (box) perturbations are supported, and x_L and x_U must be explicitly provided.') root[i].linear.x_L = ( - ptb.x_L_sparse.view(batch_size, -1) if ptb.sparse + ptb.x_L_sparse.view(batch_size, -1) if ptb.sparse else ptb.x_L.view(batch_size, -1)) root[i].linear.x_U = ( - ptb.x_U_sparse.view(batch_size, -1) if ptb.sparse + ptb.x_U_sparse.view(batch_size, -1) if ptb.sparse else ptb.x_U.view(batch_size, -1)) else: lw = torch.zeros(shape[0], dim_in, *shape[2:]).to(root[i].linear.lw) @@ -303,4 +298,3 @@ def init_forward(self, root, dim_in): w = None root[i].linear = LinearBound(w, b, w, b, b, b) root[i].lower = root[i].upper = b - root[i].interval = (root[i].lower, root[i].upper) diff --git a/auto_LiRPA/interval_bound.py b/auto_LiRPA/interval_bound.py index 0fd09c4..a4ebcf5 100644 --- a/auto_LiRPA/interval_bound.py +++ b/auto_LiRPA/interval_bound.py @@ -107,19 +107,23 @@ def _IBP_loss_fusion(self, node, C): def check_IBP_intermediate(self, node): """ Check if we use IBP bounds to compute intermediate bounds on this node. - Basically we check if we can get bounds by only visiting operators in - `self.ibp_intermediate`. - Currently, assume all eligible operators have exactly one input. """ + We check if we can get bounds by only visiting operators in + `self.ibp_intermediate`. Currently, assume all eligible operators have + exactly one input. + """ + nodes = [] while not hasattr(node, 'lower') or not hasattr(node, 'upper'): if type(node) not in self.ibp_intermediate: return False + assert len(node.inputs) == 1, ( + 'Nodes in self.ibp_intermediate cannot have more than one input') nodes.append(node) - node = node.inputs[0] + node = node.inputs[0] # FIXME: this cannot handle multiple inputs. nodes.reverse() for n in nodes: - node.interval = self.IBP_general(n) + n.interval = self.IBP_general(n) return True diff --git a/auto_LiRPA/jacobian.py b/auto_LiRPA/jacobian.py new file mode 100644 index 0000000..aaf6ab5 --- /dev/null +++ b/auto_LiRPA/jacobian.py @@ -0,0 +1,245 @@ +"""Handle Jacobian bounds.""" + +import torch +import numpy as np +from auto_LiRPA.bound_ops import BoundInput, BoundParams, BoundAdd +from auto_LiRPA.bound_ops import GradNorm, JVP +from auto_LiRPA.utils import get_spec_matrix, Flatten +from collections import deque + + +def augment_gradient_graph(self, dummy_input, norm=None, vector=None): + """Augment the computational graph with gradient computation.""" + + device = dummy_input.device + final_node = self.final_node() + if final_node.forward_value is None: + self(dummy_input) + output = final_node.forward_value + if output.ndim != 2: + raise NotImplementedError( + 'The model should have a 2-D output shape of ' + '(batch_size, output_dim)') + output_dim = output.size(1) + + # Gradient values in `grad` may not be accurate. We do not consider gradient + # accumulation from multiple succeeding nodes. We only want the shapes but + # not the accurate values. + grad = {} + # Dummy values in grad_start + grad_start = torch.ones(output.size(0), output_dim, device=device) + grad[final_node.name] = grad_start + input_node_found = False + + # First BFS pass: traverse the graph, count degrees, and build gradient + # layers. + # Degrees of nodes. + degree = {} + # Original layer for gradient computation. + layer_grad = {} + # Input nodes in gradient computation in back propagation. + input_nodes = {} + # Dummy input values for gradient computation received. + grad_input = {} + # Extra nodes as arguments used for gradient computation. + # They must match the order in grad_input. + grad_extra_nodes = {} + + degree[final_node.name] = 0 + queue = deque([final_node]) + while len(queue) > 0: + node = queue.popleft() + grad_extra_nodes[node.name] = [] + input_nodes[node.name] = node.inputs + + if isinstance(node, BoundInput): + if input_node_found: + raise NotImplementedError( + 'There must be exactly one BoundInput node, ' + 'but found more than 1.') + if vector is not None: + # Compute JVP bounds + layer_grad[node.name] = JVP(vector=vector) + else: + if norm is None: + layer_grad[node.name] = Flatten() + else: + if norm != np.inf: + raise NotImplementedError( + 'Only inf norm is supported for now.') + dual_norm = 1. / (1. - 1. / norm) if norm != 1 else np.inf + layer_grad[node.name] = GradNorm(norm=dual_norm) + grad_input[node.name] = (grad[node.name],) + input_node_found = True + else: + ret = node.build_gradient_node(grad[node.name]) + node_grad, grad_input_, grad_extra_nodes_ = ret + layer_grad[node.name] = node_grad + grad_input[node.name] = grad_input_ + grad_extra_nodes[node.name] = grad_extra_nodes_ + + # Propagate gradients to the input nodes and update degrees. + grad_next = layer_grad[node.name](*grad_input[node.name]) + if isinstance(grad_next, torch.Tensor): + grad_next = [grad_next] + if not isinstance(node, BoundInput): + for i in range(len(grad_next)): + grad[input_nodes[node.name][i].name] = grad_next[i] + if not input_nodes[node.name][i].name in degree: + degree[input_nodes[node.name][i].name] = 0 + queue.append(input_nodes[node.name][i]) + degree[input_nodes[node.name][i].name] += 1 + + if not input_node_found: + raise NotImplementedError( + 'There must be exactly one BoundInput node, but found none.') + + # Second BFS pass: build the backward computational graph + grad_node = {} + grad_node[final_node.name] = BoundInput( + f'/grad{final_node.name}', grad_start) + grad_node[final_node.name].name = f'/grad{final_node.name}' + self.add_input_node(grad_node[final_node.name], index='auto') + queue = deque([final_node]) + while len(queue) > 0: + node = queue.popleft() + nodes_op, nodes_in, nodes_out, _ = self._convert_nodes( + layer_grad[node.name], grad_input[node.name]) + rename_dict = {} + assert isinstance(nodes_in[0], BoundInput) + rename_dict[nodes_in[0].name] = grad_node[node.name].name + for i in range(1, len(nodes_in)): + # Assume it's a parameter here + new_name = f'/grad{node.name}/params{nodes_in[i].name}' + rename_dict[nodes_in[i].name] = new_name + for i in range(len(nodes_op)): + # intermediate nodes + if not nodes_op[i].name in rename_dict: + new_name = f'/grad{node.name}/tmp{nodes_op[i].name}' + rename_dict[nodes_op[i].name] = new_name + if isinstance(node, BoundInput): + assert len(nodes_out) == 1 + rename_dict[nodes_out[0].name] = '/grad_norm' + else: + for i in range(len(nodes_out)): + assert not isinstance(node.inputs[i], BoundParams) + rename_dict[nodes_out[i].name] = f'/grad{node.inputs[i].name}' + + self.rename_nodes(nodes_op, nodes_in, rename_dict) + # Replace input nodes + # grad_extra_nodes[node.name]: ReLU's input + input_nodes_replace = ( + [self._modules[nodes_in[0].name]] + grad_extra_nodes[node.name]) + for i in range(len(input_nodes_replace)): + for n in nodes_op: + for j in range(len(n.inputs)): + if n.inputs[j].name == nodes_in[i].name: + n.inputs[j] = input_nodes_replace[i] + self.add_nodes(nodes_op + nodes_in[len(input_nodes_replace):]) + + if not isinstance(node, BoundInput): + for i in range(len(nodes_out)): + if input_nodes[node.name][i].name in grad_node: + node_cur = grad_node[input_nodes[node.name][0].name] + node_add = BoundAdd( + attr=None, inputs=[node_cur, nodes_out[i]], + output_index=0, options={}) + node_add.name = f'{nodes_out[i].name}/add' + grad_node[input_nodes[node.name][0].name] = node_add + else: + grad_node[input_nodes[node.name][0].name] = nodes_out[i] + degree[input_nodes[node.name][i].name] -= 1 + if degree[input_nodes[node.name][i].name] == 0: + queue.append(input_nodes[node.name][i]) + + self(dummy_input, grad_start, final_node_name='/grad_norm') + + self.bound_opts['jacobian'] = { + 'norm': norm, + 'vector': vector is not None, + } + # Disable unstable options + self.bound_opts.update({ + 'sparse_intermediate_bounds': False, + 'sparse_conv_intermediate_bounds': False, + 'sparse_intermediate_bounds_with_ibp': False, + 'sparse_features_alpha': False, + 'sparse_spec_alpha': False, + }) + + self.forward_final_name = self.final_name + self.final_name = '/grad_norm' + self.output_name = ['/grad_norm'] + + return self + + +def compute_jacobian_bounds( + self, x, optimize=True, reduce=True, c_opt=None, labels=None): + """Compute jacobian bounds on the pre-augmented graph. + + Args: + x: Input to the mode. + optimize: Optimize relaxation bounds. + reduce: Reduce the Jacobian bounds by taking the max + (for L-inf local Lipschitz constants). + c_opt (optional): Specification for optimizing the bounds on the forward + computational graph. + labels (optional): Ground-truth labels for constructing a default c_opt + if it c_opt not explicitly provided. + + Returns: + ret: If reduce=True, return the maximum Jacobian bounds over all the + output dimensions, otherwise return the Jacobian bounds for all the + output dimensions in a tensor. + """ + + assert 'jacobian' in self.bound_opts, ( + 'Call augment_gradient_graph to augment the computational graph ' + 'with the backward graph first') + norm = self.bound_opts.get('jacobian', {}).get('norm', None) + assert norm is None or norm == np.inf, ( + 'Only Linf norm of Jacobian is supported for now.') + + num_classes = self[self.forward_final_name].output_shape[-1] + + if optimize and c_opt is None: + if labels is None: + c_opt = None + else: + # Specification for optimizing the forward graph. + c_opt = get_spec_matrix(x, labels, num_classes) + + ret, lower, upper = [], [], [] + grad_start = torch.zeros(x.size(0), num_classes).to(x) + for j in range(num_classes): + grad_start.zero_() + grad_start[:, j] = 1 + x_extra = (grad_start,) + intermediate_bounds = {} + if optimize: + self.compute_bounds( + method='CROWN-Optimized', + C=c_opt, x=(x,) + x_extra, bound_upper=False, + final_node_name=self.forward_final_name) + for node in self._modules.values(): + if hasattr(node, 'lower') and node.lower is not None: + intermediate_bounds[node.name] = (node.lower, node.upper) + lb, ub = self.compute_bounds( + method='CROWN', x=(x,) + x_extra, bound_lower=norm is None, + intermediate_layer_bounds=intermediate_bounds) + if norm is not None: + ret.append(ub.view(-1)) + else: + lower.append(lb.view(1, -1)) + upper.append(ub.view(1, -1)) + if norm is not None: + ret = torch.concat(ret) + if reduce: + return ret.max() + else: + return ret + else: + lower = torch.concat(lower, dim=0) + upper = torch.concat(upper, dim=0) + return lower, upper diff --git a/auto_LiRPA/operators/__init__.py b/auto_LiRPA/operators/__init__.py index 56cb4f3..c2873b6 100644 --- a/auto_LiRPA/operators/__init__.py +++ b/auto_LiRPA/operators/__init__.py @@ -2,7 +2,8 @@ from .linear import * from .convolution import * from .pooling import * -from .activation import * +from .activation_base import * +from .activations import * from .nonlinear import * from .bivariate import * from .normalization import * @@ -16,4 +17,6 @@ from .dropout import * from .dtype import * from .cut_ops import * -from .solver_utils import grb \ No newline at end of file +from .gradient_bounds import * +from .gradient_modules import * +from .solver_utils import grb diff --git a/auto_LiRPA/operators/activation_base.py b/auto_LiRPA/operators/activation_base.py new file mode 100644 index 0000000..6d357c9 --- /dev/null +++ b/auto_LiRPA/operators/activation_base.py @@ -0,0 +1,273 @@ +""" Activation operators or other unary nonlinear operators""" +import torch +from torch import Tensor +from collections import OrderedDict +from .base import * +from .clampmult import multiply_by_A_signs + +torch._C._jit_set_profiling_executor(False) +torch._C._jit_set_profiling_mode(False) + + +class BoundActivation(Bound): + def __init__(self, attr, inputs, output_index, options): + super().__init__(attr, inputs, output_index, options) + self.requires_input_bounds = [0] + self.relaxed = False + self.use_default_ibp = True + + def _init_masks(self, x): + self.mask_pos = x.lower >= 0 + self.mask_neg = x.upper <= 0 + self.mask_both = torch.logical_not(torch.logical_or(self.mask_pos, self.mask_neg)) + + def init_linear_relaxation(self, x, dim_opt=None): + self._init_masks(x) + self.lw = torch.zeros_like(x.lower) + self.lb = self.lw.clone() + self.uw = self.lw.clone() + self.ub = self.lw.clone() + + def add_linear_relaxation(self, mask, type, k, x0, y0): + if type == 'lower': + w_out, b_out = self.lw, self.lb + else: + w_out, b_out = self.uw, self.ub + + if mask is None: + if isinstance(k, Tensor) and k.ndim > 0: + w_out[:] = k + else: + w_out.fill_(k) + else: + if isinstance(k, Tensor): + w_out[..., mask] = k[..., mask].to(w_out) + else: + w_out[..., mask] = k + + if (not isinstance(x0, Tensor) and x0 == 0 + and not isinstance(y0, Tensor) and y0 == 0): + pass + else: + b = -x0 * k + y0 + if mask is None: + if b.ndim > 0: + b_out[:] = b + else: + b_out.fill_(b) + else: + b_out[..., mask] = b[..., mask] + + def bound_relax(self, x): + return not_implemented_op(self, 'bound_relax') + + def bound_backward(self, last_lA, last_uA, x): + if not self.relaxed: + self.init_linear_relaxation(x) + self.bound_relax(x) + + def _bound_oneside(last_A, sign=-1): + if last_A is None: + return None, 0 + if sign == -1: + w_pos, b_pos, w_neg, b_neg = ( + self.lw.unsqueeze(0), self.lb.unsqueeze(0), + self.uw.unsqueeze(0), self.ub.unsqueeze(0)) + else: + w_pos, b_pos, w_neg, b_neg = ( + self.uw.unsqueeze(0), self.ub.unsqueeze(0), + self.lw.unsqueeze(0), self.lb.unsqueeze(0)) + w_pos = maybe_unfold_patches(w_pos, last_A) + w_neg = maybe_unfold_patches(w_neg, last_A) + b_pos = maybe_unfold_patches(b_pos, last_A) + b_neg = maybe_unfold_patches(b_neg, last_A) + if self.batch_dim == 0: + _A, _bias = multiply_by_A_signs(last_A, w_pos, w_neg, b_pos, b_neg) + elif self.batch_dim == -1: + # FIXME: why this is different from above? + mask = torch.gt(last_A, 0.).to(torch.float) + _A = last_A * (mask * w_pos.unsqueeze(1) + + (1 - mask) * w_neg.unsqueeze(1)) + _bias = last_A * (mask * b_pos.unsqueeze(1) + + (1 - mask) * b_neg.unsqueeze(1)) + if _bias.ndim > 2: + _bias = torch.sum(_bias, dim=list(range(2, _bias.ndim))) + else: + raise NotImplementedError + + return _A, _bias + + lA, lbias = _bound_oneside(last_lA, sign=-1) + uA, ubias = _bound_oneside(last_uA, sign=+1) + + return [(lA, uA)], lbias, ubias + + @staticmethod + @torch.jit.script + def bound_forward_w( + relax_lw: Tensor, relax_uw: Tensor, x_lw: Tensor, x_uw: Tensor, dim: int): + lw = (relax_lw.unsqueeze(dim).clamp(min=0) * x_lw + + relax_lw.unsqueeze(dim).clamp(max=0) * x_uw) + uw = (relax_uw.unsqueeze(dim).clamp(max=0) * x_lw + + relax_uw.unsqueeze(dim).clamp(min=0) * x_uw) + return lw, uw + + @staticmethod + @torch.jit.script + def bound_forward_b( + relax_lw: Tensor, relax_uw: Tensor, relax_lb: Tensor, + relax_ub: Tensor, x_lb: Tensor, x_ub: Tensor): + lb = relax_lw.clamp(min=0) * x_lb + relax_lw.clamp(max=0) * x_ub + relax_lb + ub = relax_uw.clamp(max=0) * x_lb + relax_uw.clamp(min=0) * x_ub + relax_ub + return lb, ub + + def bound_forward(self, dim_in, x): + if not self.relaxed: + self.init_linear_relaxation(x) + self.bound_relax(x) + + assert (x.lw is None) == (x.uw is None) + + dim = 1 if self.lw.ndim > 0 else 0 + + if x.lw is not None: + lw, uw = BoundActivation.bound_forward_w(self.lw, self.uw, x.lw, x.uw, dim) + else: + lw = uw = None + lb, ub = BoundActivation.bound_forward_b(self.lw, self.uw, self.lb, self.ub, x.lb, x.ub) + + return LinearBound(lw, lb, uw, ub) + + def interval_propagate(self, *v): + h_L, h_U = v[0][0], v[0][1] + return self.forward(h_L), self.forward(h_U) + + +class BoundOptimizableActivation(BoundActivation): + def __init__(self, attr, inputs, output_index, options): + super().__init__(attr, inputs, output_index, options) + # Stages: + # * `init`: initializing parameters + # * `opt`: optimizing parameters + # * `reuse`: not optimizing parameters but reuse saved values + # If `None`, it means activation optimization is currently not used. + self.opt_stage = None + self.alpha = OrderedDict() + # Save patch sizes during bound_backward() for each output_node. + self.patch_size = {} + # Location of batch dimension in self.alpha. Must be set by children. + self.alpha_batch_dim = None + # A torch.bool mask of shape Tensor([batch_size]) that conditions the sample of alpha and beta to update + # If set to None, update all samples + # If not None, select those corresponding to 1 to update + self.alpha_beta_update_mask = None + + def opt_init(self): + """Enter the stage for initializing bound optimization. Optimized bounds + are not used in this stage.""" + self.opt_stage = 'init' + + def opt_start(self): + """Start optimizing bounds.""" + self.opt_stage = 'opt' + + def opt_reuse(self): + """ Reuse optimizing bounds """ + self.opt_stage = 'reuse' + + def opt_no_reuse(self): + """ Finish reusing optimized bounds """ + if self.opt_stage == 'reuse': + self.opt_stage = None + + def opt_end(self): + """ End optimizing bounds """ + self.opt_stage = None + + def init_opt_parameters(self, start_nodes): + """ start_nodes: a list of starting nodes [(node, size)] during + CROWN backward bound propagation""" + raise NotImplementedError + + def clip_alpha_(self): + pass + + def init_linear_relaxation(self, x, dim_opt=None): + self._init_masks(x) + # The first dimension of size 2 is used for lA and uA respectively, + # when computing intermediate bounds. + if self.opt_stage in ['opt', 'reuse'] and dim_opt is not None: + # For optimized bounds, we have independent lw for each output dimension for bound optimization. + # If the output layer is a fully connected layer, len(dim_opt) = 1. + # If the output layer is a conv layer, len(dim_opt) = 3 but we only use the out_c dimension to create slopes/bias. + # Variables are shared among out_h, out_w dimensions so far. + dim = dim_opt if isinstance(dim_opt, int) else dim_opt[0] + self.lw = torch.zeros(2, dim, *x.lower.shape).to(x.lower) + else: + # Without optimized bounds, the lw, lb (slope, biase) etc only depend on intermediate layer bounds, + # and are shared among different output dimensions. + self.lw = torch.zeros_like(x.lower) + self.lb = self.lw.clone() + self.uw = self.lw.clone() + self.ub = self.lw.clone() + + def bound_backward(self, last_lA, last_uA, x, start_node=None, start_shape=None): + self._start = start_node.name + + if self.opt_stage not in ['opt', 'reuse']: + last_A = last_lA if last_lA is not None else last_uA + # Returned [(lA, uA)], lbias, ubias + As, lbias, ubias = super().bound_backward(last_lA, last_uA, x) + if isinstance(last_A, Patches): + A_prod = As[0][1].patches if As[0][0] is None else As[0][1].patches + # FIXME: Unify this function with BoundReLU + # Save the patch size, which will be used in init_slope() to determine the number of optimizable parameters. + if start_node is not None: + if last_A.unstable_idx is not None: + # Sparse patches, we need to construct the full patch size: (out_c, batch, out_h, out_w, c, h, w). + self.patch_size[start_node.name] = [last_A.output_shape[1], A_prod.size(1), last_A.output_shape[2], last_A.output_shape[3], A_prod.size(-3), A_prod.size(-2), A_prod.size(-1)] + else: + # Regular patches. + self.patch_size[start_node.name] = A_prod.size() + return As, lbias, ubias + assert self.batch_dim == 0 + + if not self.relaxed: + self.init_linear_relaxation(x, dim_opt=start_shape) + self.bound_relax(x) + + def _bound_oneside(last_A, sign=-1): + if last_A is None: + return None, 0 + if sign == -1: + w_pos, b_pos, w_neg, b_neg = self.lw[0], self.lb[0], self.uw[0], self.ub[0] + else: + w_pos, b_pos, w_neg, b_neg = self.uw[1], self.ub[1], self.lw[1], self.lb[1] + w_pos = maybe_unfold_patches(w_pos, last_A) + w_neg = maybe_unfold_patches(w_neg, last_A) + b_pos = maybe_unfold_patches(b_pos, last_A) + b_neg = maybe_unfold_patches(b_neg, last_A) + A_prod, _bias = multiply_by_A_signs(last_A, w_pos, w_neg, b_pos, b_neg) + return A_prod, _bias + + lA, lbias = _bound_oneside(last_lA, sign=-1) + uA, ubias = _bound_oneside(last_uA, sign=+1) + + return [(lA, uA)], lbias, ubias + + def _no_bound_parameters(self): + raise AttributeError('Bound parameters have not been initialized.' + 'Please call `compute_bounds` with `method=CROWN-optimized`' + ' at least once.') + + def dump_optimized_params(self): + raise NotImplementedError + + def restore_optimized_params(self): + raise NotImplementedError + + def set_alpha_beta_update_mask(self, mask): + self.alpha_beta_update_mask = mask + + def clean_alpha_beta_update_mask(self): + self.alpha_beta_update_mask = None diff --git a/auto_LiRPA/operators/activation.py b/auto_LiRPA/operators/activations.py similarity index 83% rename from auto_LiRPA/operators/activation.py rename to auto_LiRPA/operators/activations.py index 1383100..86bb0f3 100644 --- a/auto_LiRPA/operators/activation.py +++ b/auto_LiRPA/operators/activations.py @@ -2,282 +2,18 @@ from typing import Optional, Tuple import torch from torch import Tensor +from collections import OrderedDict from .base import * from .clampmult import multiply_by_A_signs +from .activation_base import BoundActivation, BoundOptimizableActivation +from .gradient_modules import ReLUGrad from .solver_utils import grb from ..utils import unravel_index, logger, prod - torch._C._jit_set_profiling_executor(False) torch._C._jit_set_profiling_mode(False) -class BoundActivation(Bound): - def __init__(self, attr, inputs, output_index, options): - super().__init__(attr, inputs, output_index, options) - self.requires_input_bounds = [0] - self.relaxed = False - - def _init_masks(self, x): - self.mask_pos = x.lower >= 0 - self.mask_neg = x.upper <= 0 - self.mask_both = torch.logical_not(torch.logical_or(self.mask_pos, self.mask_neg)) - - def init_linear_relaxation(self, x, dim_opt=None): - self._init_masks(x) - self.lw = torch.zeros_like(x.lower) - self.lb = self.lw.clone() - self.uw = self.lw.clone() - self.ub = self.lw.clone() - - def add_linear_relaxation(self, mask, type, k, x0, y0): - if type == 'lower': - w_out, b_out = self.lw, self.lb - else: - w_out, b_out = self.uw, self.ub - - if mask is None: - if isinstance(k, Tensor) and k.ndim > 0: - w_out[:] = k - else: - w_out.fill_(k) - else: - if isinstance(k, Tensor): - w_out[..., mask] = k[..., mask].to(w_out) - else: - w_out[..., mask] = k - - if (not isinstance(x0, Tensor) and x0 == 0 - and not isinstance(y0, Tensor) and y0 == 0): - pass - else: - b = -x0 * k + y0 - if mask is None: - if b.ndim > 0: - b_out[:] = b - else: - b_out.fill_(b) - else: - b_out[..., mask] = b[..., mask] - - def bound_relax(self, x): - return not_implemented_op(self, 'bound_relax') - - def interval_propagate(self, *v): - return self.default_interval_propagate(*v) - - def bound_backward(self, last_lA, last_uA, x): - if not self.relaxed: - self.init_linear_relaxation(x) - self.bound_relax(x) - - def _bound_oneside(last_A, sign=-1): - if last_A is None: - return None, 0 - if sign == -1: - w_pos, b_pos, w_neg, b_neg = ( - self.lw.unsqueeze(0), self.lb.unsqueeze(0), - self.uw.unsqueeze(0), self.ub.unsqueeze(0)) - else: - w_pos, b_pos, w_neg, b_neg = ( - self.uw.unsqueeze(0), self.ub.unsqueeze(0), - self.lw.unsqueeze(0), self.lb.unsqueeze(0)) - w_pos = maybe_unfold_patches(w_pos, last_A) - w_neg = maybe_unfold_patches(w_neg, last_A) - b_pos = maybe_unfold_patches(b_pos, last_A) - b_neg = maybe_unfold_patches(b_neg, last_A) - if self.batch_dim == 0: - _A, _bias = multiply_by_A_signs(last_A, w_pos, w_neg, b_pos, b_neg) - elif self.batch_dim == -1: - # FIXME: why this is different from above? - mask = torch.gt(last_A, 0.).to(torch.float) - _A = last_A * (mask * w_pos.unsqueeze(1) + - (1 - mask) * w_neg.unsqueeze(1)) - _bias = last_A * (mask * b_pos.unsqueeze(1) + - (1 - mask) * b_neg.unsqueeze(1)) - if _bias.ndim > 2: - _bias = torch.sum(_bias, dim=list(range(2, _bias.ndim))) - else: - raise NotImplementedError - - return _A, _bias - - lA, lbias = _bound_oneside(last_lA, sign=-1) - uA, ubias = _bound_oneside(last_uA, sign=+1) - - return [(lA, uA)], lbias, ubias - - @staticmethod - @torch.jit.script - def bound_forward_w( - relax_lw: Tensor, relax_uw: Tensor, x_lw: Tensor, x_uw: Tensor, dim: int): - lw = (relax_lw.unsqueeze(dim).clamp(min=0) * x_lw + - relax_lw.unsqueeze(dim).clamp(max=0) * x_uw) - uw = (relax_uw.unsqueeze(dim).clamp(max=0) * x_lw + - relax_uw.unsqueeze(dim).clamp(min=0) * x_uw) - return lw, uw - - @staticmethod - @torch.jit.script - def bound_forward_b( - relax_lw: Tensor, relax_uw: Tensor, relax_lb: Tensor, - relax_ub: Tensor, x_lb: Tensor, x_ub: Tensor): - lb = relax_lw.clamp(min=0) * x_lb + relax_lw.clamp(max=0) * x_ub + relax_lb - ub = relax_uw.clamp(max=0) * x_lb + relax_uw.clamp(min=0) * x_ub + relax_ub - return lb, ub - - def bound_forward(self, dim_in, x): - if not self.relaxed: - self.init_linear_relaxation(x) - self.bound_relax(x) - - assert (x.lw is None) == (x.uw is None) - - dim = 1 if self.lw.ndim > 0 else 0 - - if x.lw is not None: - lw, uw = BoundActivation.bound_forward_w(self.lw, self.uw, x.lw, x.uw, dim) - else: - lw = uw = None - lb, ub = BoundActivation.bound_forward_b(self.lw, self.uw, self.lb, self.ub, x.lb, x.ub) - - return LinearBound(lw, lb, uw, ub) - - def interval_propagate(self, *v): - h_L, h_U = v[0][0], v[0][1] - return self.forward(h_L), self.forward(h_U) - - -class BoundOptimizableActivation(BoundActivation): - def __init__(self, attr, inputs, output_index, options): - super().__init__(attr, inputs, output_index, options) - # Stages: - # * `init`: initializing parameters - # * `opt`: optimizing parameters - # * `reuse`: not optimizing parameters but reuse saved values - # If `None`, it means activation optimization is currently not used. - self.opt_stage = None - self.alpha = OrderedDict() - # Save patch sizes during bound_backward() for each output_node. - self.patch_size = {} - # Location of batch dimension in self.alpha. Must be set by children. - self.alpha_batch_dim = None - # A torch.bool mask of shape Tensor([batch_size]) that conditions the sample of alpha and beta to update - # If set to None, update all samples - # If not None, select those corresponding to 1 to update - self.alpha_beta_update_mask = None - - def opt_init(self): - """Enter the stage for initializing bound optimization. Optimized bounds - are not used in this stage.""" - self.opt_stage = 'init' - - def opt_start(self): - """Start optimizing bounds.""" - self.opt_stage = 'opt' - - def opt_reuse(self): - """ Reuse optimizing bounds """ - self.opt_stage = 'reuse' - - def opt_no_reuse(self): - """ Finish reusing optimized bounds """ - if self.opt_stage == 'reuse': - self.opt_stage = None - - def opt_end(self): - """ End optimizing bounds """ - self.opt_stage = None - - def init_opt_parameters(self, start_nodes): - """ start_nodes: a list of starting nodes [(node, size)] during - CROWN backward bound propagation""" - raise NotImplementedError - - def clip_alpha_(self): - pass - - def init_linear_relaxation(self, x, dim_opt=None): - self._init_masks(x) - # The first dimension of size 2 is used for lA and uA respectively, - # when computing intermediate bounds. - if self.opt_stage in ['opt', 'reuse'] and dim_opt is not None: - # For optimized bounds, we have independent lw for each output dimension for bound optimization. - # If the output layer is a fully connected layer, len(dim_opt) = 1. - # If the output layer is a conv layer, len(dim_opt) = 3 but we only use the out_c dimension to create slopes/bias. - # Variables are shared among out_h, out_w dimensions so far. - dim = dim_opt if isinstance(dim_opt, int) else dim_opt[0] - self.lw = torch.zeros(2, dim, *x.lower.shape).to(x.lower) - else: - # Without optimized bounds, the lw, lb (slope, biase) etc only depend on intermediate layer bounds, - # and are shared among different output dimensions. - self.lw = torch.zeros_like(x.lower) - self.lb = self.lw.clone() - self.uw = self.lw.clone() - self.ub = self.lw.clone() - - def bound_backward(self, last_lA, last_uA, x, start_node=None, start_shape=None): - self._start = start_node.name - - if self.opt_stage not in ['opt', 'reuse']: - last_A = last_lA if last_lA is not None else last_uA - # Returned [(lA, uA)], lbias, ubias - As, lbias, ubias = super().bound_backward(last_lA, last_uA, x) - if isinstance(last_A, Patches): - A_prod = As[0][1].patches if As[0][0] is None else As[0][1].patches - # FIXME: Unify this function with BoundReLU - # Save the patch size, which will be used in init_slope() to determine the number of optimizable parameters. - if start_node is not None: - if last_A.unstable_idx is not None: - # Sparse patches, we need to construct the full patch size: (out_c, batch, out_h, out_w, c, h, w). - self.patch_size[start_node.name] = [last_A.output_shape[1], A_prod.size(1), last_A.output_shape[2], last_A.output_shape[3], A_prod.size(-3), A_prod.size(-2), A_prod.size(-1)] - else: - # Regular patches. - self.patch_size[start_node.name] = A_prod.size() - return As, lbias, ubias - assert self.batch_dim == 0 - - if not self.relaxed: - self.init_linear_relaxation(x, dim_opt=start_shape) - self.bound_relax(x) - - def _bound_oneside(last_A, sign=-1): - if last_A is None: - return None, 0 - if sign == -1: - w_pos, b_pos, w_neg, b_neg = self.lw[0], self.lb[0], self.uw[0], self.ub[0] - else: - w_pos, b_pos, w_neg, b_neg = self.uw[1], self.ub[1], self.lw[1], self.lb[1] - w_pos = maybe_unfold_patches(w_pos, last_A) - w_neg = maybe_unfold_patches(w_neg, last_A) - b_pos = maybe_unfold_patches(b_pos, last_A) - b_neg = maybe_unfold_patches(b_neg, last_A) - A_prod, _bias = multiply_by_A_signs(last_A, w_pos, w_neg, b_pos, b_neg) - return A_prod, _bias - - lA, lbias = _bound_oneside(last_lA, sign=-1) - uA, ubias = _bound_oneside(last_uA, sign=+1) - - return [(lA, uA)], lbias, ubias - - def _no_bound_parameters(self): - raise AttributeError('Bound parameters have not been initialized.' - 'Please call `compute_bounds` with `method=CROWN-optimized`' - ' at least once.') - - def dump_optimized_params(self): - raise NotImplementedError - - def restore_optimized_params(self): - raise NotImplementedError - - def set_alpha_beta_update_mask(self, mask): - self.alpha_beta_update_mask = mask - - def clean_alpha_beta_update_mask(self): - self.alpha_beta_update_mask = None - - class BoundRelu(BoundOptimizableActivation): def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) @@ -551,7 +287,7 @@ def _backward_relaxation(self, last_lA, last_uA, x, start_node, unstable_idx): # If slope is shared, output_shape will be 1. # The *relu_node_shape might be sparse (sparse-feature alpha), where the non-zero values are indicated by self.alpha_indices. # The out_shape might be sparse (sparse-spec alpha), where the non-zero values are indexed by self.alpha_lookup_idx. - if unstable_idx is not None and self.alpha[start_node.name].size(1) != 1: + if unstable_idx is not None: # print(f'relu layer {self.name}, start_node {start_node}, unstable_idx {type(unstable_idx)} alpha idx {self.alpha_lookup_idx[start_node.name].size()}') alpha_lookup_idx = self.alpha_lookup_idx[start_node.name] if isinstance(unstable_idx, tuple): @@ -903,6 +639,13 @@ def restore_optimized_params(self, opt_var_dict): self.alpha, self.alpha_lookup_idx, self.alpha_indices = \ opt_var_dict['alpha'], opt_var_dict['alpha_lookup_idx'], opt_var_dict['alpha_indices'] + def build_gradient_node(self, grad_upstream): + node_grad = ReLUGrad() + grad_input = (grad_upstream, self.inputs[0].forward_value) + # An extra node is needed to consider the state of ReLU activation + grad_extra_nodes = [self.inputs[0]] + return node_grad, grad_input, grad_extra_nodes + class BoundLeakyRelu(BoundActivation): def __init__(self, attr, inputs, output_index, options): diff --git a/auto_LiRPA/operators/base.py b/auto_LiRPA/operators/base.py index b16d813..69b548e 100644 --- a/auto_LiRPA/operators/base.py +++ b/auto_LiRPA/operators/base.py @@ -1,17 +1,9 @@ """ Base class and functions for implementing bound operators""" -import copy -import os -import time -import math import warnings import torch import torch.nn as nn -import torch.nn.functional as F from torch import Tensor import numpy as np -from itertools import chain -from numpy.lib.arraysetops import isin -from collections import OrderedDict from ..perturbations import * from ..utils import * @@ -25,10 +17,11 @@ def not_implemented_op(node, func): - message = ("Function `{}` of `{}` is not supported yet." - " Please help to open an issue at https://github.com/KaidiXu/auto_LiRPA" - " or implement this function in auto_LiRPA/bound_ops.py" - " or auto_LiRPA/operators by yourself.".format(func, node)) + message = ( + f'Function `{func}` of `{node}` is not supported yet.' + ' Please help to open an issue at https://github.com/Verified-Intelligence/auto_LiRPA' + ' or implement this function in auto_LiRPA/bound_ops.py' + ' or auto_LiRPA/operators by yourself.') raise NotImplementedError(message) @@ -154,6 +147,10 @@ def clear(self): """ Clear attributes when there is a new input to the network""" pass + @property + def input_name(self): + return [node.name for node in self.inputs] + def forward(self, *x): r""" Function for standard/clean forward. @@ -197,10 +194,11 @@ def default_interval_propagate(self, *v): else: raise NotImplementedError('default_interval_propagate only supports no more than 1 input node') - def bound_forward(self, dim_in, *x): r""" - Function for forward mode bound propagation. Forward mode LiRPA computs a `LinearBound` + Function for forward mode bound propagation. + + Forward mode LiRPA computs a `LinearBound` instance representing the linear bound for each involved node. Major attributes of `LinearBound` include `lw`, `uw`, `lb`, `ub`, `lower`, and `upper`. @@ -247,12 +245,6 @@ def bound_backward(self, last_lA, last_uA, *x): """ return not_implemented_op(self, 'bound_backward') - def infer_batch_dim(self, batch_size, *x): - # Default implementation assuming the batch dimension is always at 0. - # Do not use it if the operator can alter the shape - assert x[0] in [0, -1] - return x[0] - def broadcast_backward(self, A, x): shape = x.output_shape batch_dim = max(self.batch_dim, 0) @@ -286,6 +278,23 @@ def broadcast_backward(self, A, x): pass return A + def build_gradient_node(self, grad_upstream): + r""" + Function for building the gradient node to bound the Jacobian. + + Args: + grad_upstream: Upstream gradient in the gradient back-propagation. + + Returns: + node_grad (Bound): Gradient node. + + grad_input (list): Inputs to the gradient node. Values do not + matter. We only want the shapes. + + grad_extra_nodes (list): Extra nodes needed for the gradient. + """ + return not_implemented_op(self, 'bound_forward') + def get_bias(self, A, bias): if A is None: return 0 diff --git a/auto_LiRPA/operators/bivariate.py b/auto_LiRPA/operators/bivariate.py index ffda86e..baabe31 100644 --- a/auto_LiRPA/operators/bivariate.py +++ b/auto_LiRPA/operators/bivariate.py @@ -1,4 +1,5 @@ """ Bivariate operators""" +import copy from .base import * from .nonlinear import BoundSqrt, BoundReciprocal from .clampmult import multiply_by_A_signs @@ -296,16 +297,6 @@ def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi") assert isinstance(vi, Tensor), "build solver for BoundMul only with tensors for now" self.solver_vars = v[0] * v[1] - @staticmethod - def infer_batch_dim(batch_size, *x): - if x[0] == -1: - return x[1] - elif x[1] == -1: - return x[0] - else: - assert x[0] == x[1] - return x[0] - class BoundDiv(Bound): def __init__(self, attr, inputs, output_index, options): diff --git a/auto_LiRPA/operators/constant.py b/auto_LiRPA/operators/constant.py index 9b6b52f..de11a0e 100644 --- a/auto_LiRPA/operators/constant.py +++ b/auto_LiRPA/operators/constant.py @@ -10,9 +10,6 @@ def __init__(self, attr, inputs, output_index, options): def forward(self): return self.value.to(self.device) - def infer_batch_dim(self, batch_size, *x): - return -1 - def bound_backward(self, last_lA, last_uA): def _bound_oneside(A): if A is None: @@ -40,7 +37,7 @@ def bound_forward(self, dim_in): def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi"): self.solver_vars = self.value - + class BoundPrimConstant(Bound): def __init__(self, attr, input, output_index, options): @@ -91,13 +88,6 @@ def interval_propagate(self, *v): def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi"): self.solver_vars = self.forward(v) - def infer_batch_dim(self, batch_size, *x): - # FIXME Should avoid referring to batch_size; Treat `torch.Size` results differently - if self.x[0] == batch_size: - return 0 - else: - return -1 - class BoundRange(Bound): def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) @@ -109,10 +99,6 @@ def forward(self, start, end, step): else: return torch.arange(start, end, step, device=self.device) - def infer_batch_dim(self, batch_size, *x): - assert x[0] == x[1] == x[2] == -1 - return -1 - class BoundATenDiag(Bound): def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) @@ -124,9 +110,6 @@ def forward(self, x, diagonal=0): def interval_propagate(self, *v): return Interval.make_interval(torch.diag(v[0][0], v[1][0]), torch.diag(v[0][1], v[1][0]), v[0]) - def infer_batch_dim(self, batch_size, *x): - return 1 # This is not a batch operation. - class BoundATenDiagonal(Bound): def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) diff --git a/auto_LiRPA/operators/convolution.py b/auto_LiRPA/operators/convolution.py index 22343f1..7ffbfc5 100644 --- a/auto_LiRPA/operators/convolution.py +++ b/auto_LiRPA/operators/convolution.py @@ -3,6 +3,7 @@ import numpy as np from .solver_utils import grb from ..patches import unify_shape, compute_patches_stride_padding, is_shape_used +from .gradient_modules import Conv2dGrad class BoundConv(Bound): @@ -25,7 +26,8 @@ def __init__(self, attr, inputs, output_index, options): self.mode = options.get("conv_mode", "matrix") # denote whether this Conv is followed by a ReLU # if self.relu_followed is False, we need to manually pad the conv patches. - # If self.relu_followed is True, the patches are padded in the ReLU layer and the manual padding is not needed. + # If self.relu_followed is True, the patches are padded in the ReLU layer + # and the manual padding is not needed. def forward(self, *x): # x[0]: input, x[1]: weight, x[2]: bias if self.has_bias @@ -35,7 +37,8 @@ def forward(self, *x): def bound_backward(self, last_lA, last_uA, *x): if self.is_input_perturbed(1): - raise NotImplementedError("Weight perturbation for convolution layers has not been implmented.") + raise NotImplementedError( + 'Weight perturbation for convolution layers has not been implmented.') lA_y = uA_y = lA_bias = uA_bias = None weight = x[1].lower @@ -47,23 +50,29 @@ def _bound_oneside(last_A): # Conv layer does not support the OneHotC fast path. We have to create a dense matrix instead. shape = last_A.shape # [spec, batch, C, H, W] dim = int(prod(shape[2:])) - dense_last_A = torch.zeros(size=(shape[0], shape[1], dim), device=last_A.device, dtype=weight.dtype) + dense_last_A = torch.zeros( + size=(shape[0], shape[1], dim), device=last_A.device, dtype=weight.dtype) # last_A.index has size (spec, batch), its values are the index of the one-hot non-zero elements in A. # last_A.coeffs is the value of the non-zero element. - dense_last_A = torch.scatter(dense_last_A, dim=2, index=last_A.index.unsqueeze(-1), src=last_A.coeffs.unsqueeze(-1)) + dense_last_A = torch.scatter( + dense_last_A, dim=2, index=last_A.index.unsqueeze(-1), + src=last_A.coeffs.unsqueeze(-1)) # We created a large A matrix and it will be handled below. last_A = dense_last_A.view(shape[0], shape[1], *shape[2:]) if type(last_A) == Tensor: shape = last_A.size() # when (W−F+2P)%S != 0, construct the output_padding - output_padding0 = int(self.input_shape[2]) - (int(self.output_shape[2]) - 1) * self.stride[0] + 2 * \ - self.padding[0] - 1 - (int(weight.size()[2] - 1) * self.dilation[0]) - output_padding1 = int(self.input_shape[3]) - (int(self.output_shape[3]) - 1) * self.stride[1] + 2 * \ - self.padding[1] - 1 - (int(weight.size()[3] - 1) * self.dilation[0]) - next_A = F.conv_transpose2d(last_A.reshape(shape[0] * shape[1], *shape[2:]), weight, None, - stride=self.stride, padding=self.padding, dilation=self.dilation, - groups=self.groups, output_padding=(output_padding0, output_padding1)) + output_padding0 = ( + int(self.input_shape[2]) - (int(self.output_shape[2]) - 1) * self.stride[0] + 2 * + self.padding[0] - 1 - (int(weight.size()[2] - 1) * self.dilation[0])) + output_padding1 = ( + int(self.input_shape[3]) - (int(self.output_shape[3]) - 1) * self.stride[1] + 2 * + self.padding[1] - 1 - (int(weight.size()[3] - 1) * self.dilation[0])) + next_A = F.conv_transpose2d( + last_A.reshape(shape[0] * shape[1], *shape[2:]), weight, None, + stride=self.stride, padding=self.padding, dilation=self.dilation, + groups=self.groups, output_padding=(output_padding0, output_padding1)) next_A = next_A.view(shape[0], shape[1], *next_A.shape[1:]) if self.has_bias: # sum_bias = (last_A.sum((3, 4)) * x[2].lower).sum(2) @@ -75,18 +84,27 @@ def _bound_oneside(last_A): # Here we build and propagate a Patch object with (patches, stride, padding) assert type(last_A) == Patches if last_A.identity == 0: - if not self.relu_followed: # FIXME (09/20): Don't call it relu_followed. Instead, make this a property of A, called "padded" and propagate this property. + # FIXME (09/20): Don't call it relu_followed. Instead, make this a property of A, called "padded" and propagate this property. + if not self.relu_followed: # The last_A.patches was not padded, so we need to pad them here. # If this Conv layer is followed by a ReLU layer, then the padding was already handled there and there is no need to pad again. - one_d = torch.ones(tuple(1 for i in self.output_shape[1:]), device=last_A.patches.device, dtype=weight.dtype).expand(self.output_shape[1:]) + one_d = torch.ones( + tuple(1 for i in self.output_shape[1:]), + device=last_A.patches.device, dtype=weight.dtype + ).expand(self.output_shape[1:]) # Add batch dimension. one_d = one_d.unsqueeze(0) # After unfolding, the shape is (1, out_h, out_w, in_c, h, w) - one_d_unfolded = inplace_unfold(one_d, kernel_size=last_A.patches.shape[-2:], stride=last_A.stride, padding=last_A.padding, inserted_zeros=last_A.inserted_zeros, output_padding=last_A.output_padding) + one_d_unfolded = inplace_unfold( + one_d, kernel_size=last_A.patches.shape[-2:], + stride=last_A.stride, padding=last_A.padding, + inserted_zeros=last_A.inserted_zeros, + output_padding=last_A.output_padding) if last_A.unstable_idx is not None: # Move out_h, out_w dimension to the front for easier selection. one_d_unfolded_r = one_d_unfolded.permute(1, 2, 0, 3, 4, 5) - # for sparse patches the shape is (unstable_size, batch, in_c, h, w). Batch size is 1 so no need to select here. + # for sparse patches the shape is (unstable_size, batch, in_c, h, w). + # Batch size is 1 so no need to select here. one_d_unfolded_r = one_d_unfolded_r[last_A.unstable_idx[1], last_A.unstable_idx[2]] else: # Append the spec dimension. @@ -103,16 +121,23 @@ def _bound_oneside(last_A): else: sum_bias = 0 - flattened_patches = patches.reshape(-1, patches.size(-3), patches.size(-2), patches.size(-1)) - pieces = F.conv_transpose2d(flattened_patches, insert_zeros(weight, last_A.inserted_zeros), stride=self.stride) + flattened_patches = patches.reshape( + -1, patches.size(-3), patches.size(-2), patches.size(-1)) + pieces = F.conv_transpose2d( + flattened_patches, insert_zeros(weight, last_A.inserted_zeros) + , stride=self.stride) # New patch size: (out_c, batch, out_h, out_w, c, h, w) or (unstable_size, batch, c, h, w). - pieces = pieces.view(*patches.shape[:-3], pieces.size(-3), pieces.size(-2), pieces.size(-1)) + pieces = pieces.view( + *patches.shape[:-3], pieces.size(-3), pieces.size(-2), + pieces.size(-1)) elif last_A.identity == 1: # New patches have size [out_c, batch, out_h, out_w, c, h, w] if it is not sparse. # New patches have size [unstable_size, batch, c, h, w] if it is sparse. if last_A.unstable_idx is not None: - pieces = weight.view(weight.size(0), 1, weight.size(1), weight.size(2), weight.size(3)) + pieces = weight.view( + weight.size(0), 1, weight.size(1), weight.size(2), + weight.size(3)) # Select based on the output channel (out_h and out_w are irrelevant here). pieces = pieces[last_A.unstable_idx[0]] # Expand the batch dimnension. @@ -126,7 +151,9 @@ def _bound_oneside(last_A): sum_bias = 0 else: assert weight.size(0) == last_A.shape[0] - pieces = weight.view(weight.size(0), 1, 1, 1, weight.size(1), weight.size(2), weight.size(3)).expand(-1, *last_A.shape[1:4], -1, -1, -1) + pieces = weight.view( + weight.size(0), 1, 1, 1, weight.size(1), weight.size(2), + weight.size(3)).expand(-1, *last_A.shape[1:4], -1, -1, -1) # The bias (x[2].lower) has shape (out_c,) need to make it (out_c, batch, out_h, out_w). # Here we should transpose sum_bias to set the batch dim to 1, aiming to keep it consistent with the matrix version if self.has_bias: @@ -140,13 +167,18 @@ def _bound_oneside(last_A): inserted_zeros = last_A.inserted_zeros if last_A is not None else 0 output_padding = last_A.output_padding if last_A is not None else (0, 0, 0, 0) - padding, stride, output_padding = compute_patches_stride_padding(self.input_shape, padding, stride, self.padding, self.stride, inserted_zeros, output_padding) + padding, stride, output_padding = compute_patches_stride_padding( + self.input_shape, padding, stride, self.padding, self.stride, + inserted_zeros, output_padding) - if inserted_zeros == 0 and not is_shape_used(output_padding) and pieces.shape[-1] > self.input_shape[-1]: # the patches is too large and from now on, we will use matrix mode instead of patches mode. + if (inserted_zeros == 0 and not is_shape_used(output_padding) + and pieces.shape[-1] > self.input_shape[-1]): # the patches is too large and from now on, we will use matrix mode instead of patches mode. # This is our desired matrix: the input will be flattend to (batch_size, input_channel*input_x * input_y) and multiplies on this matrix. # After multiplication, the desired output is (batch_size, out_channel*output_x*output_y). # A_matrix has size (batch, out_c*out_h*out_w, in_c*in_h*in_w) - A_matrix = patches_to_matrix(pieces, self.input_shape[1:], stride, padding, last_A.output_shape, last_A.unstable_idx) + A_matrix = patches_to_matrix( + pieces, self.input_shape[1:], stride, padding, + last_A.output_shape, last_A.unstable_idx) # print(f'Converting patches to matrix: old shape {pieces.shape}, size {pieces.numel()}; new shape {A_matrix.shape}, size {A_matrix.numel()}') if isinstance(sum_bias, Tensor) and last_A.unstable_idx is None: sum_bias = sum_bias.transpose(0, 1) @@ -154,7 +186,11 @@ def _bound_oneside(last_A): A_matrix = A_matrix.transpose(0,1) # Spec dimension at the front. return A_matrix, sum_bias # print(f'Conv returns patches with size={pieces.size()}, stride={stride}, padding={padding}, inserted_zeros={inserted_zeros}, output_padding={output_padding}') - return Patches(pieces, stride, padding, pieces.shape, unstable_idx=last_A.unstable_idx, output_shape=last_A.output_shape, inserted_zeros=last_A.inserted_zeros, output_padding=output_padding), sum_bias + return Patches(pieces, stride, padding, pieces.shape, + unstable_idx=last_A.unstable_idx, + output_shape=last_A.output_shape, + inserted_zeros=last_A.inserted_zeros, + output_padding=output_padding), sum_bias else: raise NotImplementedError() @@ -371,6 +407,13 @@ def bound_forward(self, dim_in, *x): uw = center_w + deviation_w, ub = center_b + deviation_b) + def build_gradient_node(self, grad_upstream): + node_grad = Conv2dGrad( + self, self.inputs[1].param, self.stride, self.padding, + self.dilation, self.groups) + return node_grad, (grad_upstream,), [] + + class BoundConvTranspose(Bound): def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) @@ -461,15 +504,6 @@ def _bound_oneside(last_A): # New patches have size [unstable_size, batch, c, h, w] if it is sparse. if last_A.unstable_idx is not None: raise NotImplementedError() - pieces = weight.view(weight.size(0), 1, weight.size(1), weight.size(2), weight.size(3)) - # Select based on the output channel (out_h and out_w are irrelevant here). - pieces = pieces[last_A.unstable_idx[0]] - # Expand the batch dimnension. - pieces = pieces.expand(-1, last_A.shape[1], -1, -1, -1) - # Do the same for the bias. - sum_bias = x[2].lower[last_A.unstable_idx[0]].unsqueeze(-1) - # bias has shape (unstable_size, batch). - sum_bias = sum_bias.expand(-1, last_A.shape[1]) else: assert weight.size(0) == last_A.shape[0] pieces = weight.view(weight.size(0), 1, 1, 1, weight.size(1), weight.size(2), weight.size(3)).expand(-1, *last_A.shape[1:4], -1, -1, -1) @@ -549,19 +583,6 @@ def interval_propagate(self, *v, C=None): deviation = deviation.unsqueeze(0).unsqueeze(-1).unsqueeze(-1) else: # Here we calculate the L0 norm IBP bound using the bound proposed in [Certified Defenses for Adversarial Patches, ICLR 2020] raise NotImplementedError() - norm, eps, ratio = Interval.get_perturbation(v[0]) - mid = h_U - k = int(eps) - weight_sum = torch.sum(weight.abs(), 1) - deviation = torch.sum(torch.topk(weight_sum.view(weight_sum.shape[0], -1), k)[0], dim=1) * ratio - - if self.has_bias: - center = F.conv2d(mid, weight, v[2][0], self.stride, self.padding, self.dilation, self.groups) - else: - center = F.conv2d(mid, weight, None, self.stride, self.padding, self.dilation, self.groups) - - ss = center.shape - deviation = deviation.repeat(ss[2] * ss[3]).view(-1, ss[1]).t().view(ss[1], ss[2], ss[3]) center = F.conv_transpose2d(mid, weight, bias, stride=self.stride, padding=self.padding, dilation=self.dilation, groups=self.groups, output_padding=self.output_padding) diff --git a/auto_LiRPA/operators/gradient_bounds.py b/auto_LiRPA/operators/gradient_bounds.py new file mode 100644 index 0000000..d207af2 --- /dev/null +++ b/auto_LiRPA/operators/gradient_bounds.py @@ -0,0 +1,316 @@ +""" Bound classes for gradient operators """ +import torch +import torch.nn.functional as F +import numpy as np +from auto_LiRPA.patches import Patches, inplace_unfold +from .base import Bound, Interval +from .activation_base import BoundActivation +from .gradient_modules import relu_grad + + +# FIXME reuse the function from auto_LiRPA.patches +def _maybe_unfold(d_tensor, last_A): + if d_tensor is None: + return None + + #[batch, out_dim, in_c, in_H, in_W] + d_shape = d_tensor.size() + + # Reshape to 4-D tensor to unfold. + #[batch, out_dim*in_c, in_H, in_W] + d_tensor = d_tensor.view(d_shape[0], -1, *d_shape[-2:]) + # unfold the slope matrix as patches. + # Patch shape is [batch, out_h, out_w, out_dim*in_c, H, W). + d_unfolded = inplace_unfold( + d_tensor, kernel_size=last_A.patches.shape[-2:], stride=last_A.stride, + padding=last_A.padding) + # Reshape to [batch, out_H, out_W, out_dim, in_C, H, W] + d_unfolded_r = d_unfolded.view( + *d_unfolded.shape[:3], d_shape[1], *d_unfolded.shape[-2:]) + if last_A.unstable_idx is not None: + if len(last_A.unstable_idx) == 4: + # [batch, out_H, out_W, out_dim, in_C, H, W] + # to [out_H, out_W, batch, out_dim, in_C, H, W] + d_unfolded_r = d_unfolded_r.permute(1, 2, 0, 3, 4, 5, 6) + d_unfolded_r = d_unfolded_r[ + last_A.unstable_idx[2], last_A.unstable_idx[3]] + else: + raise NotImplementedError + # For sparse patches, the shape after unfold is + # (unstable_size, batch_size, in_c, H, W). + # For regular patches, the shape after unfold is + # (spec, batch, out_h, out_w, in_c, H, W). + return d_unfolded_r + + +class BoundReluGrad(BoundActivation): + def __init__(self, attr, inputs, output_index, options): + super().__init__(attr, inputs, output_index, options) + self.requires_input_bounds = [3] + self.recurjac = options.get('recurjac', False) + + @staticmethod + def relu_grad(preact): + return (preact > 0).float() + + def forward(self, g, g_relu, g_relu_rev, preact): + return g * relu_grad(preact) + + def interval_propagate(self, *v): + g_lower, g_upper = v[0] + preact_lower, preact_upper = v[3] + relu_grad_lower = relu_grad(preact_lower) + relu_grad_upper = relu_grad(preact_upper) + lower = torch.min(g_lower * relu_grad_lower, g_lower * relu_grad_upper) + upper = torch.max(g_upper * relu_grad_lower, g_upper * relu_grad_upper) + return lower, upper + + def bound_backward(self, last_lA, last_uA, g, g_relu, g_relu_rev, preact): + mask_active = (preact.lower > 0).float() + mask_inactive = (preact.upper < 0).float() + mask_unstable = 1 - mask_active - mask_inactive + + if self.recurjac and self.inputs[0].perturbed: + upper_grad = preact.upper >= 0 + lower_interval = self.inputs[0].lower * upper_grad + upper_interval = self.inputs[0].upper * upper_grad + else: + lower_interval = upper_interval = None + + def _bound_oneside(last_A, pos_interval=None, neg_interval=None): + if last_A is None: + return None, None, None, 0 + + if isinstance(last_A, torch.Tensor): + if self.recurjac and self.inputs[0].perturbed: + mask_unstable_grad = ( + (self.inputs[0].lower < 0) * (self.inputs[0].upper > 0)) + last_A_unstable = last_A * mask_unstable_grad + bias = ( + last_A_unstable.clamp(min=0) * pos_interval + + last_A_unstable.clamp(max=0) * neg_interval) + bias = bias.reshape( + bias.shape[0], bias.shape[1], -1).sum(dim=-1) + last_A = last_A * torch.logical_not(mask_unstable_grad) + else: + bias = 0 + A = last_A * mask_active + A_pos = last_A.clamp(min=0) * mask_unstable + A_neg = last_A.clamp(max=0) * mask_unstable + return A, A_pos, A_neg, bias + elif isinstance(last_A, Patches): + last_A_patches = last_A.patches + + if self.recurjac and self.inputs[0].perturbed: + mask_unstable_grad = ( + (self.inputs[0].lower < 0) * (self.inputs[0].upper > 0)) + mask_unstable_grad_unfold = _maybe_unfold( + mask_unstable_grad, last_A) + last_A_unstable = ( + last_A.to_matrix(mask_unstable_grad.shape) + * mask_unstable_grad) + bias = ( + last_A_unstable.clamp(min=0) * pos_interval + + last_A_unstable.clamp(max=0) * neg_interval) + # FIXME Clean up patches. This implementation does not seem + # to support general shapes. + assert bias.ndim == 5 + bias = bias.sum(dim=[-1, -2, -3]).view(-1, 1) + last_A_patches = ( + last_A_patches + * torch.logical_not(mask_unstable_grad_unfold)) + else: + bias = 0 + + # need to unfold mask_active and mask_unstable + # [batch, 1, in_c, in_H, in_W] + mask_active_unfold = _maybe_unfold(mask_active, last_A) + mask_unstable_unfold = _maybe_unfold(mask_unstable, last_A) + # [spec, batch, 1, in_c, in_H, in_W] + + mask_active_unfold = mask_active_unfold.expand(last_A.shape) + mask_unstable_unfold = mask_unstable_unfold.expand(last_A.shape) + + A = Patches( + last_A_patches * mask_active_unfold, + last_A.stride, last_A.padding, last_A.shape, + last_A.identity, last_A.unstable_idx, last_A.output_shape) + + A_pos_patches = last_A_patches.clamp(min=0) * mask_unstable_unfold + A_neg_patches = last_A_patches.clamp(max=0) * mask_unstable_unfold + + A_pos = Patches( + A_pos_patches, last_A.stride, last_A.padding, last_A.shape, + last_A.identity, last_A.unstable_idx, last_A.output_shape) + A_neg = Patches( + A_neg_patches, last_A.stride, last_A.padding, last_A.shape, + last_A.identity, last_A.unstable_idx, last_A.output_shape) + + return A, A_pos, A_neg, bias + + lA, lA_pos, lA_neg, lbias = _bound_oneside( + last_lA, pos_interval=lower_interval, neg_interval=upper_interval) + uA, uA_pos, uA_neg, ubias = _bound_oneside( + last_uA, pos_interval=upper_interval, neg_interval=lower_interval) + + return ( + [(lA, uA), (lA_neg, uA_pos), (lA_pos, uA_neg), (None, None)], + lbias, ubias) + + +class BoundConv2dGrad(Bound): + def __init__(self, attr, inputs, output_index, options): + super().__init__(attr, inputs, output_index, options) + self.stride = attr['stride'] + self.padding = attr['padding'] + self.dilation = attr['dilation'] + self.groups = attr['groups'] + self.output_padding = [ + attr.get('output_padding0', 0), + attr.get('output_padding1', 0) + ] + self.has_bias = len(inputs) == 3 + self.mode = options.get('conv_mode', 'matrix') + self.patches_start = True + + def forward(self, *x): + # x[0]: input, x[1]: weight, x[2]: bias if self.has_bias + return F.conv_transpose2d( + x[0], x[1], None, + stride=self.stride, padding=self.padding, dilation=self.dilation, + groups=self.groups, output_padding=self.output_padding) + + def bound_backward(self, last_lA, last_uA, *x): + assert not self.is_input_perturbed(1) + + lA_y = uA_y = lA_bias = uA_bias = None + weight = x[1].lower + + def _bound_oneside(last_A): + if last_A is None: + return None, 0 + + if isinstance(last_A, torch.Tensor): + shape = last_A.size() + next_A = F.conv2d( + last_A.reshape(shape[0] * shape[1], *shape[2:]), + weight, None, stride=self.stride, padding=self.padding, + dilation=self.dilation, groups=self.groups) + next_A = next_A.view( + shape[0], shape[1], *next_A.shape[1:]) + if self.has_bias: + sum_bias = (last_A.sum((3, 4)) * x[2].lower).sum(2) + else: + sum_bias = 0 + return next_A, sum_bias + elif isinstance(last_A, Patches): + # Here we build and propagate a Patch object with + # (patches, stride, padding) + assert self.stride == 1, 'The patches mode only supports stride = 1' + if last_A.identity == 1: + # create a identity patch + # [out_dim, batch, out_c, out_h, out_w, in_dim, in_c, in_h, in_w] + patch_shape = last_A.shape + if last_A.unstable_idx is not None: + # FIXME Somehow the usage of unstable_idx seems to have + # been changed, and the previous code is no longer working. + raise NotImplementedError( + 'Sparse patches for ' + 'BoundConv2dGrad is not supported yet.') + output_shape = last_A.output_shape + patches = torch.eye( + patch_shape[0]).to(weight) + patches = patches.view([ + patch_shape[0], 1, 1, 1, 1, patch_shape[0], 1, 1]) + # [out_dim, bsz, out_c, out_h, out_w, out_dim, in_c, in_h, in_w] + patches = patches.expand([ + patch_shape[0], patch_shape[1], patch_shape[2], + output_shape[2], output_shape[3], + patch_shape[0], 1, 1]) + patches = patches.transpose(0, 1) + patches = patches[ + :,torch.tensor(list(range(patch_shape[0]))), + last_A.unstable_idx[0], last_A.unstable_idx[1], + last_A.unstable_idx[2]] + patches = patches.transpose(0, 1) + else: + # out_dim * out_c + patches = torch.eye(patch_shape[0]).to(weight) + patches = patches.view([ + patch_shape[0], 1, 1, 1, patch_shape[0], 1, 1]) + patches = patches.expand(patch_shape) + else: + patches = last_A.patches + + if self.has_bias: + # bias is x[2] (lower and upper are the same), and has + # shape (c,). + # Patches either has + # [out_dim, batch, out_c, out_h, out_w, out_dim, c, h, w] + # or [unstable_size, batch, out_dim, c, h, w]. + # sum_bias has shape (out_dim, batch, out_c, out_h, out_w) + # or (unstable_size, batch). + sum_bias = torch.einsum( + 'sb...ochw,c->sb...', patches, x[2].lower) + else: + sum_bias = 0 + + flattened_patches = patches.reshape( + -1, patches.size(-3), patches.size(-2), patches.size(-1)) + # Pad to the full size + pieces = F.conv2d( + flattened_patches, weight, stride=self.stride, + padding=weight.shape[2]-1) + # New patch size: + # (out_c, batch, out_h, out_w, c, h, w) + # or (unstable_size, batch, c, h, w). + pieces = pieces.view( + *patches.shape[:-3], pieces.size(-3), pieces.size(-2), + pieces.size(-1)) + + # (left, right, top, bottom) + padding = last_A.padding if last_A is not None else (0, 0, 0, 0) + stride = last_A.stride if last_A is not None else 1 + + if isinstance(padding, int): + padding = padding + weight.shape[2] - 1 + else: + padding = tuple(p + weight.shape[2] - 1 for p in padding) + + return Patches( + pieces, stride, padding, pieces.shape, + unstable_idx=last_A.unstable_idx, + output_shape=last_A.output_shape), sum_bias + else: + raise NotImplementedError() + + lA_x, lbias = _bound_oneside(last_lA) + uA_x, ubias = _bound_oneside(last_uA) + return [(lA_x, uA_x), (lA_y, uA_y), (lA_bias, uA_bias)], lbias, ubias + + def interval_propagate(self, *v, C=None): + assert not self.is_input_perturbed(1) + + norm = Interval.get_perturbation(v[0])[0] + h_L, h_U = v[0] + + weight = v[1][0] + bias = v[2][0] if self.has_bias else None + + if norm == np.inf: + mid = (h_U + h_L) / 2.0 + diff = (h_U - h_L) / 2.0 + weight_abs = weight.abs() + deviation = F.conv_transpose2d( + diff, weight_abs, None, stride=self.stride, + padding=self.padding, dilation=self.dilation, + groups=self.groups, output_padding=self.output_padding) + else: + raise NotImplementedError + center = F.conv_transpose2d( + mid, weight, bias, stride=self.stride, padding=self.padding, + dilation=self.dilation, groups=self.groups, + output_padding=self.output_padding) + upper = center + deviation + lower = center - deviation + return lower, upper diff --git a/auto_LiRPA/operators/gradient_modules.py b/auto_LiRPA/operators/gradient_modules.py new file mode 100644 index 0000000..fd05020 --- /dev/null +++ b/auto_LiRPA/operators/gradient_modules.py @@ -0,0 +1,145 @@ +""" Modules for gradients """ +import torch +from torch.autograd import Function +from torch.nn import Module +import torch.nn.functional as F + + +def relu_grad(preact): + return (preact > 0).float() + + +class SqrOp(Function): + @staticmethod + def symbolic(_, x): + return _.op('grad::Sqr', x) + + @staticmethod + def forward(ctx, x): + return torch.square(x) + + +class Conv2dGrad(Module): + def __init__(self, fw_module, weight, stride, padding, dilation, groups): + super().__init__() + self.weight = weight + self.dilation = dilation + self.groups = groups + self.fw_module = fw_module + + assert isinstance(stride, list) and stride[0] == stride[1] + assert isinstance(padding, list) and padding[0] == padding[1] + assert isinstance(dilation, list) and dilation[0] == dilation[1] + self.stride = stride[0] + self.padding = padding[0] + self.dilation = dilation[0] + + def forward(self, grad_last): + output_padding0 = ( + int(self.fw_module.input_shape[2]) + - (int(self.fw_module.output_shape[2]) - 1) * self.stride + + 2 * self.padding - 1 - (int(self.weight.size()[2] - 1) * self.dilation)) + output_padding1 = ( + int(self.fw_module.input_shape[3]) + - (int(self.fw_module.output_shape[3]) - 1) * self.stride + + 2 * self.padding - 1 - (int(self.weight.size()[3] - 1) * self.dilation)) + + return Conv2dGradOp.apply( + grad_last, self.weight, self.stride, self.padding, self.dilation, + self.groups, output_padding0, output_padding1) + + +class LinearGrad(Module): + def __init__(self, weight): + super().__init__() + self.weight = weight + + def forward(self, grad_last): + return F.linear(grad_last, self.weight.t()) + + +class ReLUGradOp(Function): + """ Local gradient of ReLU. + + Not including multiplication with gradients from other layers. + """ + @staticmethod + def symbolic(_, g, g_relu, g_relu_rev, preact): + return _.op('grad::Relu', g, g_relu, g_relu_rev, preact) + + @staticmethod + def forward(ctx, g, g_relu, g_relu_rev, preact): + return g * relu_grad(preact) + + +class ReLUGrad(Module): + def forward(self, g, preact): + g_relu = F.relu(g) + g_relu_rev = -F.relu(-g) + return ReLUGradOp.apply(g, g_relu, g_relu_rev, preact) + + +class ReshapeGrad(Module): + def forward(self, grad_last, inp): + return grad_last.reshape( + grad_last.size(0), *inp.shape[1:]) + + +class FlattenGrad(Module): + def __init__(self, in_shape): + super().__init__() + self.in_shape = in_shape + + def forward(self, grad_last): + return torch.reshape(grad_last, [-1] + list(self.in_shape)) + + +class Conv2dGradOp(Function): + @staticmethod + def symbolic( + g, x, w, stride, padding, dilation, groups, + output_padding0, output_padding1): + return g.op( + 'grad::Conv2d', x, w, stride_i=stride, padding_i=padding, + dilation_i=dilation, groups_i=groups, output_padding0_i=output_padding0, + output_padding1_i=output_padding1) + + @staticmethod + def forward( + ctx, grad_last, w, stride, padding, dilation, groups, output_padding0, + output_padding1): + grad_shape = grad_last.shape + grad = F.conv_transpose2d( + grad_last.view(grad_shape[0], *grad_shape[1:]), w, None, + stride=stride, padding=padding, dilation=dilation, + groups=groups, output_padding=(output_padding0, output_padding1)) + + grad = grad.view((grad_shape[0], *grad.shape[1:])) + return grad + + +class GradNorm(Module): + def __init__(self, norm=1): + super().__init__() + self.norm = norm + + def forward(self, grad): + grad = grad.view(grad.size(0), -1) + if self.norm == 1: + # torch.norm is not supported in auto_LiRPA yet + # use simpler operators for now + return grad.abs().sum(dim=-1, keepdim=True) + elif self.norm == 2: + return SqrOp.apply(grad).sum(dim=-1) + else: + raise NotImplementedError(self.norm) + + +class JVP(Module): + def __init__(self, vector): + super().__init__() + self.vector = vector.view(-1) + + def forward(self, grad): + grad = grad.view(grad.size(0), -1) + return F.linear(grad, self.vector.view(1, -1).to(grad)).squeeze(-1) diff --git a/auto_LiRPA/operators/leaf.py b/auto_LiRPA/operators/leaf.py index 36c66b2..e43850e 100644 --- a/auto_LiRPA/operators/leaf.py +++ b/auto_LiRPA/operators/leaf.py @@ -1,6 +1,8 @@ """ Leaf nodes (indepedent nodes in the auto_LiRPA paper). Including input, parameter, buffer, etc.""" + +from itertools import chain from .base import * @@ -137,14 +139,6 @@ def interval_propagate(self, *v): raise ValueError('{} is a BoundInput node and should not be visited here'.format( self.name)) - def infer_batch_dim(self, batch_size, *x): - shape = self.forward_value.shape - for i in range(len(shape)): - if shape[i] == batch_size: - return i - return -1 - - class BoundParams(BoundInput): def __init__(self, ori_name, value, perturbation=None): super().__init__(ori_name, None, perturbation) @@ -169,10 +163,6 @@ def forward(self): else: return self.param.requires_grad_(self.training) - def infer_batch_dim(self, batch_size, *x): - return -1 - - class BoundBuffers(BoundInput): def __init__(self, ori_name, value, perturbation=None): super().__init__(ori_name, None, perturbation) diff --git a/auto_LiRPA/operators/linear.py b/auto_LiRPA/operators/linear.py index 8ce3a8b..3f1aee8 100644 --- a/auto_LiRPA/operators/linear.py +++ b/auto_LiRPA/operators/linear.py @@ -1,10 +1,11 @@ """ Linear (possibly with weight perturbation) or Dot product layers """ +from torch import Tensor from .base import * from .bivariate import BoundMul -from ..patches import Patches +from .gradient_modules import LinearGrad +from ..patches import Patches, inplace_unfold from .solver_utils import grb -from torch import Tensor -from ..patches import inplace_unfold + class BoundLinear(Bound): def __init__(self, attr, inputs, output_index, options): @@ -30,8 +31,8 @@ def __init__(self, attr, inputs, output_index, options): self.opt_matmul = options.get('matmul') - """Handle tranpose and linear coefficients.""" def _preprocess(self, a, b, c=None): + """Handle tranpose and linear coefficients.""" if self.transA and isinstance(a, Tensor): a = a.transpose(-2,-1) if self.alpha != 1.0: @@ -53,8 +54,8 @@ def forward(self, x, w, b=None): res += b return res - """Multiply weight matrix with a diagonal matrix with selected rows.""" def onehot_mult(self, weight, bias, C, batch_size): + """Multiply weight matrix with a diagonal matrix with selected rows.""" if C is None: return None, 0.0 @@ -614,6 +615,10 @@ def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi") self.solver_vars = new_layer_gurobi_vars model.update() + def build_gradient_node(self, grad_upstream): + node_grad = LinearGrad(self.inputs[1].param) + return node_grad, (grad_upstream,), [] + class BoundMatMul(BoundLinear): # Reuse most functions from BoundLinear. @@ -621,7 +626,18 @@ def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) self.transA = 0 self.transB = 0 - self.requires_input_bounds = [0, 1] + self.is_constant_op = False + for inp in inputs: + if BoundMul._check_const_input(inp): + # If any of the two inputs are constant, we do not need input bounds. + # FIXME (05/11/2022): this is just a temporary workaround. We need better way to determine whether we need input bounds, not just for BoundConstant. + self.is_constant_op = True + if self.is_constant_op: + # One input is constant; no bounds required. + self.requires_input_bounds = [1] + else: + # Both inputs are perturbed. Need relaxation. + self.requires_input_bounds = [0, 1] def forward(self, x, y): self.x_shape = x.shape @@ -692,11 +708,6 @@ def forward(self, x, axis): self.axis = axis return torch.cumsum(x, axis) - def infer_batch_dim(self, batch_size, *x): - assert self.axis != x[0] - return x[0] - - class BoundIdentity(Bound): def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) diff --git a/auto_LiRPA/operators/nonlinear.py b/auto_LiRPA/operators/nonlinear.py index 4f6bb5c..601377d 100644 --- a/auto_LiRPA/operators/nonlinear.py +++ b/auto_LiRPA/operators/nonlinear.py @@ -1,9 +1,11 @@ """Unary nonlinearities other than activation functions.""" import math import torch -from .activation import BoundActivation, BoundTanh +from .activation_base import BoundActivation +from .activations import BoundTanh from .base import epsilon, LinearBound + class BoundSin(BoundActivation): # Lookup tables shared by all BoundSin classes. xl_lower_tb = None @@ -321,8 +323,6 @@ class BoundTan(BoundAtan): inverse function and directly convert the bounds of the inverse function to bounds of the original function. This trick allows us to quickly implement bounds on inverse functions. """ - def __init__(self, attr, inputs, output_index, options): - super().__init__(attr, inputs, output_index, options) def forward(self, x): return torch.tan(x) @@ -472,8 +472,6 @@ def bound_relax(self, x): class BoundLog(BoundActivation): - def __init__(self, attr, inputs, output_index, options): - super().__init__(attr, inputs, output_index, options) def forward(self, x): # NOTE adhoc implementation for loss fusion @@ -510,8 +508,6 @@ def bound_backward(self, last_lA, last_uA, x, start_node=None, start_shape=None) class BoundPow(BoundActivation): - def __init__(self, attr, inputs, output_index, options): - super().__init__(attr, inputs, output_index, options) def forward(self, x, y): return torch.pow(x, y) @@ -570,8 +566,6 @@ def interval_propagate(self, *v): class BoundReciprocal(BoundActivation): - def __init__(self, attr, inputs, output_index, options): - super().__init__(attr, inputs, output_index, options) def forward(self, x): return torch.reciprocal(x) @@ -590,15 +584,10 @@ def interval_propagate(self, *v): class BoundSqrt(BoundActivation): - def __init__(self, attr, inputs, output_index, options): - super().__init__(attr, inputs, output_index, options) def forward(self, x): return torch.sqrt(x) - def interval_propagate(self, *v): - return super().interval_propagate(*v) - def bound_backward(self, last_lA, last_uA, x): x_l = x.lower x_u = torch.max(x.upper, x.lower + 1e-8) @@ -630,9 +619,6 @@ def bound_backward(self, last_lA, last_uA, x): class BoundSqr(BoundActivation): - def __init__(self, attr, inputs, output_index, options): - super().__init__(attr, inputs, output_index, options) - self.nonlinear = True def forward(self, x): return x**2 diff --git a/auto_LiRPA/operators/normalization.py b/auto_LiRPA/operators/normalization.py index d1050ed..ec6abe2 100644 --- a/auto_LiRPA/operators/normalization.py +++ b/auto_LiRPA/operators/normalization.py @@ -1,4 +1,5 @@ """ Normalization operators""" +import copy from .base import * from .solver_utils import grb diff --git a/auto_LiRPA/operators/pooling.py b/auto_LiRPA/operators/pooling.py index 6163caa..4594067 100644 --- a/auto_LiRPA/operators/pooling.py +++ b/auto_LiRPA/operators/pooling.py @@ -1,14 +1,14 @@ -""" Convolution, pooling and padding operators""" -from multiprocessing.sharedctypes import Value +"""Pooling operators.""" +from collections import OrderedDict from .base import * -from .activation import BoundOptimizableActivation +from .activation_base import BoundOptimizableActivation import numpy as np from .solver_utils import grb class BoundMaxPool(BoundOptimizableActivation): #FIXME clean up needed - + def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) assert ('pads' not in attr) or (attr['pads'][0] == attr['pads'][2]) @@ -48,9 +48,9 @@ def init_opt_parameters(self, start_nodes): warnings.warn("MaxPool's optimization is not supported for forward mode") continue self.alpha[ns] = torch.empty( - [1, size_s, self.input_shape[0], self.input_shape[1], - self.output_shape[-2], self.output_shape[-1], - self.kernel_size[0], self.kernel_size[1]], + [1, size_s, self.input_shape[0], self.input_shape[1], + self.output_shape[-2], self.output_shape[-1], + self.kernel_size[0], self.kernel_size[1]], dtype=torch.float, device=ref.device, requires_grad=True) self.init[ns] = False @@ -65,8 +65,6 @@ def bound_backward(self, last_lA, last_uA, x, start_node=None, start_shape=None, if self.stride[0] != self.kernel_size[0]: raise ValueError("self.stride ({}) != self.kernel_size ({})".format(self.stride, self.kernel_size)) - if self.padding[0] != 0: - raise ValueError("BoundMaxPool doesn't support padding != 0") shape = self.input_shape batch_size = x.lower.shape[0] @@ -87,7 +85,7 @@ def bound_backward(self, last_lA, last_uA, x, start_node=None, start_shape=None, if paddings == (0,0,0,0): delete_upper = torch.scatter( - torch.flatten(x.upper, -2), -1, + torch.flatten(x.upper, -2), -1, torch.flatten(max_lower_index, -2), -np.inf).view(upper_d.shape) else: delete_upper = torch.scatter(torch.flatten(F.pad(x.upper, paddings), -2), -1, torch.flatten(max_lower_index, -2), -np.inf).view(upper_d.shape) @@ -121,7 +119,7 @@ def bound_backward(self, last_lA, last_uA, x, start_node=None, start_shape=None, # [batch, C, k, k, out_H, out_W] alpha_data = lower_d_unfold.view(lower_d.shape[0], lower_d.shape[1], self.kernel_size[0], self.kernel_size[1], self.output_shape[-2], self.output_shape[-1]) - + # [batch, C, out_H, out_W, k, k] alpha.data.copy_(alpha_data.permute((0,1,4,5,2,3)).clone().detach()) self.init[start_node.name] = True @@ -147,7 +145,7 @@ def bound_backward(self, last_lA, last_uA, x, start_node=None, start_shape=None, # For the upper bound, we set the bias term to concrete upper bounds for maxpool neurons that are not linear. max_upper_, _ = F.max_pool2d(x.upper, self.kernel_size, self.stride, self.padding, return_indices=True, ceil_mode=self.ceil_mode) upper_b[max_upper > max_lower] = max_upper_[max_upper > max_lower] - + def _bound_oneside(last_A, d_pos, d_neg, b_pos, b_neg): if last_A is None: return None, 0 @@ -166,31 +164,63 @@ def _bound_oneside(last_A, d_pos, d_neg, b_pos, b_neg): # Here we should comfirm that the maxpool patches are not overlapped. shape = last_A.size() + + padding = [self.padding[0], self.padding[0], self.padding[1], self.padding[1]] + d_pos = F.pad(d_pos, padding) + d_neg = F.pad(d_neg, padding) + pos_A = F.interpolate(pos_A.view(shape[0] * shape[1], *shape[2:]), scale_factor=self.kernel_size) - if self.input_shape[-2] != pos_A.shape[-2] and self.input_shape[-1] != pos_A.shape[-1]: - pos_A = F.pad(pos_A, (0, self.input_shape[-2] - pos_A.shape[-2], 0, self.input_shape[-1] - pos_A.shape[-1])) + if d_pos.shape[-2] > pos_A.shape[-2] or d_pos.shape[-1] > pos_A.shape[-1]: + if not (d_pos.shape[-2] > pos_A.shape[-2] and d_pos.shape[-1] > pos_A.shape[-1]): + raise NotImplementedError("Asymmetric padding of maxpool not implemented.") + pos_A = F.pad(pos_A, (0, d_pos.shape[-2] - pos_A.shape[-2], 0, d_pos.shape[-1] - pos_A.shape[-1])) + else: + d_pos = F.pad(d_pos, (0, pos_A.shape[-2] - d_pos.shape[-2], 0, pos_A.shape[-1] - d_pos.shape[-1])) pos_A = pos_A.view(shape[0], shape[1], *pos_A.shape[1:]) neg_A = F.interpolate(neg_A.view(shape[0] * shape[1], *shape[2:]), scale_factor=self.kernel_size) - if self.input_shape[-2] != neg_A.shape[-2] and self.input_shape[-1] != neg_A.shape[-1]: - neg_A = F.pad(neg_A, (0, self.input_shape[-2] - neg_A.shape[-2], 0, self.input_shape[-1] - neg_A.shape[-1])) + if d_neg.shape[-2] > neg_A.shape[-2] or d_neg.shape[-1] > neg_A.shape[-1]: + if not (d_neg.shape[-2] > neg_A.shape[-2] and d_neg.shape[-1] > neg_A.shape[-1]): + raise NotImplementedError("Asymmetric padding of maxpool not implemented.") + neg_A = F.pad(neg_A, (0, d_neg.shape[-2] - neg_A.shape[-2], 0, d_neg.shape[-1] - neg_A.shape[-1])) + else: + d_neg = F.pad(d_neg, (0, neg_A.shape[-2] - d_neg.shape[-2], 0, neg_A.shape[-1] - d_neg.shape[-1])) neg_A = neg_A.view(shape[0], shape[1], *neg_A.shape[1:]) next_A = self.jit_mutiply(pos_A, neg_A, d_pos, d_neg) + if self.padding[0] > 0 or self.padding[1] > 0: + next_A = next_A[...,self.padding[0]:-self.padding[0], self.padding[1]:-self.padding[1]] elif isinstance(last_A, Patches): + # The last_A.patches was not padded, so we need to pad them here. + # If this Conv layer is followed by a ReLU layer, then the padding was already handled there and there is no need to pad again. + one_d = torch.ones(tuple(1 for i in self.output_shape[1:]), device=last_A.patches.device, dtype=last_A.patches.dtype).expand(self.output_shape[1:]) + # Add batch dimension. + one_d = one_d.unsqueeze(0) + # After unfolding, the shape is (1, out_h, out_w, in_c, h, w) + one_d_unfolded = inplace_unfold(one_d, kernel_size=last_A.patches.shape[-2:], stride=last_A.stride, padding=last_A.padding, inserted_zeros=last_A.inserted_zeros, output_padding=last_A.output_padding) + if last_A.unstable_idx is not None: + # Move out_h, out_w dimension to the front for easier selection. + one_d_unfolded_r = one_d_unfolded.permute(1, 2, 0, 3, 4, 5) + # for sparse patches the shape is (unstable_size, batch, in_c, h, w). Batch size is 1 so no need to select here. + one_d_unfolded_r = one_d_unfolded_r[last_A.unstable_idx[1], last_A.unstable_idx[2]] + else: + # Append the spec dimension. + one_d_unfolded_r = one_d_unfolded.unsqueeze(0) + patches = last_A.patches * one_d_unfolded_r + if b_pos is not None: patch_pos = Patches( - last_A.patches.clamp(min=0), last_A.stride, last_A.padding, - last_A.shape, unstable_idx=last_A.unstable_idx, + patches.clamp(min=0), last_A.stride, last_A.padding, + last_A.shape, unstable_idx=last_A.unstable_idx, output_shape=last_A.output_shape) bias = bias + self.get_bias(patch_pos, b_pos) if b_neg is not None: patch_neg = Patches( - last_A.patches.clamp(max=0), last_A.stride, last_A.padding, - last_A.shape, unstable_idx=last_A.unstable_idx, - output_shape=last_A.output_shape) + patches.clamp(max=0), last_A.stride, last_A.padding, + last_A.shape, unstable_idx=last_A.unstable_idx, + output_shape=last_A.output_shape) bias = bias + self.get_bias(patch_neg, b_neg) - + # bias = bias.transpose(0,1) shape = last_A.shape pos_A = last_A.patches.clamp(min=0) @@ -199,20 +229,20 @@ def _bound_oneside(last_A, d_pos, d_neg, b_pos, b_neg): def upsample(last_patches, last_A): if last_A.unstable_idx is None: patches = F.interpolate( - last_patches.view(shape[0] * shape[1] * shape[2], *shape[3:]), + last_patches.view(shape[0] * shape[1] * shape[2], *shape[3:]), scale_factor=[1,]+self.kernel_size) patches = patches.view(shape[0], shape[1], shape[2], *patches.shape[1:]) else: patches = F.interpolate( last_patches, scale_factor=[1,] + self.kernel_size) return Patches( - patches, stride=last_A.stride, padding=last_A.padding, - shape=patches.shape, unstable_idx=last_A.unstable_idx, + patches, stride=last_A.stride, padding=last_A.padding, + shape=patches.shape, unstable_idx=last_A.unstable_idx, output_shape=last_A.output_shape) pos_A = upsample(pos_A, last_A) neg_A = upsample(neg_A, last_A) - + stride = self.stride[0] * last_A.stride if isinstance(last_A.padding, int): padding = last_A.padding * self.stride[0] + self.padding[0] @@ -266,11 +296,11 @@ def _bound_oneside(w_pos, b_pos, w_neg, b_neg, d, b): tot_kernel_size = self.kernel_size ** 2 else: raise ValueError(f'Unsupported kernel size {self.kernel_size}') - w_pooled = (F.avg_pool2d(w_new.view(-1, *w_new.shape[2:]), - self.kernel_size, self.stride, self.padding, + w_pooled = (F.avg_pool2d(w_new.view(-1, *w_new.shape[2:]), + self.kernel_size, self.stride, self.padding, ceil_mode=self.ceil_mode) * tot_kernel_size) w_pooled = w_pooled.reshape(w_new.shape[0], -1, *w_pooled.shape[1:]) - b_pooled = F.avg_pool2d(b_new, self.kernel_size, self.stride, self.padding, + b_pooled = F.avg_pool2d(b_new, self.kernel_size, self.stride, self.padding, ceil_mode=self.ceil_mode) * tot_kernel_size + b return w_pooled, b_pooled @@ -444,7 +474,8 @@ def _bound_oneside(last_A): if isinstance(last_A, torch.Tensor): shape = last_A.size() # propagate A to the next layer, with batch concatenated together - next_A = F.interpolate(last_A.view(shape[0] * shape[1], *shape[2:]), + next_A = F.interpolate( + last_A.reshape(shape[0] * shape[1], *shape[2:]), scale_factor=self.kernel_size) / (prod(self.kernel_size)) next_A = F.pad(next_A, (0, self.input_shape[-2] - next_A.shape[-2], 0, self.input_shape[-1] - next_A.shape[-1])) next_A = next_A.view(shape[0], shape[1], *next_A.shape[1:]) @@ -504,7 +535,7 @@ def _bound_oneside(last_A): lA, lbias = _bound_oneside(last_lA) uA, ubias = _bound_oneside(last_uA) return [(lA, uA)], lbias, ubias - + def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi"): # e.g., last layer input gurobi vars (3,32,32) gvars_array = np.array(v[0]) @@ -513,7 +544,7 @@ def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi") # this layer shape (1,32,6,6) this_layer_shape = self.output_shape assert this_layer_shape[2] == ((2 * self.padding[0] + pre_layer_shape[2] - (self.stride[0] - 1))//self.stride[0]) - + value = 1.0/(self.kernel_size[0] * self.kernel_size[1]) new_layer_gurobi_vars = [] neuron_idx = 0 diff --git a/auto_LiRPA/operators/reduce.py b/auto_LiRPA/operators/reduce.py index 51da427..6a57d49 100644 --- a/auto_LiRPA/operators/reduce.py +++ b/auto_LiRPA/operators/reduce.py @@ -11,11 +11,11 @@ def __init__(self, attr, inputs, output_index, options): assert len(self.axis) == 1 self.axis = self.axis[0] self.keepdim = bool(attr['keepdims']) if 'keepdims' in attr else True - self.use_default_ibp = True + self.use_default_ibp = True - """Assume that the indexes with the maximum values are not perturbed. - This generally doesn't hold true, but can still be used for the input shift - in Softmax of Transformers.""" + """Assume that the indexes with the maximum values are not perturbed. + This generally doesn't hold true, but can still be used for the input shift + in Softmax of Transformers.""" self.fixed_max_index = options.get('fixed_reducemax_index', False) def forward(self, x): @@ -25,27 +25,23 @@ def forward(self, x): self.indices = res.indices return res.values - def infer_batch_dim(self, batch_size, *x): - assert x[0] != self.axis - return x[0] - def bound_backward(self, last_lA, last_uA, x): - if self.fixed_max_index: - def _bound_oneside(last_A): - if last_A is None: - return None - indices = self.indices.unsqueeze(0) - if not self.keepdim: - assert (self.from_input) - last_A = last_A.unsqueeze(self.axis + 1) - indices = indices.unsqueeze(self.axis + 1) - shape = list(last_A.shape) - shape[self.axis + 1] *= self.input_shape[self.axis] - A = torch.zeros(shape, device=last_A.device) - A.scatter_(dim=self.axis + 1, index=indices, src=last_A) - return A - - return [(_bound_oneside(last_lA), _bound_oneside(last_uA))], 0, 0 + if self.fixed_max_index: + def _bound_oneside(last_A): + if last_A is None: + return None + indices = self.indices.unsqueeze(0) + if not self.keepdim: + assert (self.from_input) + last_A = last_A.unsqueeze(self.axis + 1) + indices = indices.unsqueeze(self.axis + 1) + shape = list(last_A.shape) + shape[self.axis + 1] *= self.input_shape[self.axis] + A = torch.zeros(shape, device=last_A.device) + A.scatter_(dim=self.axis + 1, index=indices, src=last_A) + return A + + return [(_bound_oneside(last_lA), _bound_oneside(last_uA))], 0, 0 else: raise NotImplementedError('`bound_backward` for BoundReduceMax with perturbed maximum indexes is not implemented.') @@ -55,7 +51,7 @@ def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) self.axis = attr['axes'] self.keepdim = bool(attr['keepdims']) if 'keepdims' in attr else True - self.use_default_ibp = True + self.use_default_ibp = True def forward(self, x): return torch.mean(x, dim=self.axis, keepdim=self.keepdim) @@ -77,7 +73,7 @@ def _bound_oneside(last_A): for axis in self.axis: shape = list(last_A.shape) size_axis = self.input_shape[axis] - shape[axis + 1] *= size_axis + shape[axis + 1] *= size_axis last_A = last_A.expand(*shape) / size_axis return last_A @@ -95,25 +91,19 @@ def bound_forward(self, dim_in, x): ub = x.ub.sum(dim=axis, keepdim=True) / size return LinearBound(lw, lb, uw, ub) - def infer_batch_dim(self, batch_size, *x): - if x[0] in self.axis: - assert not self.perturbed - return -1 - return x[0] - class BoundReduceSum(Bound): def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) self.axis = attr['axes'] if 'axes' in attr else None self.keepdim = bool(attr['keepdims']) - self.use_default_ibp = True + self.use_default_ibp = True def forward(self, x): if self.axis is not None: return torch.sum(x, dim=self.axis, keepdim=self.keepdim) else: return torch.sum(x) - + def bound_backward(self, last_lA, last_uA, x): for i in range(len(self.axis)): if self.axis[i] < 0: @@ -145,7 +135,3 @@ def bound_forward(self, dim_in, x): uw = x.uw.sum(dim=axis + 1, keepdim=self.keepdim) ub = x.ub.sum(dim=axis, keepdim=self.keepdim) return LinearBound(lw, lb, uw, ub) - - def infer_batch_dim(self, batch_size, *x): - assert not x[0] in self.axis - return x[0] \ No newline at end of file diff --git a/auto_LiRPA/operators/rnn.py b/auto_LiRPA/operators/rnn.py index 7330bf6..dc634ae 100644 --- a/auto_LiRPA/operators/rnn.py +++ b/auto_LiRPA/operators/rnn.py @@ -1,4 +1,4 @@ -""" RNN """ +"""RNN.""" from .base import * @@ -7,6 +7,11 @@ def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) self.complex = True self.output_index = output_index + raise NotImplementedError( + 'torch.nn.RNN is not supported at this time.' + 'Please implement your RNN with torch.nn.RNNCell and a manual for-loop.' + 'See an example of LSTM:' + 'https://github.com/Verified-Intelligence/auto_LiRPA/blob/10a9b30/examples/sequence/lstm.py#L9') def forward(self, x, weight_input, weight_recurrent, bias, sequence_length, initial_h): assert (torch.sum(torch.abs(initial_h)) == 0) @@ -16,7 +21,7 @@ def forward(self, x, weight_input, weight_recurrent, bias, sequence_length, init class BoundRNNImpl(nn.Module): def __init__(self, input_size, hidden_size, - weight_input, weight_recurrent, bias, output_index, options): + weight_input, weight_recurrent, bias, output_index): super().__init__() self.input_size = input_size @@ -34,10 +39,9 @@ def __init__(self, input_size, hidden_size, self.output_index = output_index - def forward(self, x): + def forward(self, x, hidden): length = x.shape[0] outputs = [] - hidden = torch.zeros(x.shape[1], self.hidden_size).to(x) for i in range(length): hidden = self.cell(x[i, :], hidden) outputs.append(hidden.unsqueeze(0)) @@ -52,6 +56,6 @@ def forward(self, x): self.input_size, self.hidden_size, weight_input, weight_recurrent, bias, self.output_index) - self.input = (x,) + self.input = (x, initial_h) - return self.model(self.input) \ No newline at end of file + return self.model(*self.input) \ No newline at end of file diff --git a/auto_LiRPA/operators/shape.py b/auto_LiRPA/operators/shape.py index 7b9c4b2..1473baa 100644 --- a/auto_LiRPA/operators/shape.py +++ b/auto_LiRPA/operators/shape.py @@ -2,6 +2,8 @@ from .base import * from ..patches import Patches, patches_to_matrix from .linear import BoundLinear +from .gradient_modules import ReshapeGrad + class BoundReshape(Bound): def __init__(self, attr, inputs, output_index, options): @@ -32,10 +34,6 @@ def _bound_oneside(A): patches = A.patches # non-sparse: [batch, out_dim, out_c, out_H, out_W, out_dim, in_c, H, W] # [batch, out_dim*out_c, out_H, out_W, out_dim*in_c, H, W] - patches = patches.reshape( - patches.shape[0], - patches.shape[1]*patches.shape[2], patches.shape[3], patches.shape[4], - patches.shape[5]*patches.shape[6], patches.shape[7], patches.shape[8]) # expected next_A shape [batch, spec, in_c, in_H , in_W]. next_A = patches_to_matrix( patches, [ @@ -48,7 +46,13 @@ def _bound_oneside(A): # sparse: [spec, batch, in_c, patch_H, patch_W] (specs depends on the number of unstable neurons). patches = A.patches # expected next_A shape [batch, spec, input_c, in_H, in_W]. - next_A = patches_to_matrix(patches, [self.input_shape[0]*self.input_shape[1], patches.shape[-3], int(math.sqrt(self.input_shape[-1]//patches.shape[-3])), int(math.sqrt(self.input_shape[-1]//patches.shape[-3]))], A.stride, A.padding, output_shape=A.output_shape, unstable_idx=A.unstable_idx) + next_A = patches_to_matrix(patches, [ + self.input_shape[0], + patches.shape[-3], + int(math.sqrt(self.input_shape[-1]//patches.shape[-3])), + int(math.sqrt(self.input_shape[-1]//patches.shape[-3]))], + A.stride, A.padding, output_shape=A.output_shape, + unstable_idx=A.unstable_idx) # Reshape it to [batch, spec, *input_shape] (input_shape is the shape before Reshape operation). next_A = next_A.reshape(A.shape[1], -1, *self.input_shape[1:]) return next_A.transpose(0,1) @@ -70,15 +74,6 @@ def interval_propagate(self, *v): self.forward(v[0][0], v[1][0]), self.forward(v[0][1], v[1][0]), v[0]) - def infer_batch_dim(self, batch_size, *x): - if x[0] == -1: - return -1 - elif self.input_shape[x[0]] == self.shape[x[0]]: - return x[0] - raise NotImplementedError('input shape {}, new shape {}, input batch dim {}'.format( - self.input_shape, self.shape, x[0] - )) - def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi"): if isinstance(v[0], Tensor): self.solver_vars = self.forward(*v) @@ -87,6 +82,11 @@ def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi") gvar_array = gvar_array.reshape(v[1].detach().cpu().numpy())[0] self.solver_vars = gvar_array.tolist() + def build_gradient_node(self, grad_upstream): + node_grad = ReshapeGrad() + grad_input = (grad_upstream, self.inputs[0].forward_value) + return node_grad, grad_input, [] + class BoundUnsqueeze(Bound): def __init__(self, attr, inputs, output_index, options): @@ -129,13 +129,6 @@ def bound_forward(self, dim_in, x): uw, ub = x.uw.unsqueeze(self.axes + 1), x.ub.unsqueeze(self.axes) return LinearBound(lw, lb, uw, ub) - def infer_batch_dim(self, batch_size, *x): - if x[0] == -1: - return -1 - elif self.axes > x[0]: - return x[0] - raise NotImplementedError - def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi"): self.solver_vars = self.forward(v[0]) @@ -155,16 +148,6 @@ def bound_backward(self, last_lA, last_uA, x): return [(last_lA.unsqueeze(self.axes + 1) if last_lA is not None else None, last_uA.unsqueeze(self.axes + 1) if last_uA is not None else None)], 0, 0 - def infer_batch_dim(self, batch_size, *x): - if x[0] == -1: - return -1 - elif x[0] < self.axes: - return x[0] - elif x[0] > self.axes: - return x[0] - 1 - else: - assert 0 - class BoundFlatten(Bound): def __init__(self, attr, inputs, output_index, options): @@ -290,12 +273,6 @@ def bound_forward(self, dim_in, *x): def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi"): self.solver_vars = self.forward(*v) - def infer_batch_dim(self, batch_size, *x): - assert np.min(x) == np.max(x) - assert x[0] != self.axis - return x[0] - - BoundConcatFromSequence = BoundConcat class BoundShape(Bound): @@ -314,9 +291,6 @@ def forward(self, x): def bound_forward(self, dim_in, x): return self.forward_value - def infer_batch_dim(self, batch_size, *x): - return -1 - def interval_propagate(self, *v): return super().interval_propagate(*v) @@ -338,17 +312,23 @@ def forward(self, x, indices): self.indices = indices if self.axis == -1: self.axis = len(x.shape) - 1 - x = x.to(self.indices.device) # BoundShape.shape() will return value on cpu only + # BoundShape.shape() will return values on cpu only + x = x.to(self.indices.device) if indices.ndim == 0: + if indices == -1: + indices = x.shape[self.axis] + indices return torch.index_select(x, dim=self.axis, index=indices).squeeze(self.axis) elif self.axis == 0: - return torch.index_select(x, dim=self.axis, index=indices.reshape(-1)) \ - .reshape(*indices.shape, x.shape[-1]) + return torch.index_select( + x, dim=self.axis, index=indices.view(-1)).reshape( + *indices.shape, x.shape[-1]) elif self.indices.ndim == 1: # `index_select` requires `indices` to be a 1-D tensor return torch.index_select(x, dim=self.axis, index=indices) - raise ValueError('Unsupported shapes in Gather: data {}, indices {}, axis {}'.format(x.shape, indices.shape, self.axis)) + raise ValueError('Unsupported shapes in Gather: ' + f'data {x.shape}, indices {indices.shape}, ' + f'axis {self.axis}') def bound_backward(self, last_lA, last_uA, x, indices): assert self.from_input @@ -423,13 +403,6 @@ def interval_propagate(self, *v): assert not self.is_input_perturbed(1) return self.forward(v[0][0], v[1][0]), self.forward(v[0][1], v[1][0]) - def infer_batch_dim(self, batch_size, *x): - if x[0] != -1: - assert self.axis != x[0] - return x[0] - else: - return x[1] - def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi"): self.solver_vars = self.forward(v[0], v[1]) @@ -475,10 +448,6 @@ def bound_forward(self, dim_in, x, index): torch.gather(x.uw, dim=dim + 1, index=self.index.unsqueeze(1).repeat(1, dim_in, 1)), torch.gather(x.ub, dim=dim, index=self.index)) - def infer_batch_dim(self, batch_size, *x): - assert self.axis != x[0] - return x[0] - def _get_dim(self): dim = self.axis if dim < 0: @@ -520,13 +489,6 @@ def bound_forward(self, dim_in, x): def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi"): self.solver_vars = self.forward(*v) - def infer_batch_dim(self, batch_size, *x): - if x[0] == -1: - return -1 - else: - return self.perm.index(x[0]) - - class BoundSlice(Bound): def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) @@ -569,13 +531,6 @@ def interval_propagate(self, *v): def build_solver(self, *v, model, C=None, model_type="mip", solver_pkg="gurobi"): self.solver_vars = self.forward(*v) - def infer_batch_dim(self, batch_size, *x): - if x[0] == -1: - return -1 - else: - assert self.axes != x[0] - return x[0] - def bound_backward(self, last_lA, last_uA, *x): def _bound_oneside(A, start, end, axes, steps): if A is None: @@ -653,14 +608,6 @@ def forward(self, x, y): assert x.shape[i] == 1 or x.shape[i] == y[m - n + i] return x.expand(*list(y)) - def infer_batch_dim(self, batch_size, *x): - # FIXME should avoid referring to batch_size - if self.forward_value.shape[0] != batch_size: - return -1 - else: - raise NotImplementedError('forward_value shape {}'.format(self.forward_value.shape)) - - class BoundSplit(Bound): def __init__(self, attr, inputs, output_index, options): super().__init__(attr, inputs, output_index, options) @@ -702,7 +649,3 @@ def bound_forward(self, dim_in, x): lb = torch.split(x.lb, self.split, dim=self.axis)[self.output_index] ub = torch.split(x.ub, self.split, dim=self.axis)[self.output_index] return LinearBound(lw, lb, uw, ub) - - def infer_batch_dim(self, batch_size, *x): - assert x[0] != self.axis - return x[0] diff --git a/auto_LiRPA/operators/softmax.py b/auto_LiRPA/operators/softmax.py index c8fdd1c..cb91516 100644 --- a/auto_LiRPA/operators/softmax.py +++ b/auto_LiRPA/operators/softmax.py @@ -42,8 +42,4 @@ def interval_propagate(self, *v): exp_L, exp_U = torch.exp(h_L - shift), torch.exp(h_U - shift) lower = exp_L / (torch.sum(exp_U, dim=self.axis, keepdim=True) - exp_U + exp_L + epsilon) upper = exp_U / (torch.sum(exp_L, dim=self.axis, keepdim=True) - exp_L + exp_U + epsilon) - return lower, upper - - def infer_batch_dim(self, batch_size, *x): - assert self.axis != x[0] - return x[0] + return lower, upper diff --git a/auto_LiRPA/optimized_bounds.py b/auto_LiRPA/optimized_bounds.py index 7ec1ffd..00e6104 100644 --- a/auto_LiRPA/optimized_bounds.py +++ b/auto_LiRPA/optimized_bounds.py @@ -7,6 +7,7 @@ import torch from torch import optim from .cuda_utils import double2float +from .utils import logger def _set_alpha(optimizable_activations, parameters, alphas, lr): @@ -293,9 +294,8 @@ def _to_default_dtype( return total_loss, x, full_ret -def _update_best_ret( - full_ret_bound, best_ret_bound, full_ret, best_ret, need_update, idx): - """Update best_ret_bound and best_ret by comparing with new results.""" +def _get_idx_mask(idx, full_ret_bound, best_ret_bound): + """Get index for improved elements.""" assert idx in [0, 1], ( '0 means updating lower bound, 1 means updating upper bound') if idx == 0: @@ -305,10 +305,20 @@ def _update_best_ret( improved_idx = None if idx_mask.any(): - need_update = True # we only pick up the results improved in a batch improved_idx = idx_mask.nonzero(as_tuple=True)[0] - # total_loss = total_loss.to(best_ret_l) + return idx_mask, improved_idx + + +def _update_best_ret( + full_ret_bound, best_ret_bound, full_ret, best_ret, need_update, idx): + """Update best_ret_bound and best_ret by comparing with new results.""" + assert idx in [0, 1], ( + '0 means updating lower bound, 1 means updating upper bound') + idx_mask, improved_idx = _get_idx_mask(idx, full_ret_bound, best_ret_bound) + + if improved_idx is not None: + need_update = True if idx == 0: best_ret_bound[improved_idx] = torch.maximum( full_ret_bound[improved_idx], best_ret_bound[improved_idx]) @@ -326,14 +336,13 @@ def _update_best_ret( def _update_optimizable_activations( - optimizable_activations, pruning_in_iteration, - intermediate_layer_bounds, fix_intermediate_layer_bounds, - best_intermediate_bounds, idx, local_idx, alpha, best_alphas): + optimizable_activations, intermediate_layer_bounds, + fix_intermediate_layer_bounds, best_intermediate_bounds, + reference_idx, idx, alpha, best_alphas): """ Update bounds and alpha of optimizable_activations. """ for node in optimizable_activations: - reference_idx = local_idx if pruning_in_iteration else idx # Update best intermediate layer bounds only when they are optimized. # If they are already fixed in intermediate_layer_bounds, then do # nothing. @@ -606,6 +615,7 @@ def get_optimized_bounds( ret[0], float('-inf'), x, best_ret) best_ret_u = _save_ret_first_time( ret[1], float('inf'), x, best_ret) + ret_0 = ret[0].detach().clone() if bound_lower else ret[1].detach().clone() for node in optimizable_activations: new_intermediate = [ @@ -705,7 +715,6 @@ def get_optimized_bounds( else: loss = (total_loss * stop_criterion.logical_not()).sum() - stop_criterion_final = isinstance( stop_criterion, torch.Tensor) and stop_criterion.all() @@ -732,12 +741,12 @@ def get_optimized_bounds( ret_upd = _update_best_ret( full_ret_u, best_ret_u, full_ret, best_ret, need_update, idx=1) - best_ret_u, best_ret, idx_mask, idx, need_update = ret_upd + best_ret_u, best_ret, _, _, need_update = ret_upd if best_ret_l is not None: ret_upd = _update_best_ret( full_ret_l, best_ret_l, full_ret, best_ret, need_update, idx=0) - best_ret_l, best_ret, idx_mask, idx, need_update = ret_upd + best_ret_l, best_ret, _, _, need_update = ret_upd else: # Not saving the best, just keep the last iteration. if full_ret[0] is not None: @@ -748,45 +757,54 @@ def get_optimized_bounds( # FIXME: A should also be updated by idx. best_ret = [best_ret[0], best_ret[1], full_ret[2]] + if need_update: + patience = 0 # bounds improved, reset patience + else: + patience += 1 + # Save variables if this is the best iteration. # To save computational cost, we only check keep_best at the first # (in case divergence) and second half iterations # or before early stop by either stop_criterion or # early_stop_patience reached - # if i < 1 or i > iteration / 2 or stop_criterion_final or - # patience == early_stop_patience: if (i < 1 or i > int(iteration * start_save_best) or stop_criterion_final or patience == early_stop_patience): - if need_update: - patience = 0 # bounds improved, reset patience - local_idx = None + + # compare with the first iteration results and get improved indexes + if bound_lower: + idx_mask, idx = _get_idx_mask(0, full_ret_l, ret_0) + ret_0[idx] = full_ret_l[idx] + else: + idx_mask, idx = _get_idx_mask(1, full_ret_u, ret_0) + ret_0[idx] = full_ret_u[idx] + + if idx is not None: # for update propose, we condition the idx to update only # on domains preserved if pruning_in_iteration: # local sparse index of preserved samples where - # idx = true + # idx == true local_idx = idx_mask[preserve_mask].nonzero().view(-1) # idx is global sparse index of preserved samples where - # idx = true + # idx == true new_idx = torch.zeros_like( - idx_mask, dtype=torch.bool, device=idx.device) + idx_mask, dtype=torch.bool, device=x[0].device) new_idx[preserve_mask] = idx_mask[preserve_mask] idx = new_idx.nonzero().view(-1) + reference_idx = local_idx + else: + reference_idx = idx _update_optimizable_activations( - optimizable_activations, pruning_in_iteration, - intermediate_layer_bounds, - fix_intermediate_layer_bounds, - best_intermediate_bounds, idx, local_idx, alpha, - best_alphas) + optimizable_activations, intermediate_layer_bounds, + fix_intermediate_layer_bounds, best_intermediate_bounds, + reference_idx, idx, alpha, best_alphas) if beta and single_node_split: _update_best_beta( self, enable_opt_interm_bounds, betas, optimizable_activations, best_betas, idx) - else: - patience += 1 if os.environ.get('AUTOLIRPA_DEBUG_OPT', False): print(f'****** iter [{i}]', @@ -797,7 +815,7 @@ def get_optimized_bounds( break if patience > early_stop_patience: - print( + logger.debug( f'Early stop at {i}th iter due to {early_stop_patience}' ' iterations no improvement!') break diff --git a/auto_LiRPA/patches.py b/auto_LiRPA/patches.py index 87a7cbe..f79b360 100644 --- a/auto_LiRPA/patches.py +++ b/auto_LiRPA/patches.py @@ -146,6 +146,17 @@ def __add__(self, other): output_shape=self.output_shape, unstable_idx=self.unstable_idx) return A1_matrix.transpose(0, 1) + matrix + @property + def device(self): + if self.patches is not None: + return self.patches.device + if self.unstable_idx is not None: + if isinstance(self.unstable_idx, tuple): + return self.unstable_idx[0].device + else: + return self.unstable_idx.device + raise RuntimeError("Patches object is unintialized and cannot determine its device.") + def create_similar(self, patches=None, stride=None, padding=None, identity=None, unstable_idx=None, output_shape=None, inserted_zeros=None, output_padding=None, input_shape=None): @@ -392,7 +403,8 @@ def inplace_unfold(image, kernel_size, stride=1, padding=0, inserted_zeros=0, ou def maybe_unfold_patches(d_tensor, last_A, alpha_lookup_idx=None): """ Utility function to handle patch mode bound propagation in activation functions. - In patches mode, we need to unfold lower and upper slopes (as input "d_tensor"). In matrix mode we simply return. + In patches mode, we need to unfold lower and upper slopes (as input "d_tensor"). + In matrix mode we simply return. """ if d_tensor is None or last_A is None or isinstance(last_A, Tensor): return d_tensor diff --git a/auto_LiRPA/perturbations.py b/auto_LiRPA/perturbations.py index e198388..2c4955f 100644 --- a/auto_LiRPA/perturbations.py +++ b/auto_LiRPA/perturbations.py @@ -67,8 +67,12 @@ def init(self, x, aux=None, forward=False): raise NotImplementedError -"""Perturbation constrained by the L_0 norm (assuming input data is in the range of 0-1).""" class PerturbationL0Norm(Perturbation): + """Perturbation constrained by the L_0 norm. + + Assuming input data is in the range of 0-1. + """ + def __init__(self, eps, x_L=None, x_U=None, ratio=1.0): self.eps = eps self.x_U = x_U @@ -426,7 +430,7 @@ def init(self, x, aux=None, forward=False): batch_size, length, dim_word = x.shape[0], x.shape[1], x.shape[2] max_pos = 1 - can_be_replaced = np.zeros((batch_size, length), dtype=np.bool) + can_be_replaced = np.zeros((batch_size, length), dtype=bool) self._build_substitution(batch) diff --git a/auto_LiRPA/solver_module.py b/auto_LiRPA/solver_module.py index 9720ce5..b8e3d22 100644 --- a/auto_LiRPA/solver_module.py +++ b/auto_LiRPA/solver_module.py @@ -1,9 +1,3 @@ -import multiprocessing -import multiprocessing.pool -import sys -import os - -import torch from .bound_ops import * @@ -41,7 +35,7 @@ def build_solver_module(self, x=None, C=None, intermediate_layer_bounds=None, assert intermediate_layer_bounds is not None # Set the model to use new intermediate layer bounds, ignore the original ones. self._set_input(x, intermediate_layer_bounds=intermediate_layer_bounds) - + root = [self[name] for name in self.root_name] # create interval ranges for input and other weight parameters @@ -73,16 +67,16 @@ def _build_solver_general(self, node, C=None, model_type="mip", solver_pkg="guro if C is not None and isinstance(node, BoundLinear) and\ not node.is_input_perturbed(1) and self.final_name == node.name: # when node is the last layer - # merge the last BoundLinear node with the specification, + # merge the last BoundLinear node with the specification, # available when weights of this layer are not perturbed - solver_vars = node.build_solver(*inp, model=self.model, C=C, + solver_vars = node.build_solver(*inp, model=self.model, C=C, model_type=model_type, solver_pkg=solver_pkg) else: - solver_vars = node.build_solver(*inp, model=self.model, C=None, + solver_vars = node.build_solver(*inp, model=self.model, C=None, model_type=model_type, solver_pkg=solver_pkg) # just return output node gurobi vars return solver_vars - + def _build_solver_input(self, node): ## Do the input layer, which is a special case diff --git a/auto_LiRPA/utils.py b/auto_LiRPA/utils.py index e50ea0c..d08abcb 100644 --- a/auto_LiRPA/utils.py +++ b/auto_LiRPA/utils.py @@ -1,5 +1,4 @@ import logging -import pickle import time import torch import torch.nn as nn @@ -11,10 +10,9 @@ from collections.abc import Sequence from functools import reduce import operator -import math import warnings from typing import Tuple -from .patches import Patches, insert_zeros +from .patches import Patches logging.basicConfig( format='%(levelname)-8s %(asctime)-12s %(message)s', @@ -163,16 +161,16 @@ def __repr__(self): class Flatten(nn.Module): def forward(self, x): - return x.view(x.size(0), -1) + return x.view(x.size(0), -1) class Unflatten(nn.Module): def __init__(self, wh): super().__init__() self.wh = wh # width and height of the feature maps def forward(self, x): - return x.view(x.size(0), -1, self.wh, self.wh) + return x.view(x.size(0), -1, self.wh, self.wh) -def scale_gradients(optimizer, gradient_accumulation_steps, grad_clip=None): +def scale_gradients(optimizer, gradient_accumulation_steps, grad_clip=None): parameters = [] for param_group in optimizer.param_groups: for param in param_group['params']: @@ -180,7 +178,7 @@ def scale_gradients(optimizer, gradient_accumulation_steps, grad_clip=None): if param.grad is not None: param.grad.data /= gradient_accumulation_steps if grad_clip is not None: - return torch.nn.utils.clip_grad_norm_(parameters, grad_clip) + return torch.nn.utils.clip_grad_norm_(parameters, grad_clip) def recursive_map (seq, func): for item in seq: @@ -196,7 +194,7 @@ def unpack_inputs(inputs, device=None): inputs = list(inputs.values()) if isinstance(inputs, tuple) or isinstance(inputs, list): res = [] - for item in inputs: + for item in inputs: res += unpack_inputs(item, device=device) return res else: @@ -208,7 +206,7 @@ def isnan(x): if isinstance(x, Patches): return False return torch.isnan(x).any() - + def prod(x): return reduce(operator.mul, x, 1) @@ -245,10 +243,10 @@ def check_padding(x, padding): def get_spec_matrix(X, y, num_classes): with torch.no_grad(): - c = (torch.eye(num_classes).type_as(X)[y].unsqueeze(1) + c = (torch.eye(num_classes).type_as(X)[y].unsqueeze(1) - torch.eye(num_classes).type_as(X).unsqueeze(0)) I = (~(y.unsqueeze(1) == torch.arange(num_classes).type_as(y).unsqueeze(0))) - c = (c[I].view(X.size(0), num_classes - 1, num_classes)) + c = (c[I].view(X.size(0), num_classes - 1, num_classes)) return c def unravel_index( diff --git a/examples/sequence/lstm.py b/examples/sequence/lstm.py index 6e985b4..3991194 100644 --- a/examples/sequence/lstm.py +++ b/examples/sequence/lstm.py @@ -1,9 +1,7 @@ import os import shutil -import pdb import torch import torch.nn as nn -import torch.nn.functional as F from auto_LiRPA.utils import logger class LSTMCore(nn.Module): @@ -58,7 +56,7 @@ def save(self, epoch): os.mkdir(output_dir) path = os.path.join(output_dir, "model") torch.save(self.core.state_dict(), path) - with open(os.path.join(self.dir, "checkpoint"), "w") as file: + with open(os.path.join(self.dir, "checkpoint"), "w") as file: file.write(str(epoch)) logger.info("LSTM saved: %s" % output_dir) @@ -66,7 +64,7 @@ def build_optimizer(self): param_group = [] for p in self.core.named_parameters(): param_group.append(p) - param_group = [{"params": [p[1] for p in param_group], "weight_decay": 0.}] + param_group = [{"params": [p[1] for p in param_group], "weight_decay": 0.}] return torch.optim.Adam(param_group, lr=self.lr) def get_input(self, batch): @@ -78,4 +76,4 @@ def train(self): self.core.train() def eval(self): - self.core.eval() \ No newline at end of file + self.core.eval() \ No newline at end of file diff --git a/examples/vision/cifar_training.py b/examples/vision/cifar_training.py index d4019a9..9b559fa 100644 --- a/examples/vision/cifar_training.py +++ b/examples/vision/cifar_training.py @@ -13,7 +13,7 @@ import models from auto_LiRPA import BoundedModule, BoundedTensor, BoundDataParallel, CrossEntropyWrapper from auto_LiRPA.bound_ops import BoundExp -from auto_LiRPA.eps_scheduler import AdaptiveScheduler, FixedScheduler, SmoothedScheduler +from auto_LiRPA.eps_scheduler import LinearScheduler, SmoothedScheduler from auto_LiRPA.perturbations import * from auto_LiRPA.utils import MultiAverageMeter, logger, get_spec_matrix @@ -44,7 +44,7 @@ def get_exp_module(bounded_module): parser.add_argument("--lr_decay_rate", type=float, default=0.1, help='learning rate decay rate') parser.add_argument("--lr_decay_milestones", nargs='+', type=int, default=[1400, 1700], help='learning rate dacay milestones') parser.add_argument("--scheduler_name", type=str, default="SmoothedScheduler", - choices=["LinearScheduler", "AdaptiveScheduler", "SmoothedScheduler"], help='epsilon scheduler') + choices=["LinearScheduler", "SmoothedScheduler"], help='epsilon scheduler') parser.add_argument("--scheduler_opts", type=str, default="start=101,length=801,mid=0.4", help='options for epsilon scheduler') parser.add_argument("--bound_opts", type=str, default=None, choices=["same-slope", "zero-lb", "one-lb"], help='bound options for relu') diff --git a/examples/vision/jacobian.py b/examples/vision/jacobian.py new file mode 100644 index 0000000..50b2bdf --- /dev/null +++ b/examples/vision/jacobian.py @@ -0,0 +1,125 @@ +"""Examples of computing Jacobian bounds. + +We use a small model with two convolutional layers and dense layers respectively. +The width of the model has been reduced for the demonstration here. And we use +data from CIFAR-10. + +We show examples of: +- Computing Jacobian bounds +- Computing Linf local Lipschitz constants +- Computing JVP bounds +""" + +import numpy as np +import torch +import torch.nn as nn +import torch.nn.functional as F +import torchvision.datasets as datasets +import torchvision.transforms as transforms +from auto_LiRPA import BoundedModule, BoundedTensor +from auto_LiRPA.perturbations import PerturbationLpNorm +from auto_LiRPA.utils import Flatten + + +def build_model(in_ch=3, in_dim=32, width=32, linear_size=256): + model = nn.Sequential( + nn.Conv2d(in_ch, width, 3, stride=1, padding=0), + nn.ReLU(), + nn.Conv2d(width, width, 3, stride=1, padding=0), + nn.ReLU(), + Flatten(), + nn.Linear(width * (in_dim-4)**2, linear_size), + nn.ReLU(), + nn.Linear(linear_size, 10) + ) + return model + + +torch.manual_seed(0) + +# Create a small model and load pre-trained parameters. +model_ori = build_model(width=4, linear_size=32) +model_ori.load_state_dict(torch.load('pretrained/cifar_2c2f.pth')) +device = 'cuda' if torch.cuda.is_available() else 'cpu' +model_ori = model_ori.to(device) +print('Model:', model_ori) + +# Prepare the dataset +test_data = datasets.CIFAR10('./data', train=False, download=True, + transform=transforms.Compose([ + transforms.ToTensor(), + transforms.Normalize( + mean=[0.4914, 0.4822, 0.4465], std=[0.2009, 0.2009, 0.2009])])) +x0 = test_data[0][0].unsqueeze(0).to(device) + + +# Example 1: Convert the model for Jacobian bound computation +model = BoundedModule(model_ori, x0, device=device) +model.augment_gradient_graph(x0) + +# Sanity check to ensure that the new graph matches the original gradient computation +y = model_ori(x0.requires_grad_(True)) +ret_ori = torch.autograd.grad(y.sum(), x0)[0].view(1, -1) +# After running augment_gradient_graph, the model takes an additional input +# (the second input) which is a linear mapping applied on the output of the +# model before computing the gradient. It is the same as "grad_outputs" in +# torch.autograd.grad, which is "the 'vector' in the vector-Jacobian product". +# Here, setting torch.ones(1, 10) is equivalent to computing the gradients for +# y.sum() above. +ret_new = model(x0, torch.ones(1, 10).to(x0)) +assert torch.allclose(ret_ori, ret_new) + +for eps in [0, 1./255, 4./255]: + # The input region considered is an Linf ball with radius eps around x0. + x = BoundedTensor(x0, PerturbationLpNorm(norm=np.inf, eps=eps)) + # Compute the Linf locaal Lipscphitz constant + lower, upper = model.compute_jacobian_bounds(x) + print(f'Gap between upper and lower Jacobian bound for eps={eps:.5f}', + (upper - lower).max()) + if eps == 0: + assert torch.allclose(ret_new, lower.sum(dim=0, keepdim=True)) + assert torch.allclose(ret_new, upper.sum(dim=0, keepdim=True)) + + +# Example 2: Convert the model for Linf local Lipschitz constant computation +model = BoundedModule(model_ori, x0, device=device) +# Set norm=np.inf for Linf local Lipschitz constant +model.augment_gradient_graph(x0, norm=np.inf) + +# Sanity check to ensure that the new graph matches the original gradient computation +y = model_ori(x0.requires_grad_(True)) +ret_ori = torch.autograd.grad(y.sum(), x0)[0].abs().sum().view(-1) +ret_new = model(x0, torch.ones(1, 10).to(x0)).view(-1) +assert torch.allclose(ret_ori, ret_new) + +for eps in [0, 1./255, 4./255]: + # The input region considered is an Linf ball with radius eps around x0. + x = BoundedTensor(x0, PerturbationLpNorm(norm=np.inf, eps=eps)) + # Compute the Linf locaal Lipschitz constant + result = model.compute_jacobian_bounds(x) + print(f'Linf local Lipschitz constant for eps={eps:.5f}', result) + + +# Example 3: Convert the model for Jacobian-Vector Product (JVP) computation +model = BoundedModule(model_ori, x0, device=device) +vector = torch.randn(x0.shape).to(x0) +# Set vector for JVP computation +model.augment_gradient_graph(x0, vector=vector) + +# Sanity check to ensure that the new graph matches the original JVP +def func(x0): + return model_ori(x0.requires_grad_(True)) +ret_ori = torch.autograd.functional.jvp(func, x0, vector)[-1].view(-1) +ret_new = torch.zeros(10).to(x0) +for i in range(10): + c = F.one_hot(torch.tensor([i], dtype=torch.long), 10).to(x0) + ret_new[i] = model(x0, c) +assert torch.allclose(ret_ori, ret_new) + +for eps in [0, 1./255, 4./255]: + # The input region considered is an Linf ball with radius eps around x0. + x = BoundedTensor(x0, PerturbationLpNorm(norm=np.inf, eps=eps)) + # Compute the JVP + lower, upper = model.compute_jacobian_bounds(x) + print(f'JVP lower bound for eps={eps:.5f}', lower.view(-1)) + print(f'JVP upper bound for eps={eps:.5f}', upper.view(-1)) diff --git a/examples/vision/pretrain/README.md b/examples/vision/pretrain/README.md deleted file mode 100644 index 1ae6618..0000000 --- a/examples/vision/pretrain/README.md +++ /dev/null @@ -1 +0,0 @@ -Very small pretrained models for illustration only. diff --git a/examples/vision/pretrained/cifar_2c2f.pth b/examples/vision/pretrained/cifar_2c2f.pth new file mode 100644 index 0000000000000000000000000000000000000000..d82eedc848dfd2401a37bf690d3580453df69997 GIT binary patch literal 406287 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

Yk2d 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

Bzss^3xSLLDX1ntg508U@Utm^ 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 _4=D){|i%FBwd>FWu$d&8hb-oJ~iMwSR^d^Uv) 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�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,<{pytorch_version_u}) suitable ' @@ -40,7 +40,7 @@ install_requires=[ f'torch>={pytorch_version_l},<{pytorch_version_u}', 'torchvision>=0.9,<0.14', - 'numpy>=1.16', + 'numpy>=1.20', 'packaging>=20.0', 'pytest>=5.0', 'pylint>=2.15', diff --git a/tests/auto_LiRPA b/tests/auto_LiRPA deleted file mode 120000 index a0acdc3..0000000 --- a/tests/auto_LiRPA +++ /dev/null @@ -1 +0,0 @@ -../auto_LiRPA \ No newline at end of file diff --git a/tests/data/jacobian_test_data b/tests/data/jacobian_test_data new file mode 100644 index 0000000000000000000000000000000000000000..51d32b2c2b63d2a28974c86dc36b448c4d264b10 GIT binary patch literal 747 zcmWIWW@cev;NW1u00Im`42ea_8JT6N`YDMeiFyUuIc`pT3{fbcfho3-A-N=r&1$eV_oM;!EI0SgiVyV-+?@2#{D9W7%L}mT&YyZaiwhMy)0kuUZs|+)Ji2x<)s9t8lsiV}Win1q z(_s=F51!)9ne2)a3Wc1I8K<&wp2;|kjkDp&{Dep+UKWchaE07Boef(|#wcewU#HRW zxa??&P6G@0@g9^KkHZOLESt+W8RZ;`U)Rdt#B)kzrO9v=F00G(8pR8C(g{Kpt57P9 zOI+fXIxBR1Sl}&nC*W~1H7+yexe~tgBs6=6jFD)TH(R|i%nEzFL*e%K{6($@a;>6G z48Y({-vD!&C7j-*_n|K|en6L!6;#K(N7VCw9#C6L#?kVZ|53GFtLX755&mY0dpOvUEWzEk7Gh&sx5ozMh{>8~Rlstl&I( zcS|AFx70v0pS4lhzv6VYpqMHtFQBi~KtHOue<3}(kVn6owVJB4`97UER<9c^upjEP zSpqT45(poAPl0*91M<1^lW7wboO~&?`g%c|c!qliU55$%B4+w=kVTIc-44ath`fUJ`}VC>et$ns%{xnX{& z1I(3IA|lVq+&f-_g!T16gjJHlh(}x06|0FFH9jAr6n!vRM zPm$%a9S}Pm^dnYd4Y;NTzR>O6>^bbbv) ze|Li=%|Yn%oMuxCT@o&?5cW zQU-e%jBJN96OzwLK-KYw;J3@&sIWH`$fEWk@z_>$HR2qoE)GPqN_HS-jSv_D+L#R= zcOzlZ7G%<8Akpbirpa*>$xEK0m_?>USVJO%?id=EUoQZhcapbk zTaNKr^Y8~b+cT*KIa?E%;xr>pxEkGK*%0f#F0gLL9q`y8W;~|EE?v~V?RMNfLTiPMBfb?-^!r zT2z#|Wy(l7&R*8*c-(ei0ieM}uAjXy%#5)gLr9$?kzAu; zC~2VI-vXtFjUdT2Jvh*8wrJqtUZ4I@N$tavaQ7<)YNMmf`tV^_^LS^d>;Xrx0tWA7 z=LjIT&xV5B{*YswNd}X$#luT-+YU~RiROu6N=%}E1Y65qdY#W`?mJ5YtuaB~&VT<0 DtEYPj delta 3071 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 delta 5722 zcmcIoc|28H*f!5oks?LWpus%l>~}3uQW~VoRo7GrjYvh3qmrRC=rj?M3=NVL4QIcH zGNh=alu#%NP1J3;p}wQxe)o3o{r>y*@AvNW+iR`&+3(u>{XP3UPw~7+-`({JCYDx4 zW>&_QrY2@q2~R!0Uz;0Qm>FB}oJ401{jtE()XXeM!(Y}>XHAgiTt|_yjxxOSqSH0M z&6}B;nphbHjS$YutO*(^oEJ`OigCt%pEfhK6sGI@%g(A6TN5JElsR~R(xBq^2dU!lEY+M^FEzBA}Jzrg!fWX z+euwy;p)ZyOV=$i^jWxOq2VO6A9w73JodH&MHc+y7#SZ!6lRSQ=)B&?Mh2W?RWp31xm)VxorrM2G zDBc5ICtb?i*-D}!rD)fZ31oj#HF>d7gxXxRB~}%RL@b{}{pV~Z-8?tiJ1>@4NH3?m zI1)5c*_Gr4{Z3vDKSm;3)hVaUoHlQt0HT{zX+y6ajkbsAuo=pu_<#86Iw+H}UlI)^>P z!`+WM&oHNHn|ny9*Fn;J{UyAyx1rVdcaoW2AIR9SStR#FI+?61N$aOPAcEqTB(LZu z;kOyn>BU2+mvk^~c*vEZI;&@a&-*vTbg@6Z-jYmeI>l+t6De9{J(M&wtfxkEuaL$o z;zY$mjY!OKB$2R(>2p{_M}@DZ6~^b_MTi$^8AxbuJfC!DgwwqCFtU1TGHLHA1m`Vz zB(2PqT8z6-ykCz2%Y1v5bP4gmCmI$97?IX>~Da;xso^0ByMxF8tNo}wr&D^R-FWDQ>7<~uI9kOE(jg$?A z&a0O66?1{yanPinCXA=Y_vum3%kK2$>2-8PsWh>vj3qnwSWuGt7SB_u#Bvm`8(O|`i>myok5xO z12%)lPNa%P!TA>n0m=Xz^_aT%zA5^9)fuD(s zqBd2DQ6-VQXPk~GhDK~}C55WiRI~F9fkJnhX01;264sNn_~oEem=Djz7gHmfYs6<} z1hI|HC3<XCMR;ciI$Htd2&dPe!O#<^6 zV>=p@w3c2vyMi|FddIlyXpm742GL)}_K}DA3+c)c_SEO19J$S9*3oAD(KIP^GIejR zCMzR6sKabsGGwC_&8~@{l`x9VuF4|ORuXhshdWid>`I!=BFUIQHR@ion~XEKM50G# zkm)k^R402U6sIM?)#Am}#;B1LSBHYDAy5ggNkpljn~3pe(cRmBnO8vH( zIGoTcC7x3}=+QP!I^eJ#RXJl1jqB`4&bDFXTunF?R2?Q7b2m^wl?du{$DX9@vY@`1 zNyJWV13m5TPW$P`%b+-lSD|PAC(HD6wY{yWkY$W`c~TPG$dFp1ciK+SYjH~u87InW zO0)=UV!6g+UThe$noO-f-;+%AW8ucP_PW=n8_ zUp0a2v;g!jX~I&aNa#lu^QD5ZLe#PSsPmQooxi_*o$PJp|H|K;a$f|InLSL-8!hst zn=gn`5eP~Aiy%}^#=ct@mExqLGj z80)YBEQ6z1L24-bTyZnocg_P}-n)+bN+Z~NlLun-gfjSLeItCZxsTz&MfhaaN<3Nk z9Oa4>SedPT%-UhISR&QQj8i_!Mr3y2g|)Fb?@I?34voVZXX7zzK^}1P#^A!v5;jee zk5A>aao?3q%*w}ixXhi~^|0seG;qt-V>_+$VR(5gUe~Z@4~Si1dLGJv-n0=o=b{@^ z#+rHvKhOU zv_Q(hYalr%237ASa#ZOwG(6RetNp`Z&ou59=#{?-gN`NOg`=VvJ3j(G)kULwUJcyX zI-HZh9%n{X8o<`r-Ov~K2NRpO1J?x90ms(`bzTQBI>UtpWX#5#Tc_cCpdTadW58t1 zpM+hbN>S|DIoQ{df#>(-!rRboX#S!M-t6DSiMLC_3A0{8wBHpt%nggg`v&oNUQZg= z2?p|w;hKFZSvL_r zwB@4y{#JaEZiSwlGhov01y44WkhSX_o9OI=k)~}}e?9;eiXVe`$6gelbPQgG zk40{-ViS(B-G%S>jDh1Te}&1XDwy|Gk`U%M5UXmR#^)i& zg~C!}dG>vq5pG+*s|2wd&j@z;uYfuj6X)!fii{%T8tHrv`KO zEGZ^J_Tp@6X zDR?(V;O$SlFsn3;8FbtOdS)(#%+aNIZHOMMd;0(_@`~7f4~DQQt@XJ7bUY-j%ENY> z0><<~FmC$IAJhiPLQ<<2bn8rEhb?x)LOl*Xbw3Srnpzpj8SYrt9gIA)du&;vB__+8 zV|0BBa7$Ce@oB(ous5iHhUL33LeUi#YBylW?5T`>TM7;>OGb?#C1AT|!|A%;*;5&T zY(egLc&YacmHiKJw14Zs2V?|(D7g(ArcA)kmA~M`(=FKG(g{xT6TyAnB~;qm!tT$x z0$!h=;Q{Xn%)0h7Xe?id(JyauStU0DS8HEk+KjDe^G7ibsJhDb<$Ght$;~kDME0bz zoG{j?rv|%xJUJtjIG6U^I{`96v~WatIDWB-=a0-2z=Xmr z=sUp{w+U9^@N3s_uz@vg&9Py6eV;?8X(ID{2n!XhhZy74v)DPxJZRmb3X8dR z3)%d`n>hM6mf;gqO_nz@4fe)V!S->FV4!9miaO5X?>sUYX1qNL$0uyXxaGxo{h=;A zy}b=fd%8eQ`~WKFuY{&NHLO}(j`8!J{pKFRXNIrf*v=hL(wPc1EpBMm zUBrKTu$K8~;>i|u`T@7HsgqsH-e+$r&0vdq0Plxo;;}+Ew*Kq{oW6Ysrc2I4%@{8@ z+m_58>bxjqGDTpH>!8n=F7Udoj{CM(VvkWekgzzU)fv$A@d7lKY2y2r1P@8+L!?^} zxX)+dqTvVT(@ZtS9qzy-(!}^*EkQB!J}#RP`I!H^nI43vK0}w@*O;&|4hLw4Fh#{j z!9)2P9#wRJ)Fan8EsC|^#gE4LV0BE5(t`WX+Hm#QM36I>it9PZT;uJ>0~wd0#90;2 z6a_HRjZ3k>=QN7yX)wMd3p1LI@RwQCz|3pXAbCpyXAd{T6cg?=aM*bnM>=0dm&9SL z_S_xt;7|Q$WD|d!Y`-1lR724e5I#_W5SRcIp7 z$~<4u$i@WTh4qt9;M|f(CMDe%W#zWOLWA?5VxIwHVuwOsz$0AG+sq{D#$sZkI!GAD zFk%*!c=6pyyjU8H=MU84t|SinaxGAQWegNd_JakZ3Q+adW_E8_8>8s*p7k~8U|d|r zvCG|Rv5gy30m_}HP*L3#mrt6_EQwNuX{WTn{jnH)esCGvSC*pot4cVMQh`A{WfWNN zgp%a*FxNg4#0!mZOcKBy&pDuVHWOnjGw|qbWkzB6JxI$Qj$$F|aMtTA415*`9c^kgpBFoI57|C#1lSk}Pg=R>4{sgmC6LJ6L>!37965q>bGgs_v7#q=Y zXicfMJ~?q97U-H`y7N#}NIHgh`TFo?UKii==0SXNRSdZfmF%>`BjB-Q7J4;wfO7gH zJe1rC9RXXcZ8a_7q>nCC_TI#`@9Xer!9iwva~->Syc-uq*}0erM^IjO4ooU3L1~TE z_}Cxnhvp4&4F25O$6?#5fP^6-Z zoiFcHu5HqQ?~>buSJ|9<|CD#agukacY5!+xzfk?ThCdbEKY?`q14t+#xkAhEXQV&X+dq&#{wLB`AMH%PAaJ+Ej&`%S1r${o{|(XWKY%!Az6n|rZEjY zP1cDCA!KieF)_s0h5x5wzWAB%>-(Sk^y#zQd*A1L?mg$+b3fmXaEpVXeq@H8Bx&<2$GEEyH7@Ir+{mitdRi;S&GOhl*S` zkuu-L!Pd&!-pSaIiqpC7UUCvnah#XH#7l<%$$H63xE>~6a{N!$ zOGd&eEr@I9v!{ep_TyAUDxWhO5g(q$smAe~#L35fPHDKkrOhyFPA#r`JB&I{!AoW? z*Q@=XMki)(38(4D^%3>@3^UaF;}B?l1$VghFx%k{)|Q+$kIQqe^Ev0bpKz|%Nu{rZ z)A!^0eKE{Dl@8twzCy#!VVIqj1J8T^PTmba@NU%3yKyJ#00}qHj~gUX{lI$^KP}N8 z88`VFsJ*?Njf15vH<$;_m2g8k7?<^OZXb3DXKK=U)qZW(Nn)skGxy^xI;O8(J~~Ns zaBcZj0(Qf#?QN_%E1m#9iPr60%g*I&+PSvvgd8T}?EJXl={cOes5{SjXi~H!yj_?% zhmKixG!gMn1)Nh3C+rZdjOf%fUT`_)C6gvn{P3=wg33`2hq#W49v>=_!ZXDwDT$nO z4mYB+M(MLIq1K#B4mYy1s^{mO_&V1d&aJcVqeR3chD&&X4|VT6bM86ZsLmFeA9{!L zij@)Gu3UdN^2p&vcQ$H&#lJ_6^UUGAI-aMeMRX`=e6l!Q!g+sCv`)qPkD|q-rX+<* zrir5!xiS2NMuw+LQbN7s{d`B5N2H`DM@4_sMMam++kg(uROEdAk23H=JIvC`!I~Qz z*L{qEyoB@pF!?fGdR}@GZk)*&)h_%Wf5%V1U*}x;OSpg>F0eyU#gYha{HGj+sNFQCM)MQG8$vF0fk>XePZNiyrbTmM z3(_OfBwV;37a@}6A16j|kzbQkTL*h{u>ROuhZx>)9x-7 zU!(Eag7d}Aw(pNuE05V%oqw{S+T@3V>ULiGpHb=AZl~Ih|HjLpf8eEKvfN#a{uf@d zHGEm`i!Ln5J&}#*o7yoJqYnky{CoNzX83=k|66GZTX%LdQ#-zyCDGOn`f|5f*}tc6 z-)UC=NBYfyGg!0#iVnI%9$WadYfJm_-^ShItKNFi{a?oYqZm9*RF|%OlFxFL z%Mb4Gj*z~Tf5>)r-^0W{R_w0l@6xBnW0?|OGv^{Tsa{vHRL~SxS*ZU@HMwvlW`j)JjVRuaa8MtCyB)%Cd$S zf2nHz%__lLbEl@Zg$HXN6bVHSEv4e36;jbLCF#>_BerAi&(h+%$E#Mmek0BGlxMZ~ z%B70^>X^yh2A21#UTR-+PAI$QrL-VkoyFWf#9FPKtD@3Zv#7>lQs;9vFI(zUgf%q%sHo&4bdyBEHx%Dwe>*4(qaL+&chd}k|Yx4-=H-{fxiSLN=5^W*Mf z^Zz4vALTF1Zn(7F=Gfox@At3m-$y6!U)Vq2jmfOeFrm72!W!CAKcd6_87+C!?O*Hv z$F=)^)c<}~Bf+gr$ARw?(X{lLFxWtw23+oq0F$?LeP1||`nx0QCq+6d%s|uNfmoY4 z0>Mr7lr$p*9zI5-m1B?X=VstnHUK_#+bGXo4heq*L-o*jYO>9xL1GOApDUmt<_9Rx za0`uAaEHP6d{$GujQvs*31`b|R8ybH##=DRg*uS(506Rq;20Dv3MIkD2TY?y4f2y_ z(@x`~G}$!-oA2mAZKE+%%iYCX^lI9#*AjBi^>OIk_>haA}A-JT?{ZFOAx>@?NxILibt7t?BK6l!GN3r`va!YAYv znVp$Jy%tQxf|3L*ei25aw7Vi9a5d%T_hc?HF3{cRhDNs}D9CwHJ`U0aZX}*Q4yRsK zDabFDMbBB92%l(!$bUfKil z73;~j{%6*&H55;s3@LGSFcL=uQPcA{#2l7G?IC;WdpQTgwPPWXq|lt=@#Gg!Nf!;@ z&H+D(M-)@@`N zpv%H^e90%p3`hDozh5xw(9#DPQIAP=%Q2D* zx=hR0GsquWLnn{yq|{{+Q48I_)J!H|Vh;oMLw z^bw12@x~e|9UTLqgD#Z5bE2KD0T69-A;0UZNOeUHB|fl6Y>ow*cXPC5xesmk?Tz~5 zj(B~I!S~e9Y~(klsNd+$j+&k#ovQm(u!-2fB2Snd>`s4m(}G5D4m~MiNS|no;K@!f zdw+*~XbCN^DI#S-2rNYU$TwR=axOXKV)F|v-n4--+cwhg$EU(uSwbprW`G- zexMXsZrMWB1C~;lOjq7t%*Li$Ls66c2NPNxrAsUpg4PYf2}wOrv__udw!dNS{ZG*A zOl#zh-{sUs(d6uLiurZ@l^QP0r+jZW+!qN@f8++W{+7!Y?(G8S-=_+j1_!XMezp*V zn>!`R%45(WeQ0p4H1cU65-n?K%sUb8O$?#9AI>x5H|BKoH#a0M?}6t>o2b5bGno%A zq;U#5$c=bJrc(|Ez-;Tk~zJuUvc#H0M$-yV<8?wy5Pdgq2;M&wgc$`Z|cCsQVSihpa zA{%UeG9HU(L{sjjGi*beDXQj7B*CefsM`)2+YL}2P)@~T_A}?h-a@Uy;fQ%yP62c6 zXwtYDNK^NM*QfyKy;)2p?thVVoF04^-Xf)$40e@=Nc8J*dN}M339ybDpBqrF>uoZK z-$D6W{%x?zZ;jcR>GK zVEp~vw77aLT{&xpKJNkj+mSeN%m6<(bjKBWF)Y{gMOgSDR&}+C4BA@h;6hV4du03Ii zsg1f7&UCRn2Afp}p|n{A4_wUYrW?4h6W>&7#TAEYNS2Jmy!=rfm)W(9^b| zmEqcStSAUE$-o;GA%?9U02a%Fe*kCO&eTcUhNOxKhIO!{%^_9?-gD5h(giX zC&VUmaBtf}j=l7;_{ebDxUwts>%x(HVGq;S6eH|z7@BT`!({olly_(XGK$qvdWzAM zoGb`dRy!K`a@aC<07ftL$F_14h=T{PN{KD>x~tOhk?Se1>rpx?jG?Uh3*>iGgj;$p z@E$&hE{yTVB^@1DSo7>sBlEt-VOpsRghm0FZR&#; zKZRjOm@4Y7&Y^otL=@*z!%Vx%!~cLPoDOP1A>4|54vP@bC!PwHX0w*_IoS88FEroA zVCz@~p_)s)hrk9`S$kZ(m2dnrnQ zL|ug{GV-Zkqw%KM8hgshY4uP~7_2@j z{IPF$WW7^GnZ_~t>ud(XRGWojcPG-CHw7k%KhdE9nz&T0gzmEOSad)JL$dafWNI<( zDc(()6LjdF%uwX2wbIecPE@qz0PWE_Nu#a~LGzh@l-V^KVR!V|lPTFarzwMkC6>tb zH$~z3Wvp0sEHi`#p648=hDl3k&anb&ema=$Kd^&A+94($K9lldM#5du4svHpD7U;^ z81x&%9Eyiv%^WIm6Qi(KE-4%p;oC5K+)FymUd#1I;^|D%zwi_F(33;euga8m+7cI@ zO+>=c6BJb8h}P6}mXfA~#uXBJb+!vKD|S)Xsd#c6R6~}}j98S-5_&y%A-VO*M*Y>9 zzZIy{jlMGPRdlYR@pF@q?s_2?y50vJ( zQPavJ!s4Ru$z#0|`Ar>y+TAH6_jVuYPq9PGavh{5$RM!61I3#)Xs@I{4o&Tju=N$f z!8HTWwAzIH1l6=*%{)B~xwwQdWEe%GftM-?cer#c#+ zi%4I1m1^?hgq}C5$k#)b33Aj)^-vY7;v8v6U@Z1Hmr zv!R)#aw>anB7W*VWUMX%alRF^{&{+vC#Z z@o=v9B=Mm(dTksDkASnR;#39+!k#*v*O`cSN#mgt-y5>0HBlqCT6p2L1B6HB(D<#c zXsEKI<}=2$@$N)yur!88(GS!#U>LRf=CD=$gHTz%gZA#%#b|49hz{3~Ld85%SRX;A zt%_(WZl>6C0z7IlfPqy26YqCMM&Tu@Z&}P7$8V-ny=1YVECt^tWuxNHja2Z)kQ6RN zV$u(>yl>|Tv70X2yQDWfp6Fp~;6QA7txuPiC_>n_mbR<<;$ENyJsz8gx$lk8zk5Ht zJF|#Z^6T%*EB#Pd_M9aN)o@+g4Q>5wu+?b_iihTq;Bqgg*O%9k@CLtsa~O>ly+JT2 zJt7qB)+9l#H{%`*#vMBY+}q9DpZP!1zPc3b9T0)CL2j(+y^z!m4e`Luh@$)Vg6l=z z_x0~ihu4cxy2gr3COXr?{TC=%dkKw*Q-te%XG&b|3j@|9jMCXdWd{9`Q92NEdx5CJ z15~-V55(rXnYUFbEzFQZ(@;;=5E)H{nuZYX%w~>rLXg~jE(zk+(!c{=IH0?q0{K1Z zO#?BGkBh*Gl2}ysoX?i7o67e!g_YW1Bwwi_t;HhBeb4vNYxsq(jd6jtU$*RIW@%lhtE_+loG>5arv4F%lJ=mBx~E#_!Z zL1tY%;H_s&{)X-_IpIgG6~ow!n`SVJ%*3tPQ_=WnAQcWTW{c+pqHM!%_WEQXPVJhB zh}^fdvA-BQPF1r@u8{~fjD$}?4yGLM582maP^>b7+FyA$KBmI^kV7$hrzJE_ z#qs;yb1Z)KAQaj4qyY!?ptFA>0{mR)^_3N*6ktNn(vp$=>^9l|vXRuEHj~{HS;*NX z(92s=5@(Gh`6*M8Er>^Ht{ZNQt|Fx)SyY^n14)K6nW*Qn#a&zwG-MJ~j)%bWx;84K zTS%a4?PPxRB*m66=ucchnl@WVu5u)vOx;ZncJp&&GGAC_bCwE22cmwA8@Af^!Q*pw zz{MyC4O}q}gmT9j@Y&cOak`Vy<2!E%iuSUq)#lWvISAucXQ5)lI#RN=Lgl?U%vV0b z?BzC7+OH{azjdDKXAi;ru|rVsTo-w^Q_;I6h5zoci|x(nkKNxHVW+-2tSw5(sKgcx z+WY7)3BjvRf9RZm?+hW1_y$FY|RP@Q##WqDns2dms*psNpyy{TAEp_s&(VAAY#80&gc+MutixWNX#nI`Aen>UJaNagpS5uL~|s)5bO4hY`>5VihBO zN%@5*YQKNN`}wn-iZd*j&&UN-%siRn^HA)r4MWS|X7Y;(M8hRb#H}o%r}C|I+-p1O zMDC^q?|sm`TYbt;6_RbnF71Mb1CeR5&Z6ZVq&cuMpb3N_}NU# z<+SMW&&J4%zf4ivdsC~D0&AQe2T}eMdTyM;`%yad<4k8fk!+xOF2UGpHXXMd5>cd* zO@jNCWVXza+Db0a=yL;sW`3Mc&L!tbe(-sElG1L-!oJpmG}ZL6R#O!zWBs90HwoiJ zad@%R6KzGW>20Pr>Sl)G+HXNvTQd$3X{99c=?Z7yDeg%DHL10- zF-E%RS`>_T@qbZ^Z6O6amXXPXI_4bffWLygU@}L8eyf=Tnd_#=jhx1^>iKVVQy)^I zS~}S;BD66H^BzYKtg zx0f46cZdH1RoIq~qWtwu6u(v#_b&FK>I7vJmw2<~l`eSjt(acBSwJFxogT!GA+H(( zSUweyp6ggd-&VlxJ-V>EFn{?Ufij^Z$Z(Cr8qA?E6b3v($+< z8#EZIQFSEJoXvh|(M7X`Hu@gcz)dkhW6C`8_+=`7zR?Bsmcy8P^&(>4{jlz}2#TXu zP?+x`@|gIHoP&N5=9O(GE%^~Na78ja1Vs5!E%bw7IP|klQ{pf2s1KV;!599Z-(2KT zyIzY<-tj_018UMv(7n;7@a4Z>My!v7sAnFFDLPKZlU?ynypTMGDbl-qKg`b?0a?mGuWzl8 z9dVFaGwv|6@L{BVa{%0J&d`|$nUE|AK($^EOe>#`xIxOOOVvf)gdD8g(?rMT4#MQP zR`S`OfquUBcs_9#sg}gEUGl1E3w%%AorhzloE=(yELhEeeXLI90F_-VVCH`Ecsbe| zuU)6ZGv^5zyn4tMuAYFR6NY46JP~VMw$i}cb7^;_FWzl8hU=S3GBWgmI9I}&!z)Qo zC7$FC$Wz$EET$AjWZumTPuIp%-tjcZUp+Is^fpeNj_oOD|)tQiIzCD)C)R z`4+v9>H3V_KA?k|frhl}L=?t9{*4ME6W9)V#me$ySWcB9Udweu+npTBTmKD-U%X(I z1_9LEwU}zRjV0NBW)S>hg%ZmpbYN5$7`K*F(B=I!d)RGiQuvv4!xPYC*A4zkE;!ID z9+~`ltT96sO-}~F^d5&|!(UmC@tU}0+#grS4pCPWVQ!j$0Y7rcbsNo!eN1Rt{0QW2 z9Ewu;QP>~|g=5ZiY`Slc5l@w|Dl`@QPTZxZuTN8DydF6`OozaJ0$nS+K&MzXaxW&a zk>~mE6@%WAyMiUUjOM?a*+e31tv3R$y(ig)^XY7K5K^=W7VBhCaGUpOhM4ku3k}-Q z_6NH+Vh!u-s)Dko6RGKUew`?}&Pp%=jZ4SjiNRsIcvBN=8z0c~O{eL%;b9m!Hw_ER zg3+}35X(vkLGPc&z#yQGd}@T4XRnNgpnlYl??Uadmpjpl<8!qHg7)K|<3B2bk$=a3 zKBRfLyWro%d_Km0+RrwM?Hrul5F7X*0L614(|-APPSvN;_x7mF=jF=`t1o+h8dul- ztZOSD&HuFb7xDTpfj$k2e-0GDXEb~js52=4CD5nQ?azUl{t>7nqW&e&r(x>Pfx`GK zudi|RAvFFa(5G?d&w-l$0q8@F`%9ot1BsslwP%5RjiV1i>o0*mjRt-WRL>_BeGTYC z6!J@;PeXa10|oF&NM8Z^7)tyS=u;i}9H{9ZfjV+{z6API)Z3He{!{9W|HIJ-1@rZi zmpA*+LchztjXQlS+Jiho1=sffN+7tZ*lTAABW%!e?SJ(E`8@^8uL3{ho Gw*L=3WMK#Z literal 0 HcmV?d00001 diff --git a/tests/data/maxpool_test_data_3-1-3-1 b/tests/data/maxpool_test_data_3-1-3-1 new file mode 100644 index 0000000000000000000000000000000000000000..8a0f7aa7fc4973ba41fda21f1bc1af481d552be5 GIT binary patch literal 10880 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 literal 0 HcmV?d00001 diff --git a/tests/data/maxpool_test_data_4-0-4-0 b/tests/data/maxpool_test_data_4-0-4-0 index e054b4a953d877d1dbf055acf47596a373a34d51..ea804d5fba5e6b24a9bf2df747e555d1bf910444 100644 GIT binary patch literal 10112 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 p%2p-=z- diff --git a/tests/data/maxpool_test_data_4-0-4-1 b/tests/data/maxpool_test_data_4-0-4-1 index 83f17ef49892bfe9e592e93bb392eca4c31f253c..3ab4542c26398f7d91f019d7cfd8072e656edfbf 100644 GIT binary patch literal 10432 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 literal 10496 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 literal 0 HcmV?d00001 diff --git a/tests/data/maxpool_test_data_4-1-4-1 b/tests/data/maxpool_test_data_4-1-4-1 new file mode 100644 index 0000000000000000000000000000000000000000..46baae67f3b8b6f1abad34a02e2971a50ca754ad GIT binary patch literal 10432 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 sn+a literal 0 HcmV?d00001 diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 100644 index 0000000..9da241c --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1,2 @@ +onnxruntime>=1.12 +git+https://github.com/KaidiXu/onnx2pytorch.git \ No newline at end of file diff --git a/tests/test_1d_activation.py b/tests/test_1d_activation.py index 232b47b..2a0a552 100644 --- a/tests/test_1d_activation.py +++ b/tests/test_1d_activation.py @@ -1,7 +1,6 @@ """Test one dimensional activation functions (e.g., ReLU, tanh, exp, sin, etc)""" import torch import torch.nn as nn -import os from testcase import TestCase from auto_LiRPA import BoundedModule, BoundedTensor from auto_LiRPA.perturbations import * @@ -23,7 +22,7 @@ def __init__(self, methodName='runTest'): def create_test(self, act_func, low, high, ntests=10000, nsamples=1000, method='IBP'): print(f'Testing activation {act_func}') - + model = test_model(act_func) image = torch.zeros(1, ntests) bounded_model = BoundedModule(model, image) diff --git a/tests/test_constant.py b/tests/test_constant.py index 756a125..004131d 100644 --- a/tests/test_constant.py +++ b/tests/test_constant.py @@ -6,7 +6,7 @@ import torchvision from auto_LiRPA import BoundedModule, BoundedTensor from auto_LiRPA.perturbations import * -from testcase import TestCase +from testcase import TestCase class cnn_MNIST(nn.Module): def __init__(self): @@ -25,15 +25,15 @@ def forward(self, x): x = self.fc2(x) return 0.5 * x -class TestConstant(TestCase): +class TestConstant(TestCase): def __init__(self, methodName='runTest', generate=False): - super().__init__(methodName, + super().__init__(methodName, seed=1, ref_path='data/constant_test_data', generate=generate) def test(self): model = cnn_MNIST() - checkpoint = torch.load("../examples/vision/pretrain/mnist_cnn_small.pth", map_location="cpu") + checkpoint = torch.load("../examples/vision/pretrained/mnist_cnn_small.pth", map_location="cpu") model.load_state_dict(checkpoint) N = 2 @@ -49,7 +49,7 @@ def test(self): pred = model(image) lb, ub = model.compute_bounds() - assert lb.shape == ub.shape == torch.Size((2, 10)) + assert lb.shape == ub.shape == torch.Size((2, 10)) self.result = (lb, ub) self.check() @@ -58,4 +58,4 @@ def test(self): # Change to generate=True when genearting reference results testcase = TestConstant(generate=False) testcase.setUp() - testcase.test() + testcase.test() diff --git a/tests/test_jacobian.py b/tests/test_jacobian.py new file mode 100644 index 0000000..d887539 --- /dev/null +++ b/tests/test_jacobian.py @@ -0,0 +1,64 @@ +"""Test Jacobian bounds.""" +import torch +import torch.nn as nn +import torch.nn.functional as F +from auto_LiRPA import BoundedModule, BoundedTensor +from auto_LiRPA.perturbations import * +from testcase import TestCase + + +class MLP(nn.Module): + def __init__(self): + super().__init__() + self.fc1 = nn.Linear(16**2, 20) + self.fc2 = nn.Linear(20, 10) + + def forward(self, x): + x = torch.flatten(x, -1) + x = F.relu(self.fc1(x)) + x = self.fc2(x) + return x + + +class CNN(nn.Module): + def __init__(self): + super().__init__() + self.conv1 = nn.Conv2d(1, 2, 7, stride=1, padding=0) + self.conv2 = nn.Conv2d(2, 3, 7, stride=1, padding=0) + self.fc1 = nn.Linear(48, 20) + self.fc2 = nn.Linear(20, 10) + + def forward(self, x): + x = F.relu(self.conv1(x)) + x = F.relu(self.conv2(x)) + x = x.view(x.size(0), -1) + return self.fc2(F.relu(self.fc1(x))) + + +class TestJacobian(TestCase): + def __init__(self, methodName='runTest', generate=False): + super().__init__( + methodName, seed=1, ref_path='data/jacobian_test_data', + generate=generate) + + def test(self): + image = torch.randn(1, 1, 16, 16) + model = CNN() + model = BoundedModule(model, image, device='cpu') + ptb = PerturbationLpNorm(eps=0.1) + x = BoundedTensor(image, ptb) + output = model(x) + print(output) + model.augment_gradient_graph(x) + ret = model.compute_jacobian_bounds( + x, labels=torch.tensor([1], dtype=torch.long)) + print(ret) + self.result = [ret] + self.check() + + +if __name__ == '__main__': + # Change to generate=True when genearting reference results + testcase = TestJacobian(generate=False) + testcase.setUp() + testcase.test() diff --git a/tests/test_maxpool.py b/tests/test_maxpool.py index e77e15c..0af29ce 100644 --- a/tests/test_maxpool.py +++ b/tests/test_maxpool.py @@ -10,26 +10,13 @@ from auto_LiRPA.utils import Flatten from testcase import TestCase -def MadryCNN(): - return nn.Sequential( - nn.Conv2d(1, 32, 5, stride=1, padding=2), - nn.ReLU(), - nn.MaxPool2d(2, stride=2), - nn.Conv2d(32, 64, 5, stride=1, padding=2), - nn.ReLU(), - nn.MaxPool2d(2, stride=2), - Flatten(), - nn.Linear(64*7*7,1024), - nn.ReLU(), - nn.Linear(1024, 10) - ) class Model(nn.Module): def __init__(self, kernel_size=4, stride=4, padding=0, conv_padding=0): super(Model, self).__init__() - self.n_n_conv2d = nn.Conv2d(**{'groups': 1, 'dilation': [1, 1], 'out_channels': 1, 'padding': [0, 0], 'kernel_size': (2, 2), 'stride': [1, 1], 'in_channels': 1, 'bias': True}) + self.n_n_conv2d = nn.Conv2d(**{'groups': 1, 'dilation': [1, 1], 'out_channels': 1, 'padding': conv_padding, 'kernel_size': (2, 2), 'stride': [1, 1], 'in_channels': 1, 'bias': True}) self.n_n_maxpool = nn.MaxPool2d(**{'kernel_size': [kernel_size, kernel_size], 'ceil_mode': False, 'stride': [stride, stride], 'padding': [padding, padding]}) - self.n_n_conv2d_2 = nn.Conv2d(**{'groups': 1, 'dilation': [1, 1], 'out_channels': 8, 'padding': [conv_padding, conv_padding], 'kernel_size': (2, 2), 'stride': [1, 1], 'in_channels': 1, 'bias': True}) + self.n_n_conv2d_2 = nn.Conv2d(**{'groups': 1, 'dilation': [1, 1], 'out_channels': 1, 'padding': [conv_padding, conv_padding], 'kernel_size': (2, 2), 'stride': [1, 1], 'in_channels': 1, 'bias': True}) self.n_n_maxpool_2 = nn.MaxPool2d(**{'kernel_size': [kernel_size, kernel_size], 'ceil_mode': False, 'stride': [stride, stride], 'padding': [padding, padding]}) self.n_n_flatten_Flatten = nn.Flatten(**{'start_dim': 1}) @@ -44,14 +31,14 @@ def forward(self, *inputs): t_maxpool = self.n_n_maxpool(t_conv2d_relu)[:, :, :, :] t_conv2d_max = self.n_n_conv2d_2(t_maxpool) t_conv2d_max = F.relu(t_conv2d_max) - t_maxpool_2 = self.n_n_maxpool_2(t_conv2d_max) - t_flatten_Transpose = t_maxpool_2.permute(*[0, 2, 3, 1]) + # t_maxpool_2 = self.n_n_maxpool_2(t_conv2d_max) + t_flatten_Transpose = t_conv2d_max.permute(*[0, 2, 3, 1]) t_flatten_Flatten = self.n_n_flatten_Flatten(t_flatten_Transpose) t_flatten_Unsqueeze = torch.unsqueeze(t_flatten_Flatten, 2) t_flatten_Unsqueeze = torch.unsqueeze(t_flatten_Unsqueeze, 3) if self.n_n_dense is None: - self.n_n_dense = nn.Conv2d(**{'groups': 1, 'dilation': [1, 1], 'out_channels': 10, 'padding': [0, 0], 'kernel_size': (1, 1), 'stride': [1, 1], 'in_channels': t_flatten_Unsqueeze.shape[1], 'bias': True}) + self.n_n_dense = nn.Conv2d(**{'groups': 1, 'dilation': [1, 1], 'out_channels': 2, 'padding': [0, 0], 'kernel_size': (1, 1), 'stride': [1, 1], 'in_channels': t_flatten_Unsqueeze.shape[1], 'bias': True}) t_dense = self.n_n_dense(t_flatten_Unsqueeze) t_activation_Flatten = self.n_n_activation_Flatten(t_dense) @@ -69,7 +56,7 @@ def test(self): N = 2 for kernel_size in [3,4]: - for padding in [0]: + for padding in [0,1]: for conv_padding in [0,1]: print(kernel_size, padding, kernel_size, conv_padding) @@ -116,5 +103,5 @@ def test(self): if __name__ == '__main__': - testcase = TestMaxPool(generate=True) + testcase = TestMaxPool(generate=False) testcase.test() diff --git a/tests/test_resnet_patches.py b/tests/test_resnet_patches.py index 1da8197..5374ccb 100644 --- a/tests/test_resnet_patches.py +++ b/tests/test_resnet_patches.py @@ -1,8 +1,5 @@ import torch -import random import numpy as np -import torch.nn as nn -import torch.nn.functional as F import torchvision from auto_LiRPA import BoundedModule, BoundedTensor from auto_LiRPA.perturbations import * @@ -11,9 +8,10 @@ import models from testcase import TestCase -class TestResnetPatches(TestCase): + +class TestResnetPatches(TestCase): def __init__(self, methodName='runTest', generate=False): - super().__init__(methodName, + super().__init__(methodName, seed=1234, ref_path='data/resnet_patches_test_data', generate=generate) @@ -27,10 +25,10 @@ def test(self): self.reference = torch.load(self.ref_path) for model_ori in model_oris: - conv_mode = 'patches' # conv_mode can be set as 'matrix' or 'patches' - + conv_mode = 'patches' # conv_mode can be set as 'matrix' or 'patches' + normalize = torchvision.transforms.Normalize(mean = [0.4914, 0.4822, 0.4465], std = [0.2023, 0.1994, 0.2010]) - test_data = torchvision.datasets.CIFAR10("./data", train=False, download=True, + test_data = torchvision.datasets.CIFAR10("./data", train=False, download=True, transform=torchvision.transforms.Compose([torchvision.transforms.ToTensor(), normalize])) N = 1 n_classes = 10 diff --git a/tests/test_simple_verification.py b/tests/test_simple_verification.py index f648611..8f4fb72 100644 --- a/tests/test_simple_verification.py +++ b/tests/test_simple_verification.py @@ -28,7 +28,7 @@ def __init__(self, methodName='runTest'): def test(self): model = mnist_model() checkpoint = torch.load( - '../examples/vision/pretrain/mnist_a_adv.pth', + '../examples/vision/pretrained/mnist_a_adv.pth', map_location=torch.device('cpu')) model.load_state_dict(checkpoint) diff --git a/tests/testcase.py b/tests/testcase.py index 5620617..b4dff42 100644 --- a/tests/testcase.py +++ b/tests/testcase.py @@ -3,13 +3,12 @@ import torch import numpy as np -""" -Superclass for unit test cases in auto_LiRPA. -""" + class TestCase(unittest.TestCase): + """Superclass for unit test cases in auto_LiRPA.""" def __init__(self, methodName='runTest', seed=1, ref_path=None, generate=False): super().__init__(methodName) - + self.addTypeEqualityFunc(np.ndarray, 'assertArrayEqual') self.addTypeEqualityFunc(torch.Tensor, 'assertTensorEqual') @@ -23,27 +22,27 @@ def set_seed(self, seed): random.seed(seed) np.random.seed(seed) - """ - Load the reference result if it exists - """ def setUp(self): - self.reference = torch.load(self.ref_path) if self.ref_path else None + """Load the reference result if it exists.""" + if self.generate: + self.reference = None + else: + self.reference = torch.load(self.ref_path) if self.ref_path else None - """ - Save result for future comparison - """ def save(self): + """Save result for future comparison.""" print('Saving result to', self.ref_path) torch.save(self.result, self.ref_path) - """ - This function can be called at the end of each test. - If `self.generate == True`, save results for future comparison; otherwise, - compare the current results `self.result` with the loaded reference - `self.reference`. Results are expected to be a list or tuple of - `torch.Tensor` instances. - """ def check(self): + """Save or check the results. + + This function can be called at the end of each test. + If `self.generate == True`, save results for future comparison; + otherwise, compare the current results `self.result` with the loaded + reference `self.reference`. Results are expected to be a list or tuple + of `torch.Tensor` instances. + """ if self.generate: self.save() else: @@ -58,4 +57,4 @@ def assertArrayEqual(self, a, b, msg=None): def assertTensorEqual(self, a, b, msg=None): self.assertIsInstance(a, torch.Tensor, 'First argument is not an torch.Tensor') self.assertIsInstance(b, torch.Tensor, 'Second argument is not an torch.Tensor') - return torch.allclose(a, b) + return torch.allclose(a, b)