Houjiang Chen

Results 37 comments of Houjiang Chen

好像是CPU的内存泄漏,binbin可以看一下是不是缓存占用了太多的cpu内存了 @clackhan

看起来就是这个PR (https://github.com/Oneflow-Inc/oneflow/pull/8662 )将tensor meta symbol化之后导致的,我这边跑了一下,这个PR之前的commit (60827b0500c808ae4c08f6aa958e99aa8c37df77) 还是正常的2.8G内存,在这个PR合并之后commit( 146288eea079468e05dfd793d36e8e3452c3bf18 )内存涨到了12G+。 我这里测试的是这个代码: ```python import oneflow as flow import oneflow.nn as nn A = flow.Tensor(16000000, 11, device="cuda") A.numpy() print(A.shape) for i in range(A.shape[0]):...

> 是不是一个很长的循环里的item 的key不一样,导致每个item 都被缓存了 是的,我那段代码里的那个for循环里每次item不同导致view出来的Tensor的TensorMeta offset不一样,symbol化之后就必须要把它们都缓存起来。 另外原始的这段代码`A = flow.split(A,1,0)`即使没有symbol化tensor meta,也一样会因为split出来的大量的tensor没有被释放而占用非常大的内存。我对比了一下PyTorch,原始的代码在torch下占用了大约10G的内存,我们会占用20G,可能是我们的Tensor和TensorMeta数据结构上会多占一倍的存储。

> 目前有什么办法避免这个问题嘛,或者有flow.cat的替代形式 可以先禁用view(export ONEFLOW_DISABLE_VIEW=1),同时把flow.split改成for循环的方式,每次处理一个item。 ```python for i in range(A.shape[0]): process A[i] ``` 不过需要注意的是,禁用view可能会造成某些tensor setitem操作不能正确执行。

这个bug应该是一直以来就存在的,主要原因是repeat op在clear list里,amp算法可能会把repeat op推导为half,导致normalization op的输入moving mean和moving var在repeat之前就转换成了half,而amp算法只是标记了moving mean和moving var是no cast的(即不插入cast op转换成half),但并没有考虑输入已经是half的情况下怎么处理。

两种比较简单的fix办法是: - 1. 把repeat直接从clear list里移除掉。 - 2. 在no cast的时候(https://github.com/Oneflow-Inc/oneflow/blob/master/oneflow/core/job_rewriter/auto_mixed_precision.cpp#L130 )插入一个转换为fp32的cast op,然后可以考虑再加一个消除fp32 cast成fp32的pass。

> > 两种比较简单的fix办法是: > > > > * 1. 把repeat直接从clear list里移除掉。 > > * 2. 在no cast的时候(https://github.com/Oneflow-Inc/oneflow/blob/master/oneflow/core/job_rewriter/auto_mixed_precision.cpp#L130 )插入一个转换为fp32的cast op,然后可以考虑再加一个消除fp32 cast成fp32的pass。 > > moving mean 和 moving var 是不能通过repeat在连接到BN,因为是mutable消费,必须是var直接连到 Bn 那这里就有两个问题,1)有bn的情况下不能支持grad...

> > > > 两种比较简单的fix办法是: > > > > > > > > * 1. 把repeat直接从clear list里移除掉。 > > > > * 2. 在no cast的时候(https://github.com/Oneflow-Inc/oneflow/blob/master/oneflow/core/job_rewriter/auto_mixed_precision.cpp#L130 )插入一个转换为fp32的cast op,然后可以考虑再加一个消除fp32 cast成fp32的pass。 > >...

> 还有哪些 op 是 no cast ? no cast 跟 black 是同样的区别吗? @hjchen2 ```c++ REGISTER_NO_CAST_REGISTRY("normalization", "moving_mean", 0) REGISTER_NO_CAST_REGISTRY("normalization", "moving_variance", 0) REGISTER_NO_CAST_REGISTRY("normalization", "gamma", 0) REGISTER_NO_CAST_REGISTRY("normalization", "beta", 0) REGISTER_NO_CAST_REGISTRY("normalization_grad", "gamma", 0) REGISTER_NO_CAST_REGISTRY("normalization_add_relu",...

> 另一种解决方案是: > > 依然沿袭着 bn 的两个 前向 Variable 不插入 repeat 的逻辑。在 新版(不是 v3,是 v2) grad acc 的 Variable functional 接口里特判是否是特殊的前向 Variable,对前向 Var 不做处理,沿用当前 NormalizationExponentialAverageAutoTickPass 插入 tick 的方式。 我觉得不用,只需要repeat支持inplace就可以,剩下的就是看要不要把repeat移出clear list,还是修改一下amp算法,让这些no...