8

मैं एकाधिक थ्रेड (और tensorflow बैकएंड) का उपयोग करके विभिन्न पैरामीटर मानों के साथ कई keras मॉडल को प्रशिक्षित करने का प्रयास कर रहा हूं। मैंने कई धागे के भीतर एक ही मॉडल का उपयोग करने के कुछ उदाहरण देखे हैं, लेकिन इस विशेष मामले में, मैं विरोधाभासी ग्राफ आदि के बारे में विभिन्न त्रुटियों में भाग लेता हूं। यहां एक सरल उदाहरण है कि मैं क्या करने में सक्षम होना चाहता हूं:टेंसरफ्लो/केरास बहु-थ्रेडेड मॉडल फिटिंग

from concurrent.futures import ThreadPoolExecutor 
import numpy as np 
import tensorflow as tf 
from keras import backend as K 
from keras.layers import Dense 
from keras.models import Sequential 


sess = tf.Session() 


def example_model(size): 
    model = Sequential() 
    model.add(Dense(size, input_shape=(5,))) 
    model.add(Dense(1)) 
    model.compile(optimizer='sgd', loss='mse') 
    return model 


if __name__ == '__main__': 
    K.set_session(sess) 
    X = np.random.random((10, 5)) 
    y = np.random.random((10, 1)) 
    models = [example_model(i) for i in range(5, 10)] 

    e = ThreadPoolExecutor(4) 
    res_list = [e.submit(model.fit, X, y) for model in models] 

    for res in res_list: 
     print(res.result()) 

परिणामी त्रुटि ValueError: Tensor("Variable:0", shape=(5, 5), dtype=float32_ref) must be from the same graph as Tensor("Variable_2/read:0", shape=(), dtype=float32). है। मैंने धागे के भीतर मॉडल को शुरू करने का भी प्रयास किया है जो समान विफलता देता है।

इस बारे में जाने के सर्वोत्तम तरीके पर कोई विचार? मैं इस सटीक संरचना से बिल्कुल जुड़ा हुआ नहीं हूं, लेकिन मैं प्रक्रियाओं के बजाय कई धागे का उपयोग करने में सक्षम होना पसंद करूंगा ताकि सभी मॉडलों को एक ही जीपीयू स्मृति आवंटन के भीतर प्रशिक्षित किया जा सके।

उत्तर

4

टेन्सफोर्लो ग्राफ थ्रेडसेफ नहीं हैं (https://www.tensorflow.org/api_docs/python/tf/Graph देखें) और जब आप एक नया टेन्सफोर्लो सत्र बनाते हैं, तो डिफ़ॉल्ट रूप से यह डिफ़ॉल्ट ग्राफ का उपयोग करता है।

आप अपने समांतर कार्य में नए ग्राफ के साथ एक नया सत्र बनाकर और अपने कैमरे मॉडल का निर्माण करके इसे प्राप्त कर सकते हैं।

यहाँ कुछ कोड है कि बनाता है और समानांतर में प्रत्येक उपलब्ध GPU पर एक मॉडल फिट बैठता है:

import concurrent.futures 
import numpy as np 

import keras.backend as K 
from keras.layers import Dense 
from keras.models import Sequential 

import tensorflow as tf 
from tensorflow.python.client import device_lib 

def get_available_gpus(): 
    local_device_protos = device_lib.list_local_devices() 
    return [x.name for x in local_device_protos if x.device_type == 'GPU'] 

xdata = np.random.randn(100, 8) 
ytrue = np.random.randint(0, 2, 100) 

def fit(gpu): 
    with tf.Session(graph=tf.Graph()) as sess: 
     K.set_session(sess) 
     with tf.device(gpu): 
      model = Sequential() 
      model.add(Dense(12, input_dim=8, activation='relu')) 
      model.add(Dense(8, activation='relu')) 
      model.add(Dense(1, activation='sigmoid')) 

      model.compile(loss='binary_crossentropy', optimizer='adam') 
      model.fit(xdata, ytrue, verbose=0) 

      return model.evaluate(xdata, ytrue, verbose=0) 

gpus = get_available_gpus() 
with concurrent.futures.ThreadPoolExecutor(len(gpus)) as executor: 
    results = [x for x in executor.map(fit, gpus)] 
print('results: ', results) 
+0

यह मेरी समस्या हल, मैं दो मॉडल एक प्रक्रिया में चल रहे, यह मुझे हमेशा ValueError दिखाने: तर्क लायें एक टेंसर के रूप में व्याख्या नहीं किया जा सकता है। (टेंसर टेंसर ("इनपुट: 0", आकार = (2, 2), dtype = float32_ref) इस ग्राफ का तत्व नहीं है।) – forqzy

संबंधित मुद्दे