FedML-master环境安装
根目录下有5个CI文件,CI-install.sh是总环境的安装,后面4个分别是四个算法的具体安装。
要求:Pytorch>=1.4.0, MPI4PY>=3.0.3, Python>=3.7.4
官方给的安装教程:http://doc.fedml.ai/#/installation-distributed-computing
创建环境:
conda create -n fedml python=3.7.4
conda activate fedml
Pytorch:
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
MP14Py:
conda install -c anaconda mpi4py
Weights and bias:
pip install --upgrade wandb
Install other required packages:
conda install scikit-learn
conda install numpy
conda install h5py
conda install setproctitle
conda install networkx
pip install -r requirements.txt
data文件夹下存放的是实验数据,根据你需要的数据到相应的文件夹下,按照流程download数据就好啦,基本都是sh download_xxx.sh。
比如执行FedAvg算法,就要先cd 到fedml-experiments/distributed的 fedavg 文件夹下(如果不是分布式的就去standalone文件夹里执行)。
1、第一步是配置节点。(由于我不是分布式的,所以这里省略了。)
2、weights and bias的记录,需要先登录wandb,当然如果不想用wandb来查看实验结果的话,可以不登录。
wandb login 自己的ID
我这里也没登录,直接wandb off
就可。
3、执行程序。每个算法的文件夹下都有一个readme,写了具体的执行方法。比如FedAvg的这个:
sh run_fedavg_distributed_pytorch.sh \
--client_num_in_total <client_num_in_total> \
--client_num_per_round <client_num_per_round> \
--model <model> \
--partition_method <partition_method>
--comm_round <comm_round> \
--epochs <epochs>\
--batch_size <batch_size> \
--learning_rate <learning_rate> \
--dataset <dataset> \
--data_dir <data_dir> \
--client_optimizer <client_optimizer> \
--backend <backend> \
--grpc_ipconfig_path <grpc_ipconfig_path> \
--ci <ci>
如果以MNIST数据集为例的话,就是
sh run_fedavg_standalone_pytorch.sh 0 1000 10 10 mnist ./../../../data/mnist lr hetero 200 1 0.03 sgd 0
这时要是报错:ModuleNotFoundError: No module named ‘setproctitle’ 或者 ‘h5py’ 之类的,就conda install就好。
另外,可以直接sh CI-install.sh,一键完成安装。(注意如果安装了conda,就要注释掉前几行conda的安装过程)。
这里记录一个执行完的bug:
ImportError: /home/huazheng/anaconda3/envs/py38new/lib/python3.8/site-packages/h5py/defs.cpython-38-x86_64-linux-gnu.so: undefined symbol: H5Pset_fapl_ros3
解决完之后再来更。
解决了!是h5py的版本问题,我安装的是3.3.0版本,就会报这个错。降低版本到2.9.0就OK啦!
conda install h5py=2.9.0
更新:
在执行distributed里的Fedavg算法时,或许会报错“ModuleNotFoundError: No module named ‘FedML’ ”,因为在github上下载的文件夹叫“FedML-master”,所以把文件夹的名字改为“FedML”就好了!
还有,或许会报错
AssertionError
Traceback (most recent call last):
File "./main_fedavg.py", line 320, in <module>
device = mapping_processes_to_gpu_device_from_yaml_file(process_id, worker_number, args.gpu_mapping_file, args.gpu_mapping_key)
File "/home/huazheng/federated_learning/FedML/fedml_api/distributed/utils/gpu_mapping.py", line 33, in mapping_processes_to_gpu_device_from_yaml_file
assert i == worker_number
这是gpu的进程数和你执行命令时输入的worker num不一样导致的。解决办法:打卡gpu_mapping.py,找到 i 的定义,然后print(i),输出一下你的gpu的进程数,然后在输入命令的时候用这个数就好了!记得还要更改gprc_ipconfig.py文件,使它的client num和进程数一致。