Skip to content
desperadoccy edited this page Oct 10, 2024 · 4 revisions

global用于控制适用于全局的参数

  • dataset_pre_load 数据集是否提前加载并共享,用于节省内存以及处理多进程等待io,建议开启。提前加载的数据集以Tensor形式存储在内存中,客户端在初始化时会直接从内存中获取数据集,而不是从io中加载数据集。
  • mutli_gpu 是否使用多GPU,如想使用cpu,请运行export CUDA_VISIBLE_DEVICES=""
  • experiment 实验名称,用于保存实验结果
  • stale 客户端的延迟设置,用于模拟客户端的系统异构,详细请跳转stale
  • dataset 数据集的设置
    • path 数据集类的路径
    • params 数据集类的初始化参数
  • iid 数据集分布设置,详细请跳转iid
  • client_num 客户端数量
  • save [optinal] 是否保存实验结果
  • seed [optinal] 随机数种子,用于完全复现实验,每次实验后会将本次实验的随机数种子添加至config
  • mode [optinal] 运行模式,详细请跳转mode
  • use_file_system [optinal] 是否启用torch.multiprocessing.set_sharing_strategy('file_system')
  • message_queue [optinal] 消息队列设置, 详细请跳转message_queue
    • port [optinal] 端口号
  • mqtt [optinal] mqtt设置 mqtt设置,用于分布式模式下的设备间通信
    • host [optinal] mqtt服务器地址
    • port [optinal] mqtt服务器端口

stale

stale支持三种设置,其一是上述配置文件中提到的

"stale": {
      "step": 5,
      "shuffle": true,
      "list": [10, 10, 10, 5, 5, 5, 5]
    }

程序会根据提供的steplist生成一串随机整数,例如上述代码,程序会生成10个0,10个(0,5),10个[5,10)......,并会根据shuffle判断是否进行打乱。最后将随机数串赋给各客户端,客户端根据数值在每轮训练结束后,自动sleep对应秒。

其二是设置为false,程序会给各客户端延迟设置为0。

"stale": false

其三是延迟列表,程序直接会将列表指定延迟设置给客户端。

"stale": [1, 2, 3, 1, 4]

自定义客户端延迟

自行编写特定类,实现generate_staleness_list方法,返回延迟列表,通过配置文件中的pathparams进行设置

"stale": {
    "path": "stale_generator.stale_generator.stale_generator",
    "params": {
        "param1": "value1",
        "param2": "value2"
    }
}

iid

independent identical distribution

当iid设置为true时(其实false也是默认为iid),会以iid的方式将数据分配给各客户端。

"iid": true

dirichlet non-iid

iidcustomize设置为false或者不设置时,会以dirichlet分布的方式将数据分配给各客户端。 其中beta是dirichlet分布的参数。

"iid": {
    "customize": false,
    "beta": 0.5
}

或者

"iid": {
    "beta": 0.5
}

customize non-iid

customize non-iid设置分为两部分,一个是标签的non-iid设置,一个是数据量的non-iid设置。目前数据量仅提供随机生成,在未来的版本中将引入个性化设置。 在启用customize设置时,需要将customize设置为true并分别对labeldata进行设置

"iid": {
    "customize": true
}

label distribution

label的设置stale的设置类似,支持三种方式,其一为配置文件中提到的

"label": {
    "step": 1,
    "list": [10, 10, 30]
}

其上配置程序会生成10个拥有1个标签数据的客户端,10个拥有2个标签数据的客户端,30个拥有3个标签数据的客户端 step是标签数量的步长,当step为2时,程序会生成10个拥有1个标签数据的客户端,10个拥有3个标签数据的客户端,30个拥有5个标签数据的客户端

其二为随机数二维数组,程序将二维数组直接设置给客户端

"label": {
    "0": [1, 2, 3, 8],
    "1": [2, 4],
    "2": [4, 7],
    "3": [0, 2, 3, 6, 9],
    "4": [5]
}

其三为一维数组,该一维数组为每个客户端拥有的标签数,该数组长度应和客户端数量一致。

"label": {
  "list": [4, 5, 10, 1, 2, 3, 4]
}

上述配置即客户端0拥有4个标签数据,客户端1拥有5个标签数据...以此类推。

目前label_iid生成的随机化分为两种方法,一种纯随机化,这种情况可能会导致所有客户端均缺少一个标签,导致精度下降(虽然概率极低),另一种方式采用洗牌算法,保证每个标签均会选到,这也会导致无法生成标签分布不均匀的数据情况。洗牌算法的开关由shuffle控制,示例如下:

"label": {
  "shuffle": true,
  "list": [4, 5, 10, 1, 2, 3, 4]
}

data distribution

data的设置比较简单,目前有两种方式,其一为空

"data": {}

也就是不对数据量进行非独立同分布设置。

其二为配置文件中提到的

"data": {
    "max": 500,
    "min": 400
}

也就是说客户端的数据量范围在400-500,程序会自动平均分配到各标签

数据量分布还较初始,之后将会逐步完善

自定义数据分布

继承data_dist_generator类,实现相关方法。并通过配置文件中的pathparams进行设置

"iid": {
    "path": "data_dist_generator.data_dist_generator.data_dist_generator",
    "params": {
        "param1": "value1",
        "param2": "value2"
    }
}

Clone this wiki locally