### Run Standalone Example Source: https://github.com/smilelab-fl/fedlab/blob/master/README.md Execute a standalone example script for FedLab. This command demonstrates running a quick start example with specified parameters for client count, communication rounds, sample ratio, batch size, epochs, and learning rate. ```bash cd ./examples/standalone/ python standalone.py --total_clients 100 --com_round 3 --sample_ratio 0.1 --batch_size 100 --epochs 5 --lr 0.02 ``` -------------------------------- ### Setup Client Trainer with Compressor Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/communication_tutorial.ipynb Configure and initialize the `CompressSerialClientTrainer` with the chosen compressor. This involves setting up the dataset, optimizer, and the compressor itself before starting the federated training process. ```python # client from fedlab.contrib.algorithm.basic_client import SGDSerialClientTrainer, SGDClientTrainer # local train configuration args.epochs = 5 args.batch_size = 128 args.lr = 0.1 trainer = CompressSerialClientTrainer(model, args.total_client, cuda=args.cuda) # serial trainer # trainer = SGDClientTrainer(model, cuda=True) # single trainer trainer.setup_dataset(fed_mnist) trainer.setup_optim(args.epochs, args.batch_size, args.lr) trainer.setup_compressor(compressor) # server from fedlab.contrib.algorithm.basic_server import SyncServerHandler ``` -------------------------------- ### Install Dependencies from Requirements Source: https://github.com/smilelab-fl/fedlab/blob/master/docs/source/install.rst After cloning the repository, install all necessary dependencies using the provided requirements file. ```shell $ pip install -r requirements.txt ``` -------------------------------- ### Run Hierarchical FL Example (Client Group 1) Source: https://github.com/smilelab-fl/fedlab/blob/master/docs/source/examples/quick_start.rst Launches the scheduler and trainers for the first client group in the hierarchical FL example. This includes an ordinary trainer and serial trainers for multiple clients. ```shell-session bash launch_cgroup1_eg.sh ``` -------------------------------- ### Custom ClientManager Initialization Source: https://github.com/smilelab-fl/fedlab/blob/master/docs/source/tutorials/communication_strategy.rst Example of customizing the initialization stage for a client manager by inheriting from PassiveClientManager and overwriting the setup method. ```python from fedlab.core.client.manager import PassiveClientManager class CustomizeClientManager(PassiveClientManager): def __init__(self, trainer, network): super().__init__(trainer, network) def setup(self): super().setup() ***************************** * * * Write Code Here * * * ***************************** ``` -------------------------------- ### Start FedLab Server Source: https://github.com/smilelab-fl/fedlab/blob/master/docs/source/examples/quick_start.rst Launches the FedLab server process. Ensure the IP, port, and world_size are configured correctly for your network setup. ```shell-session $ python server.py --ip 127.0.0.1 --port 3002 --world_size 11 ``` -------------------------------- ### Install FedLab from Source Source: https://github.com/smilelab-fl/fedlab/blob/master/README.md Clone the repository and install dependencies using pip. This method is for installing the latest version directly from the source code. ```bash git clone git@github.com:SMILELab-FL/FedLab.git cd FedLab pip install -r requirements.txt ``` -------------------------------- ### CIFAR-100 Data Partitioning Example Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/Datasets-DataPartitioner-tutorials/cifar100_tutorial.ipynb Illustrates the process of partitioning the CIFAR-100 dataset using FedLab's DataPartitioner. This example shows how to create a balanced data distribution across clients. ```python balance_dir_part = DataPartitioner(data=cifar100_trainset, sizes=sizes, balance=True, num_partitions=num_clients) ``` -------------------------------- ### CIFAR-100 Data Partitioning Example Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/Datasets-DataPartitioner-tutorials/cifar100_tutorial.ipynb Illustrates the process of partitioning the CIFAR-100 dataset using FedLab's DataPartitioner. This example shows how to create client-specific data splits. ```python balance_dir_part = DataPartitioner(data=cifar100_trainset, sizes=None, balance=True, num_partitions=10) ``` -------------------------------- ### CIFAR-100 Data Partitioning Example Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/Datasets-DataPartitioner-tutorials/cifar100_tutorial.ipynb Illustrates the process of partitioning CIFAR-100 data using FedLab's DataPartitioner. This example shows the remaining data count after partitioning. ```python Remaining Data: 4290 Remaining Data: 4289 Remaining Data: 4288 Remaining Data: 4287 Remaining Data: 4286 Remaining Data: 4285 Remaining Data: 4284 Remaining Data: 4283 Remaining Data: 4282 Remaining Data: 4281 Remaining Data: 4280 Remaining Data: 4279 Remaining Data: 4278 Remaining Data: 4277 Remaining Data: 4276 Remaining Data: 4275 Remaining Data: 4274 Remaining Data: 4273 Remaining Data: 4272 Remaining Data: 4271 Remaining Data: 4270 Remaining Data: 4269 Remaining Data: 4268 Remaining Data: 4267 Remaining Data: 4266 Remaining Data: 4266 Remaining Data: 4265 Remaining Data: 4264 Remaining Data: 4263 Remaining Data: 4262 Remaining Data: 4261 Remaining Data: 4260 Remaining Data: 4259 Remaining Data: 4258 Remaining Data: 4257 Remaining Data: 4256 Remaining Data: 4255 Remaining Data: 4254 Remaining Data: 4253 Remaining Data: 4252 Remaining Data: 4251 Remaining Data: 4250 Remaining Data: 4249 Remaining Data: 4248 Remaining Data: 4247 Remaining Data: 4246 Remaining Data: 4245 Remaining Data: 4244 Remaining Data: 4243 Remaining Data: 4242 Remaining Data: 4241 Remaining Data: 4240 Remaining Data: 4239 Remaining Data: 4238 Remaining Data: 4237 Remaining Data: 4236 Remaining Data: 4235 Remaining Data: 4234 Remaining Data: 4233 Remaining Data: 4232 Remaining Data: 4231 Remaining Data: 4230 Remaining Data: 4229 Remaining Data: 4228 Remaining Data: 4227 Remaining Data: 4226 Remaining Data: 4225 Remaining Data: 4224 Remaining Data: 4223 Remaining Data: 4222 Remaining Data: 4221 Remaining Data: 4220 Remaining Data: 4219 Remaining Data: 4218 Remaining Data: 4217 Remaining Data: 4216 Remaining Data: 4215 Remaining Data: 4214 Remaining Data: 4213 Remaining Data: 4212 Remaining Data: 4211 Remaining Data: 4210 Remaining Data: 4209 Remaining Data: 4208 Remaining Data: 4207 Remaining Data: 4206 Remaining Data: 4205 Remaining Data: 4204 Remaining Data: 4203 Remaining Data: 4202 Remaining Data: 4201 Remaining Data: 4200 Remaining Data: 4199 Remaining Data: 4198 Remaining Data: 4197 Remaining Data: 4196 Remaining Data: 4195 Remaining Data: 4194 Remaining Data: 4193 Remaining Data: 4192 Remaining Data: 4191 Remaining Data: 4190 Remaining Data: 4189 Remaining Data: 4188 Remaining Data: 4187 Remaining Data: 4186 Remaining Data: 4185 Remaining Data: 4184 Remaining Data: 4183 Remaining Data: 4182 Remaining Data: 4181 Remaining Data: 4180 Remaining Data: 4179 Remaining Data: 4178 Remaining Data: 4177 Remaining Data: 4176 Remaining Data: 4175 Remaining Data: 4174 Remaining Data: 4173 Remaining Data: 4172 Remaining Data: 4171 Remaining Data: 4170 Remaining Data: 4169 Remaining Data: 4168 Remaining Data: 4167 Remaining Data: 4166 Remaining Data: 4165 Remaining Data: 4164 Remaining Data: 4163 Remaining Data: 4162 Remaining Data: 4161 Remaining Data: 4160 Remaining Data: 4159 Remaining Data: 4158 ``` -------------------------------- ### Setup Client Optimization Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/customize_tutorial.ipynb Configure local optimization parameters such as epochs, batch size, and learning rate. This method initializes the optimizer and loss criterion. ```python def setup_optim(self, epochs, batch_size, lr): """Set up local optimization configuration. Args: epochs (int): Local epochs. batch_size (int): Local batch size. lr (float): Learning rate. """ self.epochs = epochs self.batch_size = batch_size self.optimizer = torch.optim.SGD(self._model.parameters(), lr) self.criterion = torch.nn.CrossEntropyLoss() ``` -------------------------------- ### Install Dependencies Source: https://github.com/smilelab-fl/fedlab/blob/master/datasets/femnist/README.md Installs necessary Python libraries using pip. ```bash pip3 install numpy pip3 install pillow ``` -------------------------------- ### CIFAR-100 Data Partitioning Example Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/Datasets-DataPartitioner-tutorials/cifar100_tutorial.ipynb Illustrates the remaining data count after partitioning for CIFAR-100. This helps in verifying data distribution. ```python Remaining Data: 32008 Remaining Data: 32007 Remaining Data: 32006 Remaining Data: 32005 Remaining Data: 32004 Remaining Data: 32003 Remaining Data: 32002 Remaining Data: 32001 Remaining Data: 32000 Remaining Data: 31999 Remaining Data: 31998 Remaining Data: 31997 Remaining Data: 31996 Remaining Data: 31995 Remaining Data: 31994 Remaining Data: 31993 Remaining Data: 31992 Remaining Data: 31991 Remaining Data: 31990 Remaining Data: 31989 Remaining Data: 31988 Remaining Data: 31987 Remaining Data: 31986 Remaining Data: 31985 Remaining Data: 31984 Remaining Data: 31983 Remaining Data: 31982 Remaining Data: 31981 Remaining Data: 31980 Remaining Data: 31979 Remaining Data: 31978 Remaining Data: 31977 Remaining Data: 31976 Remaining Data: 31975 Remaining Data: 31974 Remaining Data: 31973 Remaining Data: 31972 Remaining Data: 31971 Remaining Data: 31970 Remaining Data: 31969 Remaining Data: 31968 Remaining Data: 31967 Remaining Data: 31966 Remaining Data: 31965 Remaining Data: 31964 Remaining Data: 31963 Remaining Data: 31962 Remaining Data: 31961 Remaining Data: 31960 Remaining Data: 31959 Remaining Data: 31958 Remaining Data: 31957 Remaining Data: 31956 Remaining Data: 31955 Remaining Data: 31954 Remaining Data: 31953 Remaining Data: 31952 Remaining Data: 31951 Remaining Data: 31950 Remaining Data: 31949 Remaining Data: 31948 Remaining Data: 31947 Remaining Data: 31946 Remaining Data: 31945 Remaining Data: 31944 Remaining Data: 31943 Remaining Data: 31942 Remaining Data: 31941 Remaining Data: 31940 Remaining Data: 31939 Remaining Data: 31938 Remaining Data: 31937 Remaining Data: 31936 Remaining Data: 31935 Remaining Data: 31934 Remaining Data: 31933 Remaining Data: 31932 Remaining Data: 31931 Remaining Data: 31930 Remaining Data: 31929 Remaining Data: 31928 Remaining Data: 31927 Remaining Data: 31926 Remaining Data: 31925 Remaining Data: 31924 Remaining Data: 31923 Remaining Data: 31922 Remaining Data: 31921 Remaining Data: 31920 Remaining Data: 31919 Remaining Data: 31918 Remaining Data: 31917 Remaining Data: 31916 Remaining Data: 31915 Remaining Data: 31914 Remaining Data: 31913 Remaining Data: 31912 Remaining Data: 31911 Remaining Data: 31910 Remaining Data: 31909 Remaining Data: 31908 Remaining Data: 31907 Remaining Data: 31906 Remaining Data: 31905 Remaining Data: 31904 Remaining Data: 31903 Remaining Data: 31902 Remaining Data: 31901 Remaining Data: 31900 Remaining Data: 31899 Remaining Data: 31898 Remaining Data: 31897 Remaining Data: 31896 Remaining Data: 31895 Remaining Data: 31894 Remaining Data: 31893 Remaining Data: 31892 Remaining Data: 31891 Remaining Data: 31890 Remaining Data: 31889 Remaining Data: 31888 Remaining Data: 31887 Remaining Data: 31886 Remaining Data: 31885 Remaining Data: 31884 Remaining Data: 31883 Remaining Data: 31882 Remaining Data: 31881 Remaining Data: 31880 Remaining Data: 31879 Remaining Data: 31878 Remaining Data: 31877 Remaining Data: 31876 Remaining Data: 31875 Remaining Data: 31874 Remaining Data: 31873 Remaining Data: 31872 Remaining Data: 31871 Remaining Data: 31870 Remaining Data: 31869 Remaining Data: 31868 Remaining Data: 31867 Remaining Data: 31866 Remaining Data: 31865 Remaining Data: 31864 Remaining Data: 31863 Remaining Data: 31862 Remaining Data: 31861 Remaining Data: 31860 Remaining Data: 31859 Remaining Data: 31858 Remaining Data: 31857 Remaining Data: 31856 Remaining Data: 31855 Remaining Data: 31854 Remaining Data: 31853 Remaining Data: 31852 Remaining Data: 31851 Remaining Data: 31850 Remaining Data: 31849 Remaining Data: 31848 Remaining Data: 31847 Remaining Data: 31846 Remaining Data: 31845 Remaining Data: 31844 Remaining Data: 31843 Remaining Data: 31842 Remaining Data: 31841 Remaining Data: 31840 Remaining Data: 31839 Remaining Data: 31838 Remaining Data: 31837 Remaining Data: 31836 Remaining Data: 31835 Remaining Data: 31834 Remaining Data: 31833 Remaining Data: 31832 Remaining Data: 31831 Remaining Data: 31830 Remaining Data: 31829 Remaining Data: 31828 Remaining Data: 31827 Remaining Data: 31826 Remaining Data: 31825 Remaining Data: 31824 Remaining Data: 31823 Remaining Data: 31822 Remaining Data: 31821 Remaining Data: 31820 Remaining Data: 31819 Remaining Data: 31818 Remaining Data: 31817 Remaining Data: 31816 Remaining Data: 31815 Remaining Data: 31814 Remaining Data: 31813 Remaining Data: 31812 Remaining Data: 30847 Remaining Data: 30846 Remaining Data: 30845 Remaining Data: 30844 Remaining Data: 30843 Remaining Data: 30842 Remaining Data: 30841 Remaining Data: 30840 Remaining Data: 30839 Remaining Data: 30838 Remaining Data: 30837 Remaining Data: 30836 Remaining Data: 30835 Remaining Data: 30834 Remaining Data: 30833 Remaining Data: 30832 Remaining Data: 30831 Remaining Data: 30830 Remaining Data: 30829 Remaining Data: 30828 Remaining Data: 30827 Remaining Data: 30826 Remaining Data: 30825 Remaining Data: 30824 Remaining Data: 30823 ``` -------------------------------- ### Prepare for IID Client Data Visualization Source: https://github.com/smilelab-fl/fedlab/blob/master/docs/source/tutorials/fcube_tutorial.rst Initializes a figure and colormap for visualizing the data points of each client. This is a setup step before plotting the actual data. ```python fig = plt.figure(figsize=(10,10)) # get colormap from seaborn cmap = ListedColormap(sns.color_palette("RdBu", 2).as_hex()) ``` -------------------------------- ### CIFAR-100 Data Partitioning Example Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/Datasets-DataPartitioner-tutorials/cifar100_tutorial.ipynb Illustrates the process of partitioning the CIFAR-100 dataset for federated learning. This example shows the remaining data count after partitioning. ```python Remaining Data: 27940 Remaining Data: 27939 Remaining Data: 27938 Remaining Data: 27937 Remaining Data: 27936 Remaining Data: 27935 Remaining Data: 27934 Remaining Data: 27933 Remaining Data: 27932 Remaining Data: 27931 Remaining Data: 27930 Remaining Data: 27929 Remaining Data: 27928 Remaining Data: 27927 Remaining Data: 27926 Remaining Data: 27925 Remaining Data: 27924 Remaining Data: 27923 Remaining Data: 27922 Remaining Data: 27921 Remaining Data: 27920 Remaining Data: 27919 Remaining Data: 27918 Remaining Data: 27917 Remaining Data: 27916 Remaining Data: 27915 Remaining Data: 27914 Remaining Data: 27913 Remaining Data: 27912 Remaining Data: 27911 Remaining Data: 27910 Remaining Data: 27909 Remaining Data: 27908 Remaining Data: 27907 Remaining Data: 27906 Remaining Data: 27905 Remaining Data: 27904 Remaining Data: 27903 Remaining Data: 27902 Remaining Data: 27901 Remaining Data: 27900 Remaining Data: 27899 Remaining Data: 27898 Remaining Data: 27897 Remaining Data: 27896 Remaining Data: 27895 Remaining Data: 27894 Remaining Data: 27893 Remaining Data: 27892 Remaining Data: 27891 Remaining Data: 27890 Remaining Data: 27889 Remaining Data: 27888 Remaining Data: 27887 Remaining Data: 27886 Remaining Data: 27885 Remaining Data: 27884 Remaining Data: 27883 Remaining Data: 27882 Remaining Data: 27881 Remaining Data: 27880 Remaining Data: 27879 Remaining Data: 27878 Remaining Data: 27877 Remaining Data: 27876 Remaining Data: 27875 Remaining Data: 27874 Remaining Data: 27873 Remaining Data: 27872 Remaining Data: 27871 Remaining Data: 27870 Remaining Data: 27869 Remaining Data: 27868 Remaining Data: 27867 Remaining Data: 27866 Remaining Data: 27865 Remaining Data: 27864 Remaining Data: 27863 Remaining Data: 27862 Remaining Data: 27861 Remaining Data: 27860 Remaining Data: 27859 Remaining Data: 27858 Remaining Data: 27857 Remaining Data: 27856 Remaining Data: 27855 Remaining Data: 27854 Remaining Data: 27853 Remaining Data: 27852 Remaining Data: 27851 Remaining Data: 27850 Remaining Data: 27849 Remaining Data: 27848 Remaining Data: 27847 Remaining Data: 27846 Remaining Data: 27845 Remaining Data: 27844 Remaining Data: 27843 Remaining Data: 27842 Remaining Data: 27841 Remaining Data: 27840 Remaining Data: 27839 Remaining Data: 27838 Remaining Data: 27837 Remaining Data: 27836 Remaining Data: 27835 Remaining Data: 27834 Remaining Data: 27833 Remaining Data: 27832 Remaining Data: 27831 Remaining Data: 27830 Remaining Data: 27829 Remaining Data: 27828 Remaining Data: 27827 Remaining Data: 27826 Remaining Data: 27825 Remaining Data: 27824 Remaining Data: 27823 Remaining Data: 27822 Remaining Data: 27821 Remaining Data: 27820 Remaining Data: 27819 Remaining Data: 27818 Remaining Data: 27817 Remaining Data: 27816 Remaining Data: 27815 Remaining Data: 27814 Remaining Data: 27813 Remaining Data: 27812 Remaining Data: 27811 Remaining Data: 27810 Remaining Data: 27809 Remaining Data: 27808 Remaining Data: 27807 Remaining Data: 27806 Remaining Data: 27805 Remaining Data: 27804 Remaining Data: 27803 Remaining Data: 27802 Remaining Data: 27801 Remaining Data: 27800 Remaining Data: 27799 Remaining Data: 27798 Remaining Data: 27797 Remaining Data: 27796 Remaining Data: 27795 Remaining Data: 27794 Remaining Data: 27793 Remaining Data: 27792 Remaining Data: 27791 Remaining Data: 27790 Remaining Data: 27789 Remaining Data: 27788 Remaining Data: 27787 Remaining Data: 27786 Remaining Data: 27785 Remaining Data: 27784 Remaining Data: 27783 Remaining Data: 27782 Remaining Data: 27781 Remaining Data: 27780 Remaining Data: 27779 Remaining Data: 27778 Remaining Data: 27777 Remaining Data: 27776 Remaining Data: 27775 Remaining Data: 27774 Remaining Data: 27773 Remaining Data: 27772 Remaining Data: 27771 Remaining Data: 27770 Remaining Data: 27769 Remaining Data: 27768 Remaining Data: 27767 Remaining Data: 27766 Remaining Data: 27765 Remaining Data: 27764 Remaining Data: 27763 Remaining Data: 27762 Remaining Data: 27761 Remaining Data: 27760 Remaining Data: 27759 Remaining Data: 27758 Remaining Data: 27757 Remaining Data: 27756 Remaining Data: 27755 Remaining Data: 27754 Remaining Data: 27753 Remaining Data: 27752 Remaining Data: 27751 Remaining Data: 27750 Remaining Data: 27749 Remaining Data: 27748 Remaining Data: 27747 Remaining Data: 27746 Remaining Data: 27745 Remaining Data: 27744 Remaining Data: 27743 Remaining Data: 27742 Remaining Data: 27741 Remaining Data: 27740 Remaining Data: 27739 Remaining Data: 27738 Remaining Data: 27737 Remaining Data: 27736 Remaining Data: 27735 Remaining Data: 27734 ``` -------------------------------- ### Run Federated Learning Server Source: https://github.com/smilelab-fl/fedlab/blob/master/examples/network-connection-checker/README.md Command to start the federated learning server. Ensure to replace placeholder values with your actual network details. ```bash python server.py --ip 121.23.54.65 --port 12345 --world_size k+1 --ethernet lo1 ``` -------------------------------- ### Prepare Partitioned MNIST Dataset Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/pipeline_tutorial.ipynb Loads and partitions the MNIST dataset for federated learning using FedLab's `PartitionedMNIST` class. This example shows how to get a specific client's dataset and dataloader. ```python # We provide a example usage of patitioned MNIST dataset # Download raw MNIST dataset and partition them according to given configuration from torchvision import transforms from fedlab.contrib.dataset.partitioned_mnist import PartitionedMNIST fed_mnist = PartitionedMNIST(root="../datasets/mnist/", path="../datasets/mnist/fedmnist/", num_clients=args.total_client, partition="noniid-labeldir", dir_alpha=args.alpha, seed=args.seed, preprocess=args.preprocess, download=True, verbose=True, transform=transforms.Compose( [transforms.ToPILImage(), transforms.ToTensor()])) dataset = fed_mnist.get_dataset(0) # get the 0-th client's dataset dataloader = fed_mnist.get_dataloader(0, batch_size=128) # get the 0-th client's dataset loader with batch size 128 ``` -------------------------------- ### Dockerfile for FedLab Installation Source: https://github.com/smilelab-fl/fedlab/blob/master/docs/source/tutorials/docker_deployment.rst This Dockerfile sets up an environment for FedLab by installing it on a PyTorch base image. It configures package managers and installs specific versions of PyTorch and FedLab. ```shell # This is an example of fedlab installation via Dockerfile # replace the value of TORCH_CONTAINER with pytorch image that satisfies your cuda version # you can find it in https://hub.docker.com/r/pytorch/pytorch/tags ARG TORCH_CONTAINER=1.5-cuda10.1-cudnn7-runtime FROM pytorch/pytorch:${TORCH_CONTAINER} RUN pip install --upgrade pip \ & pip uninstall -y torch torchvision \ & conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ \ & conda config --set show_channel_urls yes \ & mkdir /root/tmp/ # replace with the correct install command, which you can find in https://pytorch.org/get-started/previous-versions/ RUN conda install -y pytorch==1.7.1 torchvision==0.8.2 cudatoolkit=10.1 -c pytorch # pip install fedlab RUN TMPDIR=/root/tmp/ pip install -i https://pypi.mirrors.ustc.edu.cn/simple/ fedlab ``` -------------------------------- ### Install FedBoard Dependencies Source: https://github.com/smilelab-fl/fedlab/blob/master/fedlab/board/README.md Installs the necessary Python packages for FedBoard from the requirements file. Navigate to the fedlab/board directory before running. ```shell cd fedlab/board pip install -r requirements.txt ``` -------------------------------- ### Cross-process Communication Setup in Python Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/pipeline_tutorial.ipynb This code demonstrates the setup for cross-process federated learning. It initializes network connections and managers for both the client and server sides using FedLab's distributed networking capabilities. Ensure `args` object is properly defined with network parameters before execution. ```python from fedlab.core import DistNetwork from fedlab.core.client.manager import PassiveClientManager # Client side. Put your trainer into a network manager. args.ip = "127.0.0.1" args.port = 3002 args.rank = 1 args.world_size = 2 # world_size = the number of client manager + 1 (server) args.ethernet = None client_network = DistNetwork( address=(args.ip, args.port), world_size=args.world_size, rank=args.rank, ethernet=args.ethernet, ) # trainer can be ordinary trainer or serial trainer. client_manager = PassiveClientManager(trainer=trainer, network=client_network) # Server side. Put your handler into a network manager. from fedlab.core.server import SynchronousServerManager server_network = DistNetwork(address=(args.ip, args.port), world_size=args.world_size, rank=0, # the rank of server is 0 as default ethernet=args.ethernet) server_manager = SynchronousServerManager(handler=handler, network=server_network, mode="GLOBAL") ``` -------------------------------- ### Initialize CompressServerHandler Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/communication_tutorial.ipynb Initializes the server handler with global round, client count, sample ratio, and CUDA settings. Requires a model and compressor setup. ```python args.com_round = 10 args.sample_ratio = 0.1 handler = CompressServerHandler(model=model, global_round=args.com_round, num_clients=args.total_client, sample_ratio=args.sample_ratio, cuda=args.cuda) handler.setup_compressor(compressor, args.cmp_op) ``` -------------------------------- ### Run Federated Learning Client Source: https://github.com/smilelab-fl/fedlab/blob/master/examples/network-connection-checker/README.md Command to start a federated learning client. Replace placeholder values with the server's IP and port, and specify the client's rank and desired ethernet interface. ```bash pthon client.py --ip 121.23.54.65 --port 12345 --world_size k+1 --rank 1 --ethernet eno ``` ```bash pthon client.py --ip 121.23.54.65 --port 12345 --world_size k+1 --rank 2 --ethernet docker0 ``` ```bash pthon client.py --ip 121.23.54.65 --port 12345 --world_size k+1 --rank k --ethernet docker2 ``` -------------------------------- ### Start FedLab Clients Source: https://github.com/smilelab-fl/fedlab/blob/master/docs/source/examples/quick_start.rst Launches multiple client processes using a shell script. This script iterates to start clients from a specified rank to a given number, with a short delay between each to manage resource allocation. ```shell-session $ bash start_clt.sh 11 1 10 ``` -------------------------------- ### Cross-Process Simulation Commands Source: https://github.com/smilelab-fl/fedlab/blob/master/docs/source/examples/quick_start.rst Commands to start the server and client processes for a cross-process FL simulation. Uses torch.distributed for communication. ```shell-session python server.py --ip 127.0.0.1 --port 3001 --world_size 3 --round 3 & python client.py --ip 127.0.0.1 --port 3001 --world_size 3 --rank 1 & python client.py --ip 127.0.0.1 --port 3001 --world_size 3 --rank 2 & wait ``` -------------------------------- ### Install FedLab via Pip Source: https://github.com/smilelab-fl/fedlab/blob/master/docs/source/install.rst Install the stable version of FedLab directly from pip by specifying the desired version. ```shell $ pip install fedlab==$version$ ``` -------------------------------- ### Run FedLab Docker Container Source: https://github.com/smilelab-fl/fedlab/blob/master/docker/README.md Starts a Docker container from a built FedLab image. Ensure to use '--gpus all' for GPU support and '--network=host' for host networking. ```bash docker run -itd --gpus all --network=host b23a9c46cd04(image name) /bin/bash ``` -------------------------------- ### Start FedBoard Dashboard Source: https://github.com/smilelab-fl/fedlab/blob/master/fedlab/board/README.md Starts the FedBoard dashboard on a process registered with the BOARD_SHOWER role. The process will be blocked until the dashboard is stopped. Alternatively, use a context manager to run it non-blockingly. ```python fedboard.start(port=8070) ``` ```python with RuntimeFedBoard(port=8070): # do something... ``` -------------------------------- ### Define Client Local Training Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/pipeline_tutorial.ipynb Initializes a client trainer for local model training. This example demonstrates setting up a `SGDSerialClientTrainer` with dataset and optimizer configurations. ```python # client from fedlab.contrib.algorithm.basic_client import SGDSerialClientTrainer, SGDClientTrainer # local train configuration args.epochs = 5 args.batch_size = 128 args.lr = 0.1 trainer = SGDSerialClientTrainer(model, args.total_client, cuda=args.cuda) # serial trainer # trainer = SGDClientTrainer(model, cuda=True) # single trainer trainer.setup_dataset(fed_mnist) trainer.setup_optim(args.epochs, args.batch_size, args.lr) ``` -------------------------------- ### CIFAR-100 Data Partitioning Example Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/Datasets-DataPartitioner-tutorials/cifar100_tutorial.ipynb Illustrates the process of partitioning CIFAR-100 data using FedLab's DataPartitioner. This code is typically run once to prepare the dataset. ```python import fedlab_api from fedlab_api.dataset.partition import DataPartitioner from fedlab_api.dataset.cifar10 import CIFAR100 # Download and load CIFAR-100 dataset # Ensure you have the dataset downloaded or uncomment the following lines to download # CIFAR100(root='../../data', download=True) # Initialize DataPartitioner for CIFAR-100 # num_classes=100, num_clients=100, balance=True, partition='dirichlet', alpha=2, unbalance=False, n_ শিfts=1 balance_dir_part = DataPartitioner(dataset=CIFAR100(root='../../data', train=True, download=False), num_classes=100, num_clients=100, balance=True, partition='dirichlet', alpha=2, unbalance=False, n_shifts=1) # Print the number of remaining data points (example output) print(f"Remaining Data: {balance_dir_part.data_indices[0].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[1].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[2].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[3].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[4].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[5].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[6].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[7].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[8].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[9].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[10].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[11].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[12].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[13].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[14].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[15].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[16].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[17].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[18].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[19].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[20].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[21].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[22].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[23].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[24].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[25].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[26].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[27].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[28].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[29].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[30].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[31].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[32].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[33].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[34].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[35].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[36].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[37].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[38].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[39].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[40].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[41].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[42].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[43].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[44].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[45].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[46].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[47].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[48].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[49].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[50].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[51].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[52].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[53].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[54].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[55].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[56].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[57].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[58].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[59].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[60].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[61].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[62].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[63].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[64].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[65].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[66].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[67].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[68].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[69].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[70].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[71].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[72].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[73].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[74].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[75].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[76].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[77].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[78].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[79].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[80].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[81].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[82].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[83].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[84].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[85].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[86].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[87].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[88].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[89].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[90].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[91].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[92].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[93].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[94].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[95].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[96].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[97].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[98].shape[0]}") print(f"Remaining Data: {balance_dir_part.data_indices[99].shape[0]}") ``` -------------------------------- ### CIFAR-100 Data Partitioning Example Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/Datasets-DataPartitioner-tutorials/cifar100_tutorial.ipynb This code block shows the remaining data count during CIFAR-100 partitioning. It is useful for monitoring the partitioning process. ```python Remaining Data: 17942 Remaining Data: 17941 Remaining Data: 17940 Remaining Data: 17939 Remaining Data: 17938 Remaining Data: 17937 Remaining Data: 17936 Remaining Data: 17935 Remaining Data: 17934 Remaining Data: 17933 Remaining Data: 17932 Remaining Data: 17931 Remaining Data: 17930 Remaining Data: 17929 Remaining Data: 17928 Remaining Data: 17927 Remaining Data: 17926 Remaining Data: 17925 Remaining Data: 17924 Remaining Data: 17923 Remaining Data: 17922 Remaining Data: 17921 Remaining Data: 17920 Remaining Data: 17919 Remaining Data: 17918 Remaining Data: 17917 Remaining Data: 17916 Remaining Data: 17915 Remaining Data: 17914 Remaining Data: 17913 Remaining Data: 17912 Remaining Data: 17911 Remaining Data: 17910 Remaining Data: 17909 Remaining Data: 17908 Remaining Data: 17907 Remaining Data: 17906 Remaining Data: 17905 Remaining Data: 17904 Remaining Data: 17903 Remaining Data: 17902 Remaining Data: 17901 Remaining Data: 17900 Remaining Data: 17899 Remaining Data: 17898 Remaining Data: 17897 Remaining Data: 17896 Remaining Data: 17895 Remaining Data: 17894 Remaining Data: 17893 Remaining Data: 17892 Remaining Data: 17891 Remaining Data: 17890 Remaining Data: 17889 Remaining Data: 17888 Remaining Data: 17887 Remaining Data: 17886 Remaining Data: 17885 Remaining Data: 17884 Remaining Data: 17883 Remaining Data: 17882 Remaining Data: 17881 Remaining Data: 17880 Remaining Data: 17879 Remaining Data: 17878 Remaining Data: 17877 Remaining Data: 17876 Remaining Data: 17875 Remaining Data: 17874 Remaining Data: 17873 Remaining Data: 17872 Remaining Data: 17871 Remaining Data: 17870 Remaining Data: 17869 Remaining Data: 17868 Remaining Data: 17867 Remaining Data: 17866 Remaining Data: 17865 Remaining Data: 17864 Remaining Data: 17863 Remaining Data: 17862 ``` -------------------------------- ### CIFAR-100 Dataset Information Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/Datasets-DataPartitioner-tutorials/cifar100_tutorial.ipynb Prints the number of clients and the data distribution for the CIFAR-100 training set after partitioning. This provides an overview of the dataset setup. ```python print(f"Number of clients: {balance_dir_part.num_partitions}") print(f"Data distribution: {balance_dir_part.client_dict}") ``` -------------------------------- ### Iterate Through Federated DataLoader Source: https://github.com/smilelab-fl/fedlab/blob/master/tutorials/Datasets-DataPartitioner-tutorials/cifar100_tutorial.ipynb Iterates through a FederatedDataLoader to access data batches for federated learning. This snippet shows how to get data for clients. ```python for data, target in train_loader: print(f"Data shape: {data.shape}, Target shape: {target.shape}") break ```