Python Tensorflow(Keras)和;多处理导致GPU内存不足
我有一个定制的数据生成器,它使用Python的多处理模块生成输入Tensorflow模型的训练数据 问题是,每当初始化一个新的DataGenerator进程时,它似乎试图初始化Tensorflow(在代码顶部导入),并为自己分配一些GPU内存 我遵守了限制每个进程对GPU内存的访问的规定,我的代码工作正常,但我只能使用GPU可用内存的三分之一 新的进程&Tensorflow代码在同一个Python文件中启动。在禁止派生进程导入Tensorflow并为自己分配一些GPU内存的同时,是否有一种适当的方法来利用多处理 下面是代码的一部分(在Windows中运行)以供澄清:Python Tensorflow(Keras)和;多处理导致GPU内存不足,python,tensorflow,keras,python-multiprocessing,Python,Tensorflow,Keras,Python Multiprocessing,我有一个定制的数据生成器,它使用Python的多处理模块生成输入Tensorflow模型的训练数据 问题是,每当初始化一个新的DataGenerator进程时,它似乎试图初始化Tensorflow(在代码顶部导入),并为自己分配一些GPU内存 我遵守了限制每个进程对GPU内存的访问的规定,我的代码工作正常,但我只能使用GPU可用内存的三分之一 新的进程&Tensorflow代码在同一个Python文件中启动。在禁止派生进程导入Tensorflow并为自己分配一些GPU内存的同时,是否有一种适当的
from multiprocessing import Process, Queue
from multiprocessing.pool import Pool
import cv2
import numpy as np
import tensorflow as tf
from keras.models import load_model
def TrainQueueProcess(queue):
# This Function Fills The Queue For Other Consumers
def get_model(model_path=None):
import tensorflow as tf
import keras.backend.tensorflow_backend as ktf
def get_session(gpu_fraction=0.333):
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_fraction, allow_growth=True)
return tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
ktf.set_session(get_session())
from keras import Input, Model
from keras.applications.mobilenetv2 import MobileNetV2
from keras.layers import Dense, Dropout
from keras.optimizers import adam
from keras.utils import plot_model
input_tensor = Input(shape=(128, 128, 3))
base_model = MobileNetV2(weights='imagenet', include_top=False, input_tensor=input_tensor, input_shape=(128, 128, 3), pooling='avg')
for layer in base_model.layers:
layer.trainable = True
op = Dense(128, activation='relu')(base_model.output)
op = Dropout(.25)(op)
output_tensor = Dense(2, activation='softmax')(op)
model = Model(inputs=input_tensor, outputs=output_tensor)
model.compile(optimizer=adam(lr=0.0008), loss='binary_crossentropy', metrics=['accuracy'])
return model
if __name__ == '__main__':
TRAIN_QUEUE = Queue(maxsize=10)
TRAIN_PROCESS = Process(target=TrainQueueProcess, args=(TRAIN_QUEUE))
TRAIN_PROCESS.start()
model = get_model(model_path)
如果您在windows上,请将所有
tf
和keras
导入到方法中
由于Windows缺少os.fork(),所有导入都将在新进程中再次导入(在您的示例中包括导入tf)
我在Linux上也能看到这一点(实际上是Tensorflow Docker)。特别是我