如何处理训练过程中出现OOM(显存不足)

【现象描述】

GPU上网络运行过程中出现OOM(显存不足)

【原因分析】

出现该现象,可能原因如下:

1.训练batchsize过大。

2.输入数据的shape是变化的(输入数据动态shape)。

3.输出结果的tensor保存起来了。

4.网络中的算子里出现显存泄漏(算子里每次launch都申请显存,并且不释放)。

【解决方法】

步骤1:排查训练的batchsize是否过大,可以逐步缩小batch,如果觉得batch不够大,还是出现OOM,则排除这个原因。

步骤2:确认输入数据是否是动态shape,当前动态shape还不支持输入shape可变,因为针对这种场景,每次step训练都会编译新图,导致显存不断申请最后OOM,可以通过图的个数是不是不断増长来判断。

步骤3:输出tensor里会挂接device上的地址,方便print时同步device数据输出,在tensor析构的时候会释放device地址,因此如果每次step训练都把输出tensor保存起来的话,导致tensor不会析构,随着训练step的增加则会OOM。

步骤4:前面3个步骤确认都没有问题的话,则有可能是算子实现bug,可以排查下是否有新增算子,算子里是否有申请显存的操作导致显存泄漏。

案例代码:

```

bool Launch(const std::vector<AddressPtr> &inputs, const std::vector<AddressPtr> &workspace,
              const std::vector<AddressPtr> &outputs, void *stream_ptr) override {
    T *input = GetDeviceAddress<T>(inputs, 0);
    S *indices = GetDeviceAddress<S>(inputs, 1);
    T *updates = GetDeviceAddress<T>(inputs, 2);
    T *output = GetDeviceAddress<T>(outputs, 0);

    const size_t indices_len = sizeof(S) * out_strides_.size();
    void *indices_stride_work = device::gpu::GPUMemoryAllocator::GetInstance().AllocTensorMem(indices_len);
    if (indices_stride_work == nullptr) {
      MS_LOG(EXCEPTION) << "Failed to alloc indices_stride_work, size: " << indices_len;
    }

```

---》每次launch都调用内存池接口AllocTensorMem申请内存,导致随着训练step增加出现OOM

【建议与总结】

1.输出tensor一般不建议保存起来,如果需要保存,可以保存asnumpy后的对象,tensor经过asnumpy后拷贝device到host后会释放掉device的地址。

2.算子实现逻辑不应该出现申请显存的逻辑,一般都可以通过workspace来实现临时device地址存储的目的。

【相关参考文档】

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在竞价模块,可能会出现以下一些场景导致OOM现象: 1. 高并发请求:在竞价模块,如果同时有大量的用户进行竞价操作,每个请求都需要占用一定的内存资源。如果并发请求数量过大,超过服务器的处理能力,可能会导致内存耗尽。解决方法可以是增加服务器的内存容量或者优化代码,提高请求处理的效率。 2. 大量竞价数据:竞价模块涉及到大量的竞价数据,例如每个用户的竞价记录、拍卖品的当前价格等。如果没有合理地管理这些数据,例如没有及时释放不再需要的数据或者没有合理地缓存数据,可能会导致内存耗尽。解决方法是使用合适的缓存策略,及时清理不再需要的数据,避免数据堆积。 3. 拍卖品图片处理:竞价模块通常需要处理拍卖品的图片,例如展示拍卖品图片、上传或下载图片等。如果没有适当地管理这些图片资源,例如没有及时释放打开的文件流或者没有合理地缓存图片,可能会导致内存耗尽。解决方法是使用合适的缓存策略,限制图片上传大小,及时关闭文件流等。 4. 竞价计算逻辑复杂:竞价模块可能涉及复杂的竞价计算逻辑,例如根据不同的规则计算出最高竞价、自动出价等。如果这些计算逻辑过于复杂或者存在性能问题,可能会导致内存消耗过大。解决方法是优化竞价计算的算法和代码,提高计算效率。 5. 不合理的缓存使用:缓存可以提高竞价模块的性能,但如果缓存的数据量过大或者缓存策略不合理,可能会导致内存占用过大。解决方法是合理设置缓存的大小和过期时间,定期清理缓存过期的数据。 总之,在开发过程,合理管理内存资源、进行性能测试和监控是避免OOM问题的关键。同时,优化代码、增加服务器资源、合理配置缓存等方法也可以帮助解决OOM问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值