libai icon indicating copy to clipboard operation
libai copied to clipboard

设置不同的data_parallel_size导致了不同的global_batch_size

Open Yipeng1994 opened this issue 2 years ago • 1 comments

问题描述

在libai的config文件里面,比如 bert_large_pretrain.py,为了控制并行模式,我加上了这么几行

train.dist.data_parallel_size=2
train.dist.tensor_parallel_size=1

作为一个用户,我觉得data_parallel_size是数据并行的维度,tensor_parallel_size是模型并行的维度,不管怎么设置他们,从全局上来看(或者说一致性视角下),模型是不会变的。

然而实际上,在global_batch_size留空(未设置train.global_batch_size)时,实际的

cfg.train.global_batch_size = (
            train_micro_batch_size
            * dist.get_data_parallel_size()
            * cfg.train.num_accumulation_steps
        )

这导致一个结果就是设置

train.dist.data_parallel_size=2
train.dist.tensor_parallel_size=1

与设置

train.dist.data_parallel_size=1
train.dist.tensor_parallel_size=2

的global batch size不一样,前者的batch size是后者的2倍。

用户诉求

作为一个用户,我希望说,我改变了并行的方式不会影响到我的模型。

所以我尝试去把 train_micro_batch_size 留空,我设置了 train.global_batch_size = 8 结果却是出了错,因为train_micro_batch_size 留空时会被默认设置为32.

我希望更多地从全局性的视角去配置这个参数,所以我更加想设置global_batch_size而不是train_micro_batch_size。 我希望train_micro_batch_size被留空时也能由global_batch_size推算出来(一个除法,不难)

开发者诉求

因为我不是用框架搞算法的专业人员,所以对行业内的默认规则了解得不够多,我不知道行业内是怎么设置batch size的,但是我觉得应该让用户知晓global_batch_size 跟 train_micro_batch_size 还有 data_parallel_size的关系,至少应该在说明文档里面有提及。 用户不需要知道太多,但是应该知道改变data_parallel_size会改变模型的batch size

Yipeng1994 avatar Aug 05 '22 09:08 Yipeng1994

设置data_parallel_size=2,tensor_parallel_size=1,gpu=2时也就是2卡数据并行,然后train_micro_batch_size=16的话,global_batch_size就是32,也就是32个batch的数据切两份,然后模型其实训练的是32batch_size的数据

设置data_parallel_size=1,tensor_parallel_size=2,gpu=2,train_micro_batch_size=16时也就是2卡模型并行,模型训练的数据其实是16的batch_size

一鹏的意思是让用户控制模型应该训练多大的batch,而不是设置每张gpu上的batch_size对吧

然后我跟程鹏确认了一下,我也查了一下pytorch的数据并行是直接给用户设置的global_batch_size,LiBai中是都可以设置,但是确实可以优化一下(设置global_batch_size时不设置train_micro_batch_size会出问题),感觉可以global_batch_size和train_micro_batch_size都默认为None,然后用户只设置一个参数的话就自动计算出另一个,都设置了的话就判断是否合理。

然后configs文件中的comment里已经给用户解释了这些关系,https://github.com/Oneflow-Inc/libai/blob/5d5acf9aa69ab5b5da8ae9d992dce4afe0d1964c/configs/common/train.py#L22。 document:https://libai.readthedocs.io/en/latest/tutorials/basics/Config_System.html?highlight=train#train

global_batch_size=8的时候设置一下train_micro_batch_size=None就好了

@Yipeng1994

xiezipeng-ML avatar Aug 05 '22 13:08 xiezipeng-ML