宝典相授,无错在手 |昇思MindSpore报错调试宝典(六):网络构建与训练类报错之资源不足

发布时间 2023-06-12 16:05:41作者: Skytier

上一期讲解了网络构建与训练类报错之算子执行错误该如何定位解决,相信如输入异常、算子实现错误之类算子执行问题已经难不倒大家了。那么本期我们看看网络构建与训练类报错常见的最后一个问题分类,即资源不足方面的报错,如遇到资源不足方面的报错,如 Out Of Memory、memory isn’t enough 等等资源问题应该如何分析呢。本期以神经网络训练过程中出现的资源问题为例来讲解下定位解决的方法。

 

详细案例请参考下图~

 

MindSpore%E6%8A%A5%E9%94%99%E8%B0%83%E8%AF%95%E5%AE%9D%E5%85%B8%EF%BC%88%E5%85%AD%EF%BC%89.png

 

文字内容:

小孢子:你好呀,昇思MindSpore!我又来啦。这次的问题是,神经网络训练模型脚本在执行过程中报错退出了,你帮我看看是哪里出了问题?

MindSpore: 好呀!让我看看你的环境信息、脚本代码与报错日志~

小孢子:环境信息是这样的:


Hardware Environment(Ascend/GPU/CPU): GPU Software Environment: -- MindSpore version (source or binary): 2.0.0-alpha -- Python version (e.g., Python 3.7.5): 3.7.5 -- OS platform and distribution (e.g., Linux Ubuntu 16.04): Ubuntu 4.15.0-74-generic

部分训练脚本信息:


01 def datapipe(path, batch_size): #④ 02    image_transforms = [ 03        vision.Rescale(1.0 / 255.0, 0), 04        vision.Normalize(mean=(0.1307,), std=(0.3081,)), 05        vision.HWC2CHW() 06    ] 07    label_transform = transforms.TypeCast(ms.int32) 08 09    dataset = MnistDataset(path) 10    dataset = dataset.map(image_transforms, 'image') 11    dataset = dataset.map(label_transform, 'label') 12    dataset = dataset.batch(batch_size) 13    return dataset 14 15 train_dataset = datapipe('MNIST_Data/train', 64)  #③

报错信息:


cudaStreamCreate failed, ret[2], out of memory  #① ----------------------------------------------------------------- …… RuntimeError: Alloc device memory [16121856] faild.  #② ----------------------------------------------------------------- C++ Call Stack: (For framework developers) ----------------------------------------------------------------- Mindspore/ccsrc/plugin/device/gpu/hal/device/gpu_memory_allocator.cc:88 AllocDeviceMem

MindSpore:首先先看下报错信息,

1.①中看到out of memory,提示内存溢出。

2.②根据报错提示,查看执行机内存大小以及是否有其他进程占用内存,发现没有多余内存可用。

3.③、④看到batch_size值有些大,而在一定条件下,batch_size过大,会导致OOM

解决办法,

将③代码中的train_dataset = datapipe('MNIST_Data/train', 64)

修改为 train_dataset = datapipe('MNIST_Data/train', 32)。

最终完整代码如下:


01 def datapipe(path, batch_size): 02    image_transforms = [ 03        vision.Rescale(1.0 / 255.0, 0), 04        vision.Normalize(mean=(0.1307,), std=(0.3081,)), 05        vision.HWC2CHW() 06    ] 07    label_transform = transforms.TypeCast(ms.int32) 08 09    dataset = MnistDataset(path) 10    dataset = dataset.map(image_transforms, 'image') 11    dataset = dataset.map(label_transform, 'label') 12    dataset = dataset.batch(batch_size) 13    return dataset 14 15 train_dataset = datapipe('MNIST_Data/train', 32)

小孢子:好了,执行没有报错,程序可以继续进行训练了。

MindSpore:总结下资源不足问题处理方法,

  1. 查看日志报错提示,确定问题现象;
  2. 查看机器运行配置信息,以及其他执行程序是否有过多占用内存;
  3. 查看代码行,通过参数batch_size的大小减少内存占用。

小孢子:好的,我明白啦,在遇到资源不足问题时,还是看具体情况,是其他程序占用、还是程序本身配置问题。

MindSpore:不错,总结的很到位,真是触类旁通呢。那么下次我们交流下,分布式并行错误分析!

小孢子:好呀,我也先回去研究研究,期待下次见面!

 

报错地图:https://www.hiascend.com/forum/thread-0229108045633055169-1-1.html

 

往期回顾:

昇思MindSpore报错调试宝典(一):数据加载与处理类:https://www.hiascend.com/forum/thread-0215111378750918013-1-1.html

MindSpore报错调试宝典(二):网络构建与训练类报错之context配置问题:https://www.hiascend.com/forum/thread-0227112497811434016-1-1.html

昇思MindSpore报错调试宝典(三):网络构建与训练类报错之语法问题:https://www.hiascend.com/forum/thread-0232113194535560002-1-1.html

昇思MindSpore报错调试宝典(四):网络构建与训练类报错之算子编译错误:https://www.hiascend.com/forum/thread-0203114399255966005-1-1.html

昇思MindSpore报错调试宝典(五):网络构建与训练类报错之算子执行错误:https://www.hiascend.com/forum/thread-0250115007368297037-1-1.html