cheng peng

Results 49 comments of cheng peng

我再查一下,好像代码有问题 > 好奇 rank1, 2, 3 上的 loss 乘以 world size 得曲线是怎样的

### 更新:Bert多卡对齐 lazy与graph_consistent 进展 此问题已被[pr6288](https://github.com/Oneflow-Inc/oneflow/pull/6288)修复,见下面进展[comment](https://github.com/Oneflow-Inc/models/issues/187#issuecomment-919681715)。 oneflow版本:0.5.0.dev20210912+cu111 - 目前进展:当数据中data part为同一份时,loss可以对齐。当数据中data part为多份不同时,loss不对齐。 - 私人结论:graph_consistent的多卡训练是没有问题的,但是lazy的多卡训练数据读取可能有问题。 - 怀疑:lazy版本训练时,在把数据shuffle全部关掉的情况下,多卡读取的是同一份数据`part0`,而不是每张卡都会去读取`parti` - 怀疑原因:lazy版本训练的代码,在只更改的gpu数量时,loss几乎完全一致,在1e-3量级。在所有的超参一致时,graph_consistent的单卡loss曲线,和lazy 单卡/多卡训练曲线几乎完全一致。 #### 实验准备 由于lazy版本获取信息以及调试比较麻烦,为了证明猜想的正确性,我们用四卡的机器训练时,准备了三份数据集: - 1.包含四个prat的数据,`data_diff`; - 2.包含四个part的数据,但是顺序和上述的不一样,`data_shuffle`; - 3.只包含一个part0的数据,但是复制了四分,`data_repeat`; 各个数据的分布如下图: #### 实验预期 -...

### 再次更新:Bert多卡lazy与graph_consistent 已对齐 依赖于[pr6288](https://github.com/Oneflow-Inc/oneflow/pull/6288) 用两个数据集分别跑了bert lazy和graph的四卡训练: - 1.包含四个不同data part 数据,`diffpart` - 2.包含同样的四个不同的data part数据, 但是顺序不一致,`shuffle` 数据的分布如下图: 以下为实验结果:loss基本对齐

### eager ddp 实验记录 #### 已被[pr6310](https://github.com/Oneflow-Inc/oneflow/pull/6310)修复 oneflow版本:0.5.0+cu111.git.b6ca28129 - 问题:当model.forward有多个返回值时,会报TensorTuple相关的错误。当model.forward只有一个返回值时,可以正常运行语句 - 条件:实验采用单卡跑eager的ddp,但是实际上单卡和多卡跑都会触发这个问题 - 错误信息: ``` Traceback (most recent call last): File "run_eager_pretraining.py", line 343, in main() File "run_eager_pretraining.py", line 324, in...

### bert实验进展更新:四卡 eager+ddp 已和 graph+consistent对齐 - 注意:在对齐loss时,需要注意loss的等价关系,由于eager+ddp是和pytorch进行对齐的,所以各个卡上的loss实际上是本卡的batch size上loss的平均值,如果要和graph consistent braodcast的loss进行严格对齐,换算关系应该是`loss1 + loss2 + …. + lossn)/ n == graph consistent to broadcast loss` n为卡的数量

### bert进展更新:graph clip gradients 已对齐(采用其他方法绕过去了,原始问题待解决) 与@strint @Ldpe2G @L1aoXingyu 发现了clip gradients中的问题 - 当在optimizer里对model.named_parameters()进行遍历,并添加clip_grad 参数时,无法和lazy进行对齐。 ``` params = [] for module_param_name, value in model.named_parameters(): if use_clip: params.append({ "params": [value], "lr": 0.02, "momentum":...

### clip gradients: 尝试用最小复现代码进行尝试(已复现) 目前采用的自定义网络,两种optimizer的写法会得到不同的loss 第一种写法我们称为optA ```python def build_optimizerA(model): return flow.optim.SGD( [ { "params": model.parameters(), "lr": 0.02, "momentum": 0.9, "clip_grad_max_norm": 1.0, "clip_grad_norm_type": 2.0, } ] ) ``` 第二种写法我们称为optB ```python def...

### clip gradients 实现方式调研 由于各位同事对于clip gradients有相关的讨论,所以在这里记录一下相关调研和看法。 clip grad 在pytorch下和在oneflow下的实现对比,可以看到的是,pytorch和oneflow的clip gradients主要代码部分基本一样: - oneflow:[oneflow_clip_grad](https://github.com/Oneflow-Inc/oneflow/blob/1de7132780f997640413fab3b1f248222b320a74/python/oneflow/nn/utils/clip_grad.py#L31-L132) - pytorch:[pytorch_clip_grad](https://github.com/pytorch/pytorch/blob/c58709b7bb3e7818ee41de2f2d1e58451705ff9c/torch/nn/utils/clip_grad.py#L9-L60) 如果在eager的模式下,那么用户是可以和pytorch一样,调用`flow.nn.utils.clip_grad_norm_(mode.parameters(), max_norm=1.0, norm_type=2.0)`来达到目的,也不用在optimizer里面添加`clip_grad_max_norm: 1.0`和`clip_grad_norm_type: 2.0`这两个参数。 但是如果在graph的模型下,那么想要实现clip_gradients(),则只能通过在optimizer里面添加相应的参数。因为graph里面调用的是C++封装好的接口,和lazy用的同一套代码,函数入口在[optimizer内部](https://github.com/Oneflow-Inc/oneflow/blob/1de7132780f997640413fab3b1f248222b320a74/python/oneflow/nn/optimizer/optimizer.py#L278-L279)。 那么我们现在可以达成共识的是: - 如果我们都在optimizer里面传入clip_gradients的参数,那么我们在进行clip_gradients时,是以group为单位的,此时eager和graph都是可以对齐的。 - 如果我们是用的`flow.nn.utils.clip_grad_norm_()`的方式,那么我们进行clip_gradients, 跟我们传入的parameters()有关,是以传入的parameters()为单位的。当传入的为`model.parameters()`时, 那么就和lazy一样,是以model的param为单位了,在此期间,无论在optimizer里面如何对params进行分组都没有关系,都会对整个models做全局的clip_gradients。所以在eager下用法其实完全可以和pytorch的`torch.nn..utils.clip_grad_norm_()`对齐的。 #### 讨论 对于星宇提出的:“假如说有两个...

You can reduce batchSize(32 -> 16) and loadSize(96 -> 64 or 32). And I have found that the memory usage will increase with the increase of iterations.