ResourceExhaustedError:分配张量时出现OOM

时间:2019-08-22 19:33:32

标签: python computer-vision gpu h5py

我用较少的一个Fully Connected Layer进行了AlexNet的实现,以对102类花朵进行分类。我的训练集包含11,000张图像,而验证和训练集各包含3,000张图像。我以HDF5格式编写了这三个数据集,并将它们存储在磁盘上。我重新加载了它们,并尝试使用8个和75个时期的批处理将图像通过网络。但是,发生了内存错误

我已经尝试将批量大小减小为8,并将尺寸减小为400x400(原始大小为500x500),但是没有用

     import pandas as pd
import config
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import LabelBinarizer 
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from AlexNet import AlexNet
from preproce import ImageToArrayPreprocessor
from preproce import AspectAwarePreprocessor
from preproce import FCHeadNet
from preproce import HDF5DatasetGenerator
from preproce import HDF5DatasetWriter
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator
from tensorflow.python.keras.optimizers import RMSprop
from tensorflow.python.keras.optimizers import SGD
from tensorflow.python.keras.applications import VGG16
from tensorflow.python.keras.layers import Input
from tensorflow.python.keras.models import Model
from imutils import paths
import numpy as np
import argparse
import cv2
import os



"""aug = ImageDataGenerator(rotation_range=30, width_shift_range=0.1,
                          height_shift_range=0.1, shear_range=0.2, zoom_range=0.2,
                          horizontal_flip=True, fill_mode="nearest")"""
"""print("[INFO] loading images...")
trainPaths = list(paths.list_images(config.IMAGES_PATH))
dataset = pd.read_csv("train.csv")
labels = dataset.iloc[:, 1].values
le = LabelEncoder()
trainLabels = le.fit_transform(labels)

split = train_test_split(trainPaths, trainLabels,
                          test_size=config.NUM_TEST_IMAGES, stratify=trainLabels,
                          random_state=42)
(trainPaths, testPaths, trainLabels, testLabels) = split 

split = train_test_split(trainPaths, trainLabels,
                         test_size=config.NUM_VAL_IMAGES, stratify=trainLabels,random_state=42)
(trainPaths, valPaths, trainLabels, valLabels) = split

datasets = [ ("train", trainPaths, trainLabels, config.TRAIN_HDF5),
             ("val", valPaths, valLabels, config.VAL_HDF5),
             ("test", testPaths, testLabels, config.TEST_HDF5)]



for (dType, paths, labels, outputPath) in datasets: 
    print("[INFO] building {}...".format(outputPath))
    writer = HDF5DatasetWriter((len(paths), 500, 500, 3), outputPath) 
    for (i, (path, label)) in enumerate(zip(paths, labels)): 
        image = cv2.imread(path) 
        image = aap.preprocess(image) 
        writer.add([image], [label])
    writer.close()"""
#aap = AspectAwarePreprocessor(500, 500)
iap = ImageToArrayPreprocessor()
trainGen = HDF5DatasetGenerator(config.TRAIN_HDF5, 8,  preprocessors=[iap], classes=102) 
valGen = HDF5DatasetGenerator(config.VAL_HDF5, 8, preprocessors=[iap], classes=102)




print("[INFO] compiling model...")
opt = RMSprop(lr=0.001)
model=AlexNet.build(500,500,3,102)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 
print("[INFO] training head...")

model.fit_generator(
         trainGen.generator(),
         steps_per_epoch=trainGen.numImages // 8,
         validation_data=valGen.generator(),
         validation_steps=valGen.numImages // 8,
         epochs=75,
         max_queue_size=8 * 2, verbose=1)
print("[INFO] serializing model...")
model.save(config.MODEL_PATH, overwrite=True) 
trainGen.close()
valGen.close()
  

tensorflow / core / platform / cpu_feature_guard.cc:141]您的CPU支持   TensorFlow二进制文件未编译使用的指令:AVX2   2019-08-23 00:19:47.336560:我   tensorflow / core / common_runtime / gpu / gpu_device.cc:1433]找到设备0   具有属性:名称:GeForce GTX 1050 Ti主音级:6小音级:1   memoryClockRate(GHz):1.62 pciBusID:0000:01:00.0 totalMemory:4.00GiB   freeMemory:3.30GiB 2019-08-23 00:19:47.342432:I   tensorflow / core / common_runtime / gpu / gpu_device.cc:1512]添加可见   gpu设备:0 2019-08-23 00:19:47.900540:I   tensorflow / core / common_runtime / gpu / gpu_device.cc:984]设备   将StreamExecutor与强度1边缘矩阵互连:2019-08-23   00:19:47.904687:我   tensorflow / core / common_runtime / gpu / gpu_device.cc:990] 0   2019-08-23 00:19:47.907033:我   tensorflow / core / common_runtime / gpu / gpu_device.cc:1003] 0:N   2019-08-23 00:19:47.909380:我   tensorflow / core / common_runtime / gpu / gpu_device.cc:1115]已创建   TensorFlow设备(/ job:localhost /副本:0 /任务:0 /设备:GPU:0与   3007 MB内存)->物理GPU(设备:0,名称:GeForce GTX 1050 Ti,   pci总线ID:0000:01:00.0,计算能力:6.1)2019-08-23   00:19:48.550001:W tensorflow / core / framework / allocator.cc:124]   822083584的分配已超过系统内存的10%。 2019-08-23   00:19:49.089904:W tensorflow / core / framework / allocator.cc:124]   822083584的分配已超过系统内存的10%。 2019-08-23   00:19:49.629533:W tensorflow / core / framework / allocator.cc:124]   822083584的分配已超过系统内存的10%。 2019-08-23   00:19:50.067994:W tensorflow / core / framework / allocator.cc:124]   822083584的分配已超过系统内存的10%。 2019-08-23   00:19:50.523258:W tensorflow / core / framework / allocator.cc:124]   822083584的分配已超过系统内存的10%。时代1/75   2019-08-23 00:20:14.632764:我   tensorflow / stream_executor / dso_loader.cc:152]已成功打开CUDA   本地库blablas64_100.dll 2019-08-23 00:20:16.325917:W   tensorflow / core / common_runtime / bfc_allocator.cc:211]分配器   (GPU_0_bfc)内存不足,尝试分配3.14GiB。呼叫者,召集者   表示这不是失败,但可能意味着可能   如果有更多可用内存,则性能会提高。 2019-08-23   00:20:16.410374:W   tensorflow / core / common_runtime / bfc_allocator.cc:211]分配器   (GPU_0_bfc)内存不足,试图分配836.38MiB。呼叫者,召集者   表示这不是失败,但可能意味着可能   如果有更多可用内存,则性能会提高。 2019-08-23   00:20:16.650565:W   tensorflow / core / common_runtime / bfc_allocator.cc:211]分配器   (GPU_0_bfc)内存不足,试图分配429.27MiB。呼叫者,召集者   表示这不是失败,但可能意味着可能   如果有更多可用内存,则性能会提高。 2019-08-23   00:20:16.716695:W   tensorflow / core / common_runtime / bfc_allocator.cc:211]分配器   (GPU_0_bfc)内存不足,试图分配1.22GiB。呼叫者,召集者   表示这不是失败,但可能意味着可能   如果有更多可用内存,则性能会提高。 2019-08-23   00:20:16.733003:W   tensorflow / core / common_runtime / bfc_allocator.cc:211]分配器   (GPU_0_bfc)内存不足,尝试分配637.52MiB。呼叫者,召集者   表示这不是失败,但可能意味着可能   如果有更多可用内存,则性能会提高。 2019-08-23   00:20:16.782250:W   tensorflow / core / common_runtime / bfc_allocator.cc:211]分配器   (GPU_0_bfc)内存不足,尝试分配844.88MiB。呼叫者,召集者   表示这不是失败,但可能意味着可能   如果有更多可用内存,则性能会提高。 2019-08-23   00:20:16.792756:W   tensorflow / core / common_runtime / bfc_allocator.cc:211]分配器   (GPU_0_bfc)内存不足,试图分配429.27MiB。呼叫者,召集者   表示这不是失败,但可能意味着可能   如果有更多可用内存,则性能会提高。 2019-08-23   00:20:25.135977:W   tensorflow / core / common_runtime / bfc_allocator.cc:267]分配器   (GPU_0_bfc)内存不足,尝试分配784.00MiB。当前   分配摘要如下。 2019-08-23 00:20:25.143913:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(256):
  总块数:104,正在使用的块数:99。为块分配26.0KiB。   bin中使用24.8KiB。客户端请求在bin中使用452B。 2019-08-23 00:20:25.150353:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(512):
  总块数:16,正在使用的块数:14。8.0KiB分配给块。   7.0KiB正在使用bin。 5.3KiB客户端请求在bin中使用。 2019-08-23 00:20:25.160812:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(1024):   总块数:49,正在使用的块数:49。61.3KiB分配给块。   bin中使用了61.3KiB。在bin中要求使用60.1KiB客户端。 2019-08-23 00:20:25.169944:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(2048):   总块数:4,正在使用的块数:4。为块分配13.0KiB。   箱中正在使用13.0KiB。在bin中要求使用12.8KiB客户端。 2019-08-23 00:20:25.182025:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(4096):   总块数:1,正在使用的块数:0。6.3KiB分配给块。 0B在   在垃圾箱中使用。客户端请求在bin中使用0B。 2019-08-23   00:20:25.192454:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(8192):   总块数:1,正在使用的块数:0。为块分配15.0KiB。 0B在   在垃圾箱中使用。客户端请求在bin中使用0B。 2019-08-23   00:20:25.200847:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(16384):
  总块数:9,正在使用的块数:9。144.8KiB分配给块。   仓中正在使用144.8KiB。在bin中要求使用144.0KiB客户端。 2019-08-23 00:20:25.209817:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(32768):
  总块数:0,正在使用的块数:0。0B分配给块。正在使用0B   在垃圾箱中。客户端请求在bin中使用0B。 2019-08-23 00:20:25.219192:   我tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(65536):
  总块数:0,正在使用的块数:0。0B分配给块。正在使用0B   在垃圾箱中。客户端请求在bin中使用0B。 2019-08-23 00:20:25.228194:   我tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(131072):
  总块数:9,正在使用的块数:9。1.17MiB分配给块。   箱中正在使用1.17MiB。 1.16MiB客户端请求在bin中使用。 2019-08-23 00:20:25.236088:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(262144):
  总块数:0,正在使用的块数:0。0B分配给块。正在使用0B   在垃圾箱中。客户端请求在bin中使用0B。 2019-08-23 00:20:25.245435:   我tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(524288):
  总块数:0,正在使用的块数:0。0B分配给块。正在使用0B   在垃圾箱中。客户端请求在bin中使用0B。 2019-08-23 00:20:25.254114:   我tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(1048576):   总块数:8,正在使用的块数:7。12.25MiB分配给块。   Bin中使用了11.22MiB。客户端要求在Bin中使用10.91MiB。 2019-08-23 00:20:25.264209:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(2097152):
  总块数:14,正在使用的块数:14。42.09MiB分配给块。   垃圾箱中使用了42.09MiB。 42.09MiB客户端请求在bin中使用。 2019-08-23 00:20:25.273799:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(4194304):
  总块数:13,正在使用的块数:13。80.41MiB分配给块。   垃圾箱中正在使用80.41MiB。 77.91MiB客户端请求在bin中使用。 2019-08-23 00:20:25.285089:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(8388608):
  总块数:13,正在使用的块数:13。141.14MiB分配给块。   箱中正在使用141.14MiB。 136.45MiB客户端请求在bin中使用。 2019-08-23 00:20:25.298520:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(16777216):
  总块数:4,正在使用的块数:4。112.98MiB分配给块。   箱中正在使用112.98MiB。 112.98MiB客户端请求在bin中使用。 2019-08-23 00:20:25.306979:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(33554432):
  总块数:4,正在使用的块数:4。183.11MiB分配给块。   箱中正在使用183.11MiB。 183.11MiB客户端请求在bin中使用。 2019-08-23 00:20:25.315121:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(67108864):
  总块数:1,正在使用的块数:0。为块分配了82.18MiB。 0B   在垃圾箱中使用。客户端请求在bin中使用0B。 2019-08-23   00:20:25.322194:我   tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin(134217728):   总块数:0,正在使用的块数:0。0B分配给块。正在使用0B   在垃圾箱中。客户端请求在bin中使用0B。 2019-08-23 00:20:25.331550:   我tensorflow / core / common_runtime / bfc_allocator.cc:597] Bin   (268435456):总块数:3,正在使用的块数:3。2.30GiB已分配   大块。箱中正在使用2.30GiB。 2.30GiB客户端请求用于   斌2019-08-23 00:20:25.342419:我   tensorflow / core / common_runtime / bfc_allocator.cc:613] Bin for 784.00MiB   是256.00MiB,Chunk State:   tensorflow / core / common_runtime / bfc_allocator.cc:645]总和   使用中的块:2.87GiB 2019-08-23 00:20:50.049508:I   tensorflow / core / common_runtime / bfc_allocator.cc:647]统计信息:限制:
  3153697177使用中:3086482944最大使用中:
  3153574400 NumAllocs:388 MaxAllocSize:
  822083584

     

2019-08-23 00:20:50.061236:W   tensorflow / core / common_runtime / bfc_allocator.cc:271]   ****************************************************** ****************************************************** __ 2019 -08-23 00:20:50.066546:W   tensorflow / core / framework / op_kernel.cc:1401] OP_REQUIRES在以下位置失败   cwise_ops_common.cc:70:资源耗尽:分配时OOM   形状为[50176,4096]且类型为float on的张量   / job:本地主机/副本:0 /任务:0 /设备:GPU:0通过分配器GPU_0_bfc   追溯(最近一次通话):文件“ train.py”,第80行,在          max_queue_size = 8 * 2,详细== 1)文件“ C:\ Users \ aleem \ Anaconda3 \ envs \ tensorflowf \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training.py”,   在fit_generator中的第1426行       initial_epoch = initial_epoch)文件“ C:\ Users \ aleem \ Anaconda3 \ envs \ tensorflowf \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training_generator.py”,   第191行,在model_iteration中       batch_outs = batch_function(* batch_data)文件“ C:\ Users \ aleem \ Anaconda3 \ envs \ tensorflowf \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training.py”,   1191行,在train_on_batch中       输出= self._fit_function(ins)#pylint:disable =不可调用文件   “ C:\ Users \ aleem \ Anaconda3 \ envs \ tensorflowf \ lib \ site-packages \ tensorflow \ python \ keras \ backend.py”,   第3076行,在致电中       run_metadata = self.run_metadata)文件“ C:\ Users \ aleem \ Anaconda3 \ envs \ tensorflowf \ lib \ site-packages \ tensorflow \ python \ client \ session.py”,   第1439行,在致电中       run_metadata_ptr)文件“ C:\ Users \ aleem \ Anaconda3 \ envs \ tensorflowf \ lib \ site-packages \ tensorflow \ python \ framework \ errors_impl.py”,   第528行,位于退出中       c_api.TF_GetCode(self.status.status))tensorflow.python.framework.errors_impl.ResourceExhaustedError:OOM   当分配具有形状[50176,4096]的张量并在类型上浮动   / job:本地主机/副本:0 /任务:0 /设备:GPU:0通过分配器GPU_0_bfc            [[{{节点培训/ RMSprop / gradients / loss / kernel / Regularizer_5 / Square_grad / Mul_1}}]]   提示:如果您想在发生OOM时看到分配的张量列表,   将report_tensor_allocations_upon_oom添加到当前的RunOptions   分配信息。

     [[{{node ConstantFoldingCtrl/loss/activation_6_loss/broadcast_weights/assert_broadcastable/AssertGuard/Switch_0}}]]
     

提示:如果要在发生OOM时查看分配的张量列表,   将report_tensor_allocations_upon_oom添加到当前的RunOptions   分配信息。

1 个答案:

答案 0 :(得分:1)

这是因为不能免费分配GPU内存进行训练,这可能是由于内存中的数据集过载(如果不是成批分配)。但是您使用了fit_generator,因此我们可以排除掉它,因为它提供了用于训练的数据,可以在并行运行时批量生成数据。

解决方案是检查正在使用GPU的进程。如果您使用的是nvidia GPU,则可以通过nvidia-smi来检查消耗进程的GPU,否则也可以尝试PS -fA | grep python。这将向您显示哪个进程正在运行并消耗GPU。只需从PID列中获取进程ID,然后通过命令kill -9 PID终止该进程即可。重新运行训练,这次您的GPU是免费的。我遇到了同样的问题,清除GPU对我有帮助。

  • 注意-所有命令都将在终端中运行。