Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow(Keras)和;多处理导致GPU内存不足_Python_Tensorflow_Keras_Python Multiprocessing - Fatal编程技术网

Python Tensorflow(Keras)和;多处理导致GPU内存不足

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内存的同时,是否有一种适当的

我有一个定制的数据生成器,它使用Python的多处理模块生成输入Tensorflow模型的训练数据

问题是,每当初始化一个新的DataGenerator进程时,它似乎试图初始化Tensorflow(在代码顶部导入),并为自己分配一些GPU内存

我遵守了限制每个进程对GPU内存的访问的规定,我的代码工作正常,但我只能使用GPU可用内存的三分之一

新的进程&Tensorflow代码在同一个Python文件中启动。在禁止派生进程导入Tensorflow并为自己分配一些GPU内存的同时,是否有一种适当的方法来利用多处理

下面是代码的一部分(在Windows中运行)以供澄清:

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)。特别是我