# FedJAX: Federated learning simulation with JAX [![Build and minimal test](https://github.com/google/fedjax/actions/workflows/build_and_minimal_test.yml/badge.svg)](https://github.com/google/fedjax/actions/workflows/build_and_minimal_test.yml) [![Documentation Status](https://readthedocs.org/projects/fedjax/badge/?version=latest)](https://fedjax.readthedocs.io/en/latest/?badge=latest) ![PyPI version](https://img.shields.io/pypi/v/fedjax) [**Documentation**](https://fedjax.readthedocs.io/) | [**Paper**](https://arxiv.org/abs/2108.02117) NOTE: FedJAX is not an officially supported Google product. FedJAX is still in the early stages and the API will likely continue to change. ## What is FedJAX? FedJAX is a [JAX]-based open source library for [Federated Learning](https://ai.googleblog.com/2017/04/federated-learning-collaborative.html) simulations that emphasizes ease-of-use in research. With its simple primitives for implementing federated learning algorithms, prepackaged datasets, models and algorithms, and fast simulation speed, FedJAX aims to make developing and evaluating federated algorithms faster and easier for researchers. FedJAX works on accelerators (GPU and TPU) without much additional effort. Additional details and benchmarks can be found in our [paper](https://arxiv.org/abs/2108.02117). ## Installation You will need a moderately recent version of Python. Please check [the PyPI page](https://pypi.org/project/fedjax/) for the up to date version requirement. First, install JAX. For a CPU-only version: ``` pip install --upgrade pip pip install --upgrade jax jaxlib # CPU-only version ``` For other devices (e.g. GPU), follow [these instructions](https://github.com/jax-ml/jax#installation). Then, install FedJAX from PyPI: ``` pip install fedjax ``` Or, to upgrade to the latest version of FedJAX: ``` pip install --upgrade git+https://github.com/google/fedjax.git ``` ## Getting Started Below is a simple example to verify FedJAX is installed correctly. ```python import fedjax import jax import jax.numpy as jnp import numpy as np # {'client_id': client_dataset}. fd = fedjax.InMemoryFederatedData({ 'a': { 'x': np.array([1.0, 2.0, 3.0]), 'y': np.array([2.0, 4.0, 6.0]), }, 'b': { 'x': np.array([4.0]), 'y': np.array([12.0]) } }) # Initial model parameters. params = jnp.array(0.5) # Mean squared error. mse_loss = lambda params, batch: jnp.mean( (jnp.dot(batch['x'], params) - batch['y'])**2) # Loss for clients 'a' and 'b'. print(f"client a loss = {mse_loss(params, fd.get_client('a').all_examples())}") print(f"client b loss = {mse_loss(params, fd.get_client('b').all_examples())}") ``` The following tutorial notebooks provide an introduction to FedJAX: * [Federated datasets](https://fedjax.readthedocs.io/en/latest/notebooks/dataset_tutorial.html) * [Working with models in FedJAX](https://fedjax.readthedocs.io/en/latest/notebooks/model_tutorial.html) * [Federated learning algorithms](https://fedjax.readthedocs.io/en/latest/notebooks/algorithms_tutorial.html) You can also take a look at some of our working examples: * [Federated Averaging](examples/fed_avg.py) * [Full EMNIST example](examples/emnist_fed_avg.py) ## Citing FedJAX To cite this repository: ``` @article{fedjax2021, title={{F}ed{JAX}: Federated learning simulation with {JAX}}, author={Jae Hun Ro and Ananda Theertha Suresh and Ke Wu}, journal={arXiv preprint arXiv:2108.02117}, year={2021} } ``` ## Useful pointers * https://jax.readthedocs.io/en/latest/index.html * https://jax.readthedocs.io/en/latest/notebooks/Common_Gotchas_in_JAX.html * https://jax.readthedocs.io/en/latest/notebooks/How_JAX_primitives_work.html * https://dm-haiku.readthedocs.io/en/latest/ [JAX]: https://github.com/jax-ml/jax [Haiku]: https://github.com/deepmind/dm-haiku [Stax]: https://github.com/jax-ml/jax/blob/main/jax/example_libraries/stax.py [Optax]: https://github.com/deepmind/optax