मेरे पास एक प्रशिक्षित केरस मॉडल है, और मैं केवल सीपीयू के साथ भविष्यवाणियों को चलाने की कोशिश कर रहा हूं। मैं चाहता हूं कि यह जल्द से जल्द हो, इसलिए मैंने सोचा कि मैं कई कर्मचारियों के साथ predict_generator का उपयोग करूंगा। मेरे प्रेडिक्शन टेंसर का सारा डेटा पहले ही मेमोरी में लोड हो जाता है। केवल संदर्भ के लिए, सरणी टेंसर की एक सूची है, जिसमें पहले टेंसर का आकार होता है [nsamples, x, y, nchannels]। मैंने यहां (मैंने fit_generator का उपयोग करते समय भी इसका अनुसरण किया)।

class DataGeneratorPredict(keras.utils.Sequence):
    'Generates data for Keras'
    def __init__(self, array, batch_size=128):
        'Initialization'
        self.array = array
        self.nsamples = array[0].shape[0]
        self.batch_size = batch_size
        self.ninputs = len(array)
        self.indexes = np.arange(self.nsamples)

    def __len__(self):
        'Denotes the number of batches'
        print('nbatches:',int(np.floor(self.nsamples / self.batch_size)))
        return int(np.floor(self.nsamples / self.batch_size))

    def __getitem__(self, index):
        'Generate one batch of data'
        # Generate indexes of the batch
        print(index)
        inds = self.indexes[index*self.batch_size:(index+1)*self.batch_size]

        # Generate data
        X = []
        for inp in range(self.ninputs):
          X.append(self.array[inp][inds])

        return X

मैं इस तरह अपने मॉडल के साथ भविष्यवाणियां चलाता हूं,

#all_test_in is my list of input data tensors
gen = DataGeneratorPredict(all_test_in, batch_size=1024)
new_preds = conv_model.predict_generator(gen,workers=4,use_multiprocessing=True)

लेकिन मुझे conv_model.predict का उपयोग करने पर कोई गति सुधार नहीं मिलता, चाहे कर्मचारियों की संख्या कुछ भी हो। यह मेरे मॉडल को फिट करते समय अच्छी तरह से काम करता प्रतीत होता है (यानी, कई श्रमिकों के साथ जनरेटर का उपयोग करके गति प्राप्त करना)। क्या मुझे अपने जनरेटर में कुछ याद आ रहा है? क्या भविष्यवाणियों को अनुकूलित करने का एक अधिक कुशल तरीका है (GPU का उपयोग करने के अलावा)?

1
weather guy 2 अक्टूबर 2019, 16:34

1 उत्तर

जब आप केवल .predict को कॉल करते हैं, तो केरस पहले से ही सभी उपलब्ध कोर का उपयोग करने की कोशिश करता है / समानांतर में भविष्यवाणी करता है आपके द्वारा दिए गए डेटा पॉइंट। कई श्रमिकों के साथ भविष्यवाणी जनरेटर इस उदाहरण में कोई लाभ नहीं जोड़ सकता है क्योंकि प्रत्येक कार्यकर्ता को उपलब्ध कोर को निष्पादित करने या साझा करने के लिए अपनी बारी की प्रतीक्षा करने की आवश्यकता होगी। किसी भी तरह से आपको वही प्रदर्शन मिल रहा है।

यदि आपका डेटा जेनरेटर का उपयोग अधिक सामान्य है:

  • स्मृति में नहीं बैठता। आप एक समय में बैच ले सकते हैं और एक बड़ा डेटा ऐरे और कॉल प्रेडिक्ट बनाने के बजाय भविष्यवाणी कर सकते हैं।
  • फ्लाई प्रोसेसिंग की आवश्यकता होती है जो प्रति बैच बदल सकती है/यादृच्छिक हो सकती है।
  • एक NumPy सरणी में आसानी से संग्रहीत नहीं किया जा सकता है और डेटा बिंदुओं को टुकड़ा करने से परे बैचिंग का एक अलग तरीका है।
1
nuric 2 अक्टूबर 2019, 17:00
जवाब के लिए धन्यवाद। क्या आप सभी उपलब्ध कोर का उपयोग करके keras .predict पर एक लिंक प्रदान कर सकते हैं? तो क्या GPU (या अधिक CPU प्राप्त करने) के अलावा भविष्यवाणी के समय को कम करने का कोई तरीका नहीं है?
 – 
weather guy
2 अक्टूबर 2019, 23:11
यह वास्तव में केरस नहीं करता है, लेकिन टेंसरफ़्लो, यह डिफ़ॉल्ट रूप से सभी कोर का उपयोग करता है। हां, इसे तेज करने के लिए या तो GPU या अधिक CPU।
 – 
nuric
2 अक्टूबर 2019, 23:21