Oneflow-Inc / swin-transformer

0 stars 0 forks source link

Swin-Transformer graph 跑通流水并行 #14

Open Ldpe2G opened 2 years ago

Ldpe2G commented 2 years ago

本实验目的是,复现中兴那边遇到的流水并行训练精度问题:

中兴vit代码

https://github.com/Adlik/large_scale_training/tree/oneflow/swin_transformer

运行命令:

python3 -m oneflow.distributed.launch --nproc_per_node 8 --master_addr 10.42.10.107 --master_port 12345 --node_rank 0 --nnodes 1 main_vit_consistent_graph.py --cfg configs/vit_base_patch16_224.yaml --data-path /imagenet/ --batch-size 64  --zip --accumulation-steps 2 --is-consistent --model-arch vit_b_16_224 --tensor-model-parallel-size 4 --num-gpus-per-node 8 --num-nodes 1 --num-layers 12 --pipeline-model-parallel-size 2

swin 复现

实验分支: swin_clean_ldp_graph_libai_hybrid_parallel

参考上面 vit 的并行配置配置 swin ,将 tensor_parallel_sizepipeline_parallel_size 按照vit的配置,配置成 4 和 2,训练前3个 epoch loss 正常下降,验证集精度正常,看起来能正常收敛。

    # Distributed arguments
    dist=dict(
        data_parallel_size=1,
        tensor_parallel_size=4,
        pipeline_parallel_size=2,
        pipeline_num_layers=4
    ),

如果 tensor_parallel_sizepipeline_parallel_size 都改成 1 就是数据并行,训练也是正常的。

leaves-zwx commented 2 years ago

pipeline_parallel_size = 2 和 pipeline_num_layers = 4 这里为什么不相等?这两个分别表示什么意思?

leaves-zwx commented 2 years ago

pipeline_parallel_size = 2 和 pipeline_num_layers = 4 这里为什么不相等?这两个分别表示什么意思?

我知道了 pipeline_num_layers * pipeline_parallel_size = total_num_layers

Ldpe2G commented 2 years ago

pipeline_parallel_size = 2 和 pipeline_num_layers = 4 这里为什么不相等?这两个分别表示什么意思?

pipeline_parallel_size 对应 vit 的 pipeline-model-parallel-size

pipeline_num_layers 是参考 vit 的 num-layers 参数的设置,vit 有 12 层 EncoderBlock,流水并行是将 EncoderBlock 分组。swin 的话有些不同,它总共只有4层 BasicLayer,每层 BasicLayer 里面根据深度设置,会包含好几层的 SwinTransformerBlock,这里为了设置流水id的方便,我就直接将 pipeline_num_layers 设成4了,流水并行直接以 BasicLayer 分组。