Oneflow-Inc / swin-transformer

0 stars 0 forks source link

Swin-Transformer 跑通 eager global 2d sbp #7

Open Ldpe2G opened 2 years ago

Ldpe2G commented 2 years ago

基于分支 https://github.com/Oneflow-Inc/oneflow/pull/7238 能跑通 eager global 的 2d sbp

实验分支 swin_clean_ldp_eager_consistent

脚本: debug_with_real_data_ddp.sh

完全跑通 eager global 待解决的问题

wyg1997 commented 2 years ago

通过一层层定位,发现是 zeros_like 在推导 sbp 时出现了和输入 tensor 不同的 sbp,在修复中。

最小复现代码(需要顺便检察 ones_like ):

import oneflow as flow
from oneflow import nn
import numpy as np
#  import torch

gen = flow.Generator(device="cuda")
gen.manual_seed(123)
placement = flow.placement("cuda", {0: range(4)}, (2, 2))

B = flow.sbp.broadcast
S0 = flow.sbp.split(0)
S1 = flow.sbp.split(1)
P = flow.sbp.partial_sum

a = flow.rand(128, 3, 4, 4, placement=placement, sbp=[B, B], generator=gen)
b = flow.zeros_like(a)
print(b)   # sbp=(oneflow.sbp.broadcast, oneflow.sbp.split(axis=0))
wyg1997 commented 2 years ago

本身这个推导是有问题的么,如果没问题的话打算怎么修复

我在看推导相关的逻辑,这里推导一定要推出和 input 一样的 sbp 和 placement 的。现在的推导结果和输入的 placement 有关系(如果是其他 placement,结果的 sbp 还会变),说明中间推导一定有问题的。

hjchen2 commented 2 years ago

我在看推导相关的逻辑,这里推导一定要推出和 input 一样的 sbp 和 placement 的。现在的推导结果和输入的 placement 有关系(如果是其他 placement,结果的 sbp 还会变),说明中间推导一定有问题的。

好的,了解了。这里是不是可以这样呢,zero like出来的结果再to_consistent一下。

wyg1997 commented 2 years ago

我在看推导相关的逻辑,这里推导一定要推出和 input 一样的 sbp 和 placement 的。现在的推导结果和输入的 placement 有关系(如果是其他 placement,结果的 sbp 还会变),说明中间推导一定有问题的。

好的,了解了。这里是不是可以这样呢,zero like出来的结果再to_consistent一下。

临时这么做是没问题的,不过这样不是多了通信和拷贝嘛,而且不一定能 to_consistent 通