如何处理训练过程中出现oom 显存不足?

现象描述:gpu上网络运行过程中出现oom(显存不足)

工具/软件

mindspore1.5.0

windows10

第1步

原因分析

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

1.训练batchsize过大。

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

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

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

第2步

解决方法

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

第3步

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

第4步

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

第5步

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

第6步

案例代码:

```

bool launch(const std::vector &inputs, const std::vector &workspace,

const std::vector &outputs, void *stream_ptr) override { t *input = getdeviceaddress(inputs, 0); s *indices = getdeviceaddress(inputs, 1); t *updates = getdeviceaddress(inputs, 2); t *output = getdeviceaddress(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)

如何处理训练过程中出现oom 显存不足?