2016-12-23 4 views
0

Ich versuche einen Weg zu finden, meinen Code zu beschleunigen.TensorFlow Parallel CPU mit Numpy

Kurz gesagt, ich habe ein trainiertes Modell, das ich benutze, um Vorhersagen zu erhalten, sie zu sortieren und einen Rang auszugeben.

def predict(feed_dict, truth): 
    # Feed dict contains about 10K candidates to obtain scores 
    pred = self.sess.run([self.mdl.predict_op], feed_dict) 
    pred = np.array(pred) 
    # With the scores, I sort them by likelihood 
    sort = np.argsort(pred)[::-1] 
    # I find the rank of the ground truth 
    rank = np.where(sort==truth)[0][0] + 1 
    return rank 

Dieser Prozess ist jedoch extrem langsam. Ich habe ungefähr 10K Testproben. Ich glaube, Session funktioniert nicht gut mit Standard-Multiprocessing-Bibliotheken in Python, während die Multi-CPU/GPU-Unterstützung nur für Tensorflow-Ops verfügbar ist.

Gibt es eine elegante Möglichkeit, dies über Multiprocessing zu beschleunigen? Oder muss ich es als Teil des Berechnungsgraphen in TF implementieren.

Vielen Dank!

+0

, welcher Teil ist zu langsam? –

+0

BTW, 'tf.nn.top_k (pred) [1]' ist das gleiche wie deine 'np.argsort' Zeile. Wenn Sie alles in TF-Graphen umwandeln, brauchen Sie kein Multiprocessing - parallele 'session.run'-Aufrufe können von verschiedenen Python-Threads im selben Prozess gestartet werden. –

+0

Das kommt langsam von der Tatsache, dass ich diese 10K + mal jedes Mal entweder auf den gültigen oder Test-Set anrufen muss. – op10no4

Antwort

3

können Sie Ganze in TensorFlow Graph übersetzen:

pred_op = tf.constant([1,2,0]) 
truth = [0, 1, 2] 
sess = tf.Session() 
sort = tf.nn.top_k(pred_op)[1] # same as np.argsort(x)[::-1] 
rank = tf.where(tf.equal(sort,truth))[0][0] + 1 
print(sess.run(rank)) # => 2 
Verwandte Themen