From d866f116b5f67c3c9eb54c65250fa3bf20333780 Mon Sep 17 00:00:00 2001 From: Louis Bethune Date: Fri, 15 Mar 2024 17:03:53 +0100 Subject: [PATCH] setup docs --- .github/workflows/python-linters.yml | 28 ++++ .github/workflows/tests.yml | 4 +- .pre-commit-config.yaml | 2 +- CONTRIBUTING.md | 14 +- README.md | 10 +- deel/lipdp/dynamic.py | 9 +- deel/lipdp/model.py | 1 + deel/lipdp/pipeline.py | 16 ++- deel/lipdp/sensitivity.py | 35 +++-- docs/CONTRIBUTING.md | 13 +- docs/assets/residuals.png | Bin 0 -> 100972 bytes docs/index.md | 184 +++++++++++++++++--------- docs/notebooks/advanced_cifar10.ipynb | 4 +- mkdocs.yml | 14 +- setup.cfg | 5 +- setup.py | 44 +++--- tests/model_test.py | 21 +-- tests/sensitivity_test.py | 13 +- 18 files changed, 270 insertions(+), 147 deletions(-) create mode 100644 .github/workflows/python-linters.yml create mode 100644 docs/assets/residuals.png diff --git a/.github/workflows/python-linters.yml b/.github/workflows/python-linters.yml new file mode 100644 index 0000000..2ff3d9b --- /dev/null +++ b/.github/workflows/python-linters.yml @@ -0,0 +1,28 @@ +name: lip-dp linters + +on: + push: + branches: + - main + - release-no-advertising + pull_request: + branches: + - main + - release-no-advertising + +jobs: + checks: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Python 3.11 + uses: actions/setup-python@v4 + with: + python-version: 3.11 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install tox + - name: Check lint + run: tox -e py311-lint \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 6b5cb7e..53e32e4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -2,9 +2,9 @@ name: tests on: push: - branches: ["release-no-advertising"] + branches: ["main", "release-no-advertising"] pull_request: - branches: ["release-no-advertising"] + branches: ["main", "release-no-advertising"] jobs: build-and-test: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b279b16..27251e3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -45,7 +45,7 @@ repos: rev: v3.0.0a5 hooks: - id: pylint - args: [--enable=unused-import --max-line-length=100, --disable=all] + args: [--disable=all] # - repo: https://github.com/commitizen-tools/commitizen diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 825a653..ebca628 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,14 +4,14 @@ Thanks for taking the time to contribute! From opening a bug report to creating a pull request: every contribution is appreciated and welcome. If you're planning to implement a new feature or change -the api please create an [issue first](https://https://github.com/deel-ai/dp-lipschitz/issues/new). This way we can ensure that your precious +the api please create an [issue first](https://github.com/Algue-Rythme/lip-dp/issues). This way we can ensure that your precious work is not in vain. ## Setup with make -- Clone the repo `git clone https://github.com/deel-ai/lipdp.git`. -- Go to your freshly downloaded repo `cd lipdp` +- Clone the repo `git clone git@github.com:Algue-Rythme/lip-dp.git`. +- Go to your freshly downloaded repo `cd lip-dp` - Create a virtual environment and install the necessary dependencies for development: `make prepare-dev && source lipdp_dev_env/bin/activate`. @@ -26,9 +26,8 @@ This command activate your virtual environment and launch the `tox` command. `tox` on the otherhand will do the following: -- run pytest on the tests folder with python 3.6, python 3.7 and python 3.8 -> Note: If you do not have those 3 interpreters the tests would be only performs with your current interpreter -- run pylint on the deel-datasets main files, also with python 3.6, python 3.7 and python 3.8 +- run pytest on the tests folder +- run pylint on the deel-datasets main files > Note: It is possible that pylint throw false-positive errors. If the linting test failed please check first pylint output to point out the reasons. Please, make sure you run all the tests at least once before opening a pull request. @@ -42,7 +41,7 @@ Basically, it will check that your code follow a certain number of convention. A After getting some feedback, push to your fork and submit a pull request. We may suggest some changes or improvements or alternatives, but for small changes -your pull request should be accepted quickly (see [Governance policy](https://github.com/deel-ai/lipdp/blob/master/GOVERNANCE.md)). +your pull request should be accepted quickly (see [Governance policy](https://github.com/Algue-Rythme/lip-dp/blob/release-no-advertising/GOVERNANCE.md)). Something that will increase the chance that your pull request is accepted: @@ -51,4 +50,3 @@ Something that will increase the chance that your pull request is accepted: - Follow the existing coding style and run `make check_all` to check all files format. - Write a [good commit message](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) (we follow a lowercase convention). - For a major fix/feature make sure your PR has an issue and if it doesn't, please create one. This would help discussion with the community, and polishing ideas in case of a new feature. - diff --git a/README.md b/README.md index 90ad831..ea0322c 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,26 @@

-lipdp_logo

+lipdp_logo

- + Tests + + Linter +
-
+

LipDP is a Python toolkit dedicated to robust and certifiable learning under privacy guarantees. +

This package is the code for the paper "*DP-SGD Without Clipping: The Lipschitz Neural Network Way*" by Louis Béthune, Thomas Massena, Thibaut Boissin, Aurélien Bellet, Franck Mamalet, Yannick Prudent, Corentin Friedrich, Mathieu Serrurier, David Vigouroux, published at the **International Conference on Learning Representations (ICLR 2024)**. The paper is available on [arxiv](https://arxiv.org/abs/2305.16202). diff --git a/deel/lipdp/dynamic.py b/deel/lipdp/dynamic.py index cf786eb..8091b09 100644 --- a/deel/lipdp/dynamic.py +++ b/deel/lipdp/dynamic.py @@ -20,6 +20,7 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +"""Dynamic gradient clipping for differential privacy.""" import random from abc import abstractmethod @@ -66,9 +67,11 @@ def on_train_begin(self, logs=None): def get_gradloss(self): """Computes the norm of gradient of the loss with respect to the model's output. - - Warning: this method is unsafe from a privacy perspective, as the true gradient bound is computed. - It is meant to be used with privacy-preserving methods only, such as the ones implemented in this module. + + Warning: this method is unsafe from a privacy perspective, + as the true gradient bound is computed. + It is meant to be used with privacy-preserving methods only, + such as the ones implemented in this module. """ batch = next(iter(self.ds_train.take(1))) imgs, labels = batch diff --git a/deel/lipdp/model.py b/deel/lipdp/model.py index 550c63f..6e4745c 100644 --- a/deel/lipdp/model.py +++ b/deel/lipdp/model.py @@ -20,6 +20,7 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. +"""Model class for differentially private training with Lipschitz constraints.""" from dataclasses import dataclass import numpy as np diff --git a/deel/lipdp/pipeline.py b/deel/lipdp/pipeline.py index b1a44bf..0cf60e4 100644 --- a/deel/lipdp/pipeline.py +++ b/deel/lipdp/pipeline.py @@ -354,9 +354,11 @@ def load_and_prepare_images_data( nb_samples_train=ds_info.splits["train"].num_examples, nb_samples_test=ds_info.splits["test"].num_examples, class_names=ds_info.features["label"].names, - nb_steps_per_epochs=ds_train.cardinality().numpy() - if ds_train.cardinality() > 0 # handle case cardinality return -1 (unknown) - else ds_info.splits["train"].num_examples / batch_size, + nb_steps_per_epochs=( + ds_train.cardinality().numpy() + if ds_train.cardinality() > 0 # handle case cardinality return -1 (unknown) + else ds_info.splits["train"].num_examples / batch_size + ), batch_size=batch_size, max_norm=bound_val, ) @@ -493,9 +495,11 @@ def prepare_tabular_data( nb_samples_train=x_train.shape[0], nb_samples_test=x_test.shape[0], class_names=[str(i) for i in range(nb_classes)], - nb_steps_per_epochs=ds_train.cardinality().numpy() - if ds_train.cardinality() > 0 # handle case cardinality return -1 (unknown) - else x_train.shape[0] / batch_size, + nb_steps_per_epochs=( + ds_train.cardinality().numpy() + if ds_train.cardinality() > 0 # handle case cardinality return -1 (unknown) + else x_train.shape[0] / batch_size + ), batch_size=batch_size, max_norm=bound_val, ) diff --git a/deel/lipdp/sensitivity.py b/deel/lipdp/sensitivity.py index fc79385..2132a9f 100644 --- a/deel/lipdp/sensitivity.py +++ b/deel/lipdp/sensitivity.py @@ -91,10 +91,14 @@ def fun(epoch): elif error < atol: # This branch should never be taken if fun is a non-decreasing function of the number of epochs. # fun is mathematcally non-decreasing, but numerical inaccuracy can lead to this case. - print(f"Numerical inaccuracy with error {error:.7f} in the dichotomy search: using a conservative value.") + print( + f"Numerical inaccuracy with error {error:.7f} in the dichotomy search: using a conservative value." + ) return epochs_min - 1 else: - assert False, f"Numerical inaccuracy with error {error:.7f}>{atol:.3f} in the dichotomy search." + assert ( + False, + ), f"Numerical inaccuracy with error {error:.7f}>{atol:.3f} in the dichotomy search." return epochs_max @@ -106,7 +110,7 @@ def gradient_norm_check(upper_bounds, model, examples): Args : upper_bounds: maximum gradient bounds for each layer (dictionnary of 'layers name ': 'bounds' pairs). model: The model containing the layers we are interested in. Layers must only have one trainable variable. - examples: a batch of examples to test on. + examples: a batch of examples to test on. Returns : Boolean value. True corresponds to upper bound has been validated. """ @@ -117,19 +121,30 @@ def gradient_norm_check(upper_bounds, model, examples): assert len(layer.trainable_variables) < 2 if len(layer.trainable_variables) == 1: assert len(layer.trainable_variables) == 1 - train_var = layer.trainable_variables[0] var_name = layer.trainable_variables[0].name var_seen.add(var_name) bound = upper_bounds[var_name] - check_layer_gradient_norm(bound, layer, activations) + bound_check = check_layer_gradient_norm(bound, layer, activations) + assert ( + bound_check + ), f"Gradient norm check failed for layer {layer.name} with bound {bound}." activations = post_activations for var_name in upper_bounds: assert var_name in var_seen def check_layer_gradient_norm(S, layer, activations): + """Check that the maximum gradient norm of a layer is less than S. + + Args: + S: The maximum gradient norm. + layer: The layer to check. + activations: The input to the layer. + Returns: + Boolean value. True corresponds to upper bound has been validated. + """ trainable_vars = layer.trainable_variables[0] - with tf.GradientTape() as tape: + with tf.GradientTape() as tape: y_pred = layer(activations, training=True) flat_pred = tf.reshape(y_pred, (y_pred.shape[0], -1)) jacobians = tape.jacobian(flat_pred, trainable_vars) @@ -141,8 +156,8 @@ def check_layer_gradient_norm(S, layer, activations): (y_pred.shape[0], -1, np.prod(trainable_vars.shape)), name="Reshaped_Gradient", ) - J_sigma = tf.linalg.svd(jacobians, full_matrices=False, compute_uv=False, name=None) - J_2norm = tf.reduce_max(J_sigma, axis=-1) - J_2norm = tf.reduce_max(J_2norm).numpy() + sigma = tf.linalg.svd(jacobians, full_matrices=False, compute_uv=False, name=None) + norm2 = tf.reduce_max(sigma, axis=-1) + norm2 = tf.reduce_max(norm2).numpy() atol = 1e-5 - return J_2norm < S+atol + return norm2 < (S + atol) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 456c9d3..ebca628 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -4,14 +4,14 @@ Thanks for taking the time to contribute! From opening a bug report to creating a pull request: every contribution is appreciated and welcome. If you're planning to implement a new feature or change -the api please create an [issue first](https://https://github.com/deel-ai/dp-lipschitz/issues/new). This way we can ensure that your precious +the api please create an [issue first](https://github.com/Algue-Rythme/lip-dp/issues). This way we can ensure that your precious work is not in vain. ## Setup with make -- Clone the repo `git clone https://github.com/deel-ai/dp-lipschitz.git`. -- Go to your freshly downloaded repo `cd lipdp` +- Clone the repo `git clone git@github.com:Algue-Rythme/lip-dp.git`. +- Go to your freshly downloaded repo `cd lip-dp` - Create a virtual environment and install the necessary dependencies for development: `make prepare-dev && source lipdp_dev_env/bin/activate`. @@ -26,9 +26,8 @@ This command activate your virtual environment and launch the `tox` command. `tox` on the otherhand will do the following: -- run pytest on the tests folder with python 3.6, python 3.7 and python 3.8 -> Note: If you do not have those 3 interpreters the tests would be only performs with your current interpreter -- run pylint on the deel-datasets main files, also with python 3.6, python 3.7 and python 3.8 +- run pytest on the tests folder +- run pylint on the deel-datasets main files > Note: It is possible that pylint throw false-positive errors. If the linting test failed please check first pylint output to point out the reasons. Please, make sure you run all the tests at least once before opening a pull request. @@ -42,7 +41,7 @@ Basically, it will check that your code follow a certain number of convention. A After getting some feedback, push to your fork and submit a pull request. We may suggest some changes or improvements or alternatives, but for small changes -your pull request should be accepted quickly (see [Governance policy](https://github.com/deel-ai/lipdp/blob/master/GOVERNANCE.md)). +your pull request should be accepted quickly (see [Governance policy](https://github.com/Algue-Rythme/lip-dp/blob/release-no-advertising/GOVERNANCE.md)). Something that will increase the chance that your pull request is accepted: diff --git a/docs/assets/residuals.png b/docs/assets/residuals.png new file mode 100644 index 0000000000000000000000000000000000000000..4840e69f2a1b053e7d3fc99b82a58128c003063a GIT binary patch literal 100972 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 U?-q3=`PoYHYIh56KYsE5065JVX#fBK literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index a34c4b0..0a51c1c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,32 +1,40 @@ -# Index - -Mainly you could copy the README.md here. However, you should be careful with: - -- The banner section is different -- Link to assets (handling dark mode is different between GitHub and the documentation) -- Relative links - +

-
+

-

- Libname is a Python toolkit dedicated to making people happy and fun. +LipDP is a Python toolkit dedicated to robust and certifiable learning under privacy guarantees. + + - -
- Explore Libname docs » -
+This package is the code for the paper "*DP-SGD Without Clipping: The Lipschitz Neural Network Way*" by Louis Béthune, Thomas Massena, Thibaut Boissin, Aurélien Bellet, Franck Mamalet, Yannick Prudent, Corentin Friedrich, Mathieu Serrurier, David Vigouroux, published at the **International Conference on Learning Representations (ICLR 2024)**. The paper is available on [arxiv](https://arxiv.org/abs/2305.16202). + + +State-of-the-art approaches for training Differentially Private (DP) Deep Neural Networks (DNN) face difficulties to estimate tight bounds on the sensitivity of the network's layers, and instead rely on a process of per-sample gradient clipping. This clipping process not only biases the direction of gradients but also proves costly both in memory consumption and in computation. To provide sensitivity bounds and bypass the drawbacks of the clipping process, we propose to rely on Lipschitz constrained networks. Our theoretical analysis reveals an unexplored link between the Lipschitz constant with respect to their input and the one with respect to their parameters. By bounding the Lipschitz constant of each layer with respect to its parameters, we prove that we can train these networks with privacy guarantees. Our analysis not only allows the computation of the aforementioned sensitivities at scale, but also provides guidance on how to maximize the gradient-to-noise ratio for fixed privacy guarantees. To facilitate the application of Lipschitz networks and foster robust and certifiable learning under privacy guarantees, we provide this Python package that implements building blocks allowing the construction and private training of such networks. -

+
+ backpropforbounds +
+ +The sensitivity is computed automatically by the package, and no element-wise clipping is required. This is translated into a new DP-SGD algorithm, called Clipless DP-SGD, that is faster and more memory efficient than DP-SGD with clipping. + +
+ speedcurves +
## 📚 Table of contents @@ -34,7 +42,6 @@ Mainly you could copy the README.md here. However, you should be careful with: - [🔥 Tutorials](#-tutorials) - [🚀 Quick Start](#-quick-start) - [📦 What's Included](#-whats-included) -- [👍 Contributing](#-contributing) - [👀 See Also](#-see-also) - [🙏 Acknowledgments](#-acknowledgments) - [👨‍🎓 Creator](#-creator) @@ -45,90 +52,135 @@ Mainly you could copy the README.md here. However, you should be careful with: We propose some tutorials to get familiar with the library and its API: -- [Getting started](https://colab.research.google.com/drive/1XproaVxXjO9nrBSyyy7BuKJ1vy21iHs2) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/deel-ai//blob/master/docs/notebooks/demo_fake.ipynb) - -You do not necessarily need to register the notebooks on GitHub. Notebooks can be hosted on a specific [drive](https://drive.google.com/drive/folders/1DOI1CsL-m9jGjkWM1hyDZ1vKmSU1t-be). +- **Demo on MNIST** [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1s3LBIxf0x1sOMQUw6BHpxbeUzmwtaP0d) +- **Demo on CIFAR10** [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1RbALHN-Eib6CCUznLrbiETX7JJrFaUB0) ## 🚀 Quick Start -Libname requires some stuff and several libraries including Numpy. Installation can be done using Pypi: - +lipDP requires some stuff and several libraries including Numpy. Installation can be done locally by cloning the repository and running: ```python -pip install libname +pip install -e .[dev] ``` -Now that Libname is installed, here are some basic examples of what you can do with the available modules. +### Setup privacy parameters -### Print Hello World - -Let's start with a simple example: +Parameters are stored in a dataclass: ```python -from libname.fake import hello_world - -hello_world() +from deel.lipdp.model import DPParameters +dp_parameters = DPParameters( + noisify_strategy="local", + noise_multiplier=4.0, + delta=1e-5, +) + +epsilon_max = 10.0 ``` -### Make addition - -In order to add `a` to `b` you can use: +### Setup DP model ```python -from libname.fake import addition - -a = 1 -b = 2 -c = addition(a, b) +# construct DP_Sequential +model = DP_Sequential( + # works like usual sequential but requires DP layers + layers=[ + # BoundedInput works like Input, but performs input clipping to guarantee input bound + layers.DP_BoundedInput( + input_shape=dataset_metadata.input_shape, upper_bound=input_upper_bound + ), + layers.DP_QuickSpectralConv2D( # Reshaped Kernel Orthogonalization (RKO) convolution. + filters=32, + kernel_size=3, + kernel_initializer="orthogonal", + strides=1, + use_bias=False, # No biases since the framework handles a single tf.Variable per layer. + ), + layers.DP_GroupSort(2), # GNP activation function. + layers.DP_ScaledL2NormPooling2D(pool_size=2, strides=2), # GNP pooling. + layers.DP_QuickSpectralConv2D( # Reshaped Kernel Orthogonalization (RKO) convolution. + filters=64, + kernel_size=3, + kernel_initializer="orthogonal", + strides=1, + use_bias=False, # No biases since the framework handles a single tf.Variable per layer. + ), + layers.DP_GroupSort(2), # GNP activation function. + layers.DP_ScaledL2NormPooling2D(pool_size=2, strides=2), # GNP pooling. + + layers.DP_Flatten(), # Convert features maps to flat vector. + + layers.DP_QuickSpectralDense(512), # GNP layer with orthogonal weight matrix. + layers.DP_GroupSort(2), + layers.DP_QuickSpectralDense(dataset_metadata.nb_classes), + ], + dp_parameters=dp_parameters, + dataset_metadata=dataset_metadata, +) ``` -## 📦 What's Included - -A list or table of methods available +### Setup accountant -## 👍 Contributing +The privacy accountant is composed of different mechanisms from `autodp` package that are combined to provide a privacy accountant for Clipless DP-SGD algorithm: -Feel free to propose your ideas or come and contribute with us on the Libname toolbox! We have a specific document where we describe in a simple way how to make your first pull request: [just here](CONTRIBUTING.md). +
+ rdpaccountant +
-## 👀 See Also +Adding a privacy accountant to your model is straighforward: -This library is one approach of many... +```python +from deel.lipdp.model import DP_Accountant + +callbacks = [ + DP_Accountant() +] + +model.fit( + ds_train, + epochs=num_epochs, + validation_data=ds_test, + callbacks=[ + # accounting is done thanks to a callback + DP_Accountant(log_fn="logging"), # wandb.log also available. + ], +) +``` -Other tools to explain your model include: +## 📦 What's Included -- [Random](https://www.youtube.com/watch?v=dQw4w9WgXcQ) +Code can be found in the `deel/lipdp` folder, the documentation ca be found by running + `mkdocs build` and `mkdocs serve` (or loading `site/index.html`). Experiments were + done using the code in the `experiments` folder. -More from the DEEL project: +Other tools to perform DP-training include: -- [Xplique](https://github.com/deel-ai/xplique) a Python library exclusively dedicated to explaining neural networks. -- [deel-lip](https://github.com/deel-ai/deel-lip) a Python library for training k-Lipschitz neural networks on TF. -- [Influenciae](https://github.com/deel-ai/influenciae) Python toolkit dedicated to computing influence values for the discovery of potentially problematic samples in a dataset. -- [deel-torchlip](https://github.com/deel-ai/deel-torchlip) a Python library for training k-Lipschitz neural networks on PyTorch. -- [DEEL White paper](https://arxiv.org/abs/2103.10529) a summary of the DEEL team on the challenges of certifiable AI and the role of data quality, representativity and explainability for this purpose. +- [tensorflow-privacy](https://github.com/tensorflow/privacy) in Tensorflow +- [Opacus](https://opacus.ai/) in Pytorch +- [jax-privacy](https://github.com/google-deepmind/jax_privacy) in Jax ## 🙏 Acknowledgments -DEEL Logo -DEEL Logo -This project received funding from the French ”Investing for the Future – PIA3” program within the Artificial and Natural Intelligence Toulouse Institute (ANITI). The authors gratefully acknowledge the support of the DEEL project. +The creators thank the whole [DEEL](https://deel-ai.com/) team for its support, and [Aurélien Bellet](http://researchers.lille.inria.fr/abellet/) for his guidance. ## 👨‍🎓 Creators -If you want to highlight the main contributors - +The library has been created by [Louis Béthune](https://github.com/Algue-Rythme), [Thomas Masséna](https://github.com/massena-t) during an internsip at [DEEL](https://deel-ai.com/), and [Thibaut Boissin](https://github.com/thib-s). ## 🗞️ Citation -If you use Libname as part of your workflow in a scientific publication, please consider citing 🗞️ [our paper](https://www.youtube.com/watch?v=dQw4w9WgXcQ): +If you find this work useful for your research, please consider citing it: ``` -@article{rickroll, - title={Rickrolling}, - author={Some Internet Trolls}, - journal={Best Memes}, - year={ND} +@inproceedings{ +bethune2024dpsgd, +title={{DP}-{SGD} Without Clipping: The Lipschitz Neural Network Way}, +author={Louis B{\'e}thune and Thomas Massena and Thibaut Boissin and Aur{\'e}lien Bellet and Franck Mamalet and Yannick Prudent and Corentin Friedrich and Mathieu Serrurier and David Vigouroux}, +booktitle={The Twelfth International Conference on Learning Representations}, +year={2024}, +url={https://openreview.net/forum?id=BEyEziZ4R6} } ``` ## 📝 License -The package is released under MIT license. \ No newline at end of file +The package is released under [MIT license](../LICENSE). diff --git a/docs/notebooks/advanced_cifar10.ipynb b/docs/notebooks/advanced_cifar10.ipynb index f37b750..dca2a33 100644 --- a/docs/notebooks/advanced_cifar10.ipynb +++ b/docs/notebooks/advanced_cifar10.ipynb @@ -132,7 +132,7 @@ "source": [ "With many parameters, it can be interesting to use `local` strategy over `global`, since the effective noise growths as $\\mathcal{O}(\\sqrt{(D)})$ in `global` strategy. Since the privacy leakge is more important is `local` strategy, we compensate with high `noise_multiplier`.\n", "\n", - "![DP-SGD accountant](fig_accountant.png \"DP-SGD accountant\")" + "![DP-SGD accountant](../assets/fig_accountant.png \"DP-SGD accountant\")" ] }, { @@ -220,7 +220,7 @@ "source": [ "The MLP Mixer uses residual connections. Residuals connections are handled with the utility function `make_residuals` that wraps the layers inside a block that handles bounds propagation.\n", "\n", - "![Residuals Connections](residuals.png \"Residual Connections\")" + "![Residuals Connections](../assets/residuals.png \"Residual Connections\")" ] }, { diff --git a/mkdocs.yml b/mkdocs.yml index f4d8766..bca7e67 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,4 +1,4 @@ -site_name: lipdp +site_name: lip-dp # Set navigation here nav: @@ -10,14 +10,14 @@ nav: - deel.lipdp.pipeline module: api/pipeline.md - deel.lipdp.sensitivity module: api/sensitivity.md - Tutorials: - - "Demo 1: basic use on MNIST": notebooks/basic_mnist.ipynb - - "Demo 2: advanced use on CIFAR10": notebooks/advanced_cifar10.ipynb + - "Basic use on MNIST": notebooks/basic_mnist.ipynb + - "Residuals and dynamic clipping on CIFAR10": notebooks/advanced_cifar10.ipynb - Contributing: CONTRIBUTING.md theme: name: "material" - logo: assets/logo.png - favicon: assets/logo.png + logo: assets/lipdp_logo.png + favicon: assets/lipdp_logo.png palette: - scheme: default primary: dark @@ -66,5 +66,5 @@ extra_javascript: - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - js/custom.js -repo_name: "deel-ai/" -repo_url: "https://github.com/deel-ai/" +repo_name: "Algue-Rythme/lip-dp" +repo_url: "https://github.com/Algue-Rythme/lip-dp" diff --git a/setup.cfg b/setup.cfg index 84a9214..74a40e0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,6 @@ [flake8] # Use black line length: +exclude = tests/* max-line-length = 88 extend-ignore = # See https://github.com/PyCQA/pycodestyle/issues/373 @@ -27,9 +28,9 @@ ignore_missing_imports = True ignore_missing_imports = True [tox:tox] -envlist = py36,py37,py38,py36-lint +envlist = py310-lint -[testenv:py36-lint] +[testenv:py310-lint] deps = black flake8 diff --git a/setup.py b/setup.py index 05f1a58..8c7a8b7 100644 --- a/setup.py +++ b/setup.py @@ -27,27 +27,38 @@ from setuptools import find_packages from setuptools import setup -this_directory = os.path.dirname(__file__) -req_path = os.path.join(this_directory, "requirements.txt") -req_dev_path = os.path.join(this_directory, "requirements_dev.txt") +REQ_PATH = "requirements.txt" +REQ_DEV_PATH = "requirements_dev.txt" install_requires = [] -if os.path.exists(req_path): - with open(req_path) as fp: +if os.path.exists(REQ_PATH): + print("Loading requirements") + with open(REQ_PATH, encoding="utf-8") as fp: install_requires = [line.strip() for line in fp] -if os.path.exists(req_dev_path): - with open(req_dev_path) as fp: - install_dev_requires = [line.strip() for line in fp] +dev_requires = [ + "setuptools", + "pre-commit", + "pytest", + "tox", + "black", + "pytest", + "pylint", + "mkdocs", + "mkdocs-material", + "mkdocstrings[python]", + "mknotebooks", + "bump2version", +] -readme_path = os.path.join(this_directory, "README.md") +README_PATH = "README.md" readme_contents = "" -if os.path.exists(readme_path): - with open(readme_path, encoding="utf8") as fp: +if os.path.exists(README_PATH): + with open(README_PATH, encoding="utf8") as fp: readme_contents = fp.read().strip() -with open(os.path.join(this_directory, "deel/lipdp/VERSION"), encoding="utf8") as f: +with open("deel/lipdp/VERSION", encoding="utf8") as f: version = f.read().strip() setup( @@ -57,7 +68,7 @@ version=version, # Find the package automatically (include everything): packages=find_namespace_packages(include=["deel.*"]), - package_data={'': ['VERSION']}, + package_data={"": ["VERSION"]}, include_package_data=True, # Author information: # Author information: @@ -71,12 +82,13 @@ classifiers=[ "Programming Language :: Python", "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", ], licence="MIT", install_requires=install_requires, extras_require={ - "dev": install_dev_requires, + "dev": dev_requires, }, ) diff --git a/tests/model_test.py b/tests/model_test.py index 7ba87a4..c9260a1 100644 --- a/tests/model_test.py +++ b/tests/model_test.py @@ -26,13 +26,14 @@ from deel.lipdp.dynamic import AdaptiveQuantileClipping from deel.lipdp.layers import * -from deel.lipdp.model import DP_Sequential, DPParameters -from deel.lipdp.pipeline import bound_normalize, load_and_prepare_images_data from deel.lipdp.losses import DP_TauCategoricalCrossentropy +from deel.lipdp.model import DP_Sequential +from deel.lipdp.model import DPParameters +from deel.lipdp.pipeline import bound_normalize +from deel.lipdp.pipeline import load_and_prepare_images_data class ModelTest(parameterized.TestCase): - def _get_mnist_cnn(self): ds_train, _, dataset_metadata = load_and_prepare_images_data( "mnist", @@ -62,13 +63,13 @@ def _get_mnist_cnn(self): DP_SpectralDense(10, use_bias=False, kernel_initializer="orthogonal"), DP_AddBias(norm_max=norm_max), DP_ClipGradient( - clip_value=2. ** 0.5, + clip_value=2.0**0.5, mode="dynamic", ), ] dp_parameters = DPParameters( - noisify_strategy='per-layer', + noisify_strategy="per-layer", noise_multiplier=2.2, delta=1e-5, ) @@ -81,7 +82,7 @@ def _get_mnist_cnn(self): optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3) loss = DP_TauCategoricalCrossentropy( - tau=1., reduction=tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE + tau=1.0, reduction=tf.keras.losses.Reduction.SUM_OVER_BATCH_SIZE ) model.compile(optimizer=optimizer, loss=loss, metrics=["accuracy"]) @@ -97,9 +98,7 @@ def test_create_residuals(self): input_shape = (32, 32, 3) patch_size = 4 - seq_len = (input_shape[0] // patch_size) * ( - input_shape[1] // patch_size - ) + seq_len = (input_shape[0] // patch_size) * (input_shape[1] // patch_size) multiplier = 1 mlp_seq_dim = multiplier * seq_len @@ -139,7 +138,9 @@ def test_adaptive_clipping(self): ) adaptive.set_model(model) callbacks = [adaptive] - model.fit(ds_train, epochs=2, callbacks=callbacks, steps_per_epoch=num_steps_test_case) + model.fit( + ds_train, epochs=2, callbacks=callbacks, steps_per_epoch=num_steps_test_case + ) if __name__ == "__main__": diff --git a/tests/sensitivity_test.py b/tests/sensitivity_test.py index 5441596..e573fce 100644 --- a/tests/sensitivity_test.py +++ b/tests/sensitivity_test.py @@ -25,7 +25,12 @@ from deel.lipdp.dynamic import AdaptiveQuantileClipping from deel.lipdp.layers import * -from deel.lipdp.model import DP_Sequential, DPParameters, get_eps_delta, compute_gradient_bounds +from deel.lipdp.model import ( + DP_Sequential, + DPParameters, + get_eps_delta, + compute_gradient_bounds +) from deel.lipdp.pipeline import bound_normalize, load_and_prepare_images_data from deel.lipdp.losses import DP_TauCategoricalCrossentropy from deel.lipdp.sensitivity import get_max_epochs, gradient_norm_check @@ -82,8 +87,8 @@ def _get_small_mnist_cnn(self, dp_parameters, batch_size): return model, ds_train @parameterized.parameters( - ('per-layer', 0.8, 1e-5, 22.0, True), - ('global', 1.2, 1e-6, 30.0, False), + ("per-layer", 0.8, 1e-5, 22.0, True), + ("global", 1.2, 1e-6, 30.0, False), ) def test_get_max_epochs(self, noisify_strategy, noise_multiplier, delta, epsilon_max, safe): dp_parameters = DPParameters( @@ -109,7 +114,7 @@ def test_get_max_epochs(self, noisify_strategy, noise_multiplier, delta, epsilon def test_gradient_bounds(self): dp_parameters = DPParameters( - noisify_strategy='per-layer', + noisify_strategy="per-layer", noise_multiplier=2.2, delta=1e-5, )