使用gpu训练的时候遇到的问题

使用gpu训练的时候遇到的问题

一、gpu显卡内存不够

(1)total_region_allocated_bytes_: 5732564992 memory_limit_: 5732564992 available bytes: 0 curr_region_allocation_bytes_: 11465129984
翻译过来就是:
总区域分配字节数:5732564992;内存限制:5732564992;可用字节数:0;
当前区域分配字节数:11465129984。
(2)OP_REQUIRES failed at tile_ops.cc:199 : RESOURCE_EXHAUSTED: OOM when allocating tensor with shape[2,128,128,64,2,32] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
翻译过来就是:
操作要求在tile_ops处失败了。cc:199 :资源枯竭:当分配器GPU_0_bfc分配形状为[2,128,128,64,2,32] 且类型是浮点型的张量时,在/job:localhost/replica:0/task:0/device:GPU:0出现OOM(内存溢出)
(3)Allocator (GPU_0_bfc) ran out of memory trying to allocate 512.00MiB (rounded to 536870912)requested by op unet3sepera/up_sampling3d_2/Tile_2
If the cause is memory fragmentation maybe the environment variable ‘TF_GPU_ALLOCATOR=cuda_malloc_async’ will improve the situation.
翻译过来就是:
分配器GPU_0_bfc内存不足,尝试分配操作 unet3sepera/up_sampling3d_2/Tile_2请求的512MB(四舍五入到536870912)的时候。如果原因是内存碎片的话,可能环境变量“TF_GPU_ALLOCATOR=cuda_malloc_async”会改善这种情况。
(4)Stats:

Limit:                      5732564992
InUse:                      5338301696
MaxInUse:                   5607070208
NumAllocs:                        1026
MaxAllocSize:                554951168
Reserved:                            0
PeakReserved:                        0
LargestFreeBlock:                    0

(5)If the cause is memory fragmentation maybe the environment variable ‘TF_GPU_ALLOCATOR=cuda_malloc_async’ will improve the situation.

解决方法

(1)可以调整了batch_size的大小,使得一次迭代的数据量变得更小,而且在训练过程当中,因为电脑的内存大于显存,于是使用了CPU来训练。这种方法有缺陷,更好的解决方法,我也在找。

二、允许显存自动申请

(1)tensorflow.python.framework.errors_impl.UnknownError: Graph execution error:
tensorflow.python.framework.errors_impl.UnknownError: 图形执行错误。
使用gpu训练的时候遇到的问题_第1张图片

(2)Allocator (GPU_0_bfc) ran out of memory trying to allocate 1.02GiB with freed_by_count=0. The caller indicates that this is not a failure, but this may mean that there could be performance gains if more memory were available.
翻译过来就是:
分配器在空闲计数器=0的情况下尝试分配1.02GB时发生内存不足,调用方表示这并不是一个故障,这可能意味着如果有更多的内存的话,可以提高性能。
(3)CUDNN failed to allocate the scratch space for the runner or to find a working no-scratch runner.
翻译过来就是:
CUDNN无法为流道分配暂存空间,也找不到正在工作的无暂存的流道。

解决方法:

(1)设置GPU资源

如何查看你的GPU和CPU的数量:
 # 查看gpu和cpu的数量
 gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
cpus = tf.config.experimental.list_physical_devices(device_type='CPU')
print(gpus, cpus)
# 查看tensorflow-gpu的版本,以及gpu是否能使用
tensorflow_version = tf.__version__
gpu_available = tf.test.is_gpu_available()
print('tensorflow version:',tensorflow_version, '\tGPU available:', gpu_available)

解决方法:

import os
import tensorflow as tf
os.environ["CUDA_VISIBLE_DEVICES"] = '0'  # 定位cuda设备为GPU0(需要根据情况修稿)
config = tf.compat.v1.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.9  # 最大可申请显存比例
config.gpu_options.allow_growth = True  # 允许动态分配显存
sess = tf.compat.v1.Session(config=config)

另外一种方法是如下:

# gpus = tf.config.list_physical_devices('GPU')   # 允许需要的时候申请显存空间
# for gpu in gpus:
#     tf.config.experimental.set_memory_growth(device=gpu, enable=True)

参考文章:
https://blog.csdn.net/weixin_51536354/article/details/126163189

你可能感兴趣的:(python,深度学习,tensorflow)