2015-12-22 15 views
10

में असिंक्रोनस गणना, हाल ही में मैं टेंसरफ्लो के साथ टकरा रहा हूं और मैंने बताया कि ढांचा मेरे सभी उपलब्ध कम्प्यूटेशनल संसाधनों का उपयोग करने में सक्षम नहीं है। Convolutional Neural Networks ट्यूटोरियल में वे उल्लेख है किटेंसरफ्लो

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

हालांकि वे ट्यूटोरियल में और एक whitepaper में दोनों में यह उल्लेख मैं वास्तव में एक स्थानीय मशीन पर अतुल्यकालिक समानांतर गणना करने के लिए एक रास्ता नहीं मिला। क्या यह भी संभव है? या यह टेंसरफ्लो के वितरित टू-रिलीज संस्करण का हिस्सा है। यदि यह है, तो कैसे?

+1

मेरी इच्छा है कि मैं इस प्रश्न को समझने के लिए पर्याप्त समझदार था। शुभकामनाएँ। – GojiraDeMonstah

उत्तर

26

असिंक्रोनस ग्रेडियेंट वंश को आपके ग्राफ को संशोधित किए बिना, टेंसरफ्लो के ओपन-सोर्स रिलीज़ में समर्थित है। यह करने के लिए सबसे आसान तरीका है समानांतर में कई समवर्ती चरणों निष्पादित करने के लिए है:

loss = ... 

# Any of the optimizer classes can be used here. 
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 

def train_function(): 
    # TODO: Better termination condition, e.g. using a `max_steps` counter. 
    while True: 
    sess.run(train_op) 

# Create multiple threads to run `train_function()` in parallel 
train_threads = [] 
for _ in range(NUM_CONCURRENT_STEPS): 
    train_threads.append(threading.Thread(target=train_function)) 

# Start the threads, and block on their completion. 
for t in train_threads: 
    t.start() 
for t in train_threads: 
    t.join() 

यह उदाहरण sess.run(train_op) को NUM_CONCURRENT_STEPS कॉल सेट करता है। चूंकि इन धागे के बीच कोई समन्वय नहीं है, इसलिए वे असीमित रूप से आगे बढ़ते हैं।

यह वास्तव में अधिक (वर्तमान में) तुल्यकालिक समानांतर प्रशिक्षण प्राप्त करने के लिए, क्योंकि यह सुनिश्चित करना है कि सभी प्रतिकृतियां मापदंडों का एक ही संस्करण पढ़ा है, और लोगों के अपडेट के सभी एक ही समय में दिखाई देने लगते हैं कि अतिरिक्त समन्वय की आवश्यकता चुनौतीपूर्ण । multi-GPU example for CIFAR-10 training साझा पैरामीटर के साथ प्रशिक्षण ग्राफ में "टावर" की कई प्रतियां बनाकर और अद्यतन लागू करने से पहले टावरों में ग्रेडियेंट औसत से औसत करके सिंक्रोनस अपडेट करता है।


एनबी। इस उत्तर में कोड एक ही डिवाइस पर सभी गणना करता है, जो आपके मशीन में एकाधिक GPU होने पर इष्टतम नहीं होगा। यदि आप अपने सभी जीपीयू का उपयोग करना चाहते हैं, तो multi-GPU CIFAR-10 model के उदाहरण का पालन करें, और प्रत्येक जीपीयू को पिन किए गए अपने परिचालनों के साथ कई "टावर" बनाएं। कोड मोटे तौर पर विचार करेंगे इस प्रकार है:

train_ops = [] 

for i in range(NUM_GPUS): 
    with tf.device("/gpu:%d" % i): 
    # Define a tower on GPU `i`. 
    loss = ... 

    train_ops.append(tf.train.GradientDescentOptimizer(0.01).minimize(loss)) 

def train_function(train_op): 
    # TODO: Better termination condition, e.g. using a `max_steps` counter. 
    while True: 
    sess.run(train_op) 


# Create multiple threads to run `train_function()` in parallel 
train_threads = [] 
for train_op in train_ops: 
    train_threads.append(threading.Thread(target=train_function, args=(train_op,)) 


# Start the threads, and block on their completion. 
for t in train_threads: 
    t.start() 
for t in train_threads: 
    t.join() 

नोट है कि आप इसे सुविधाजनक एक "variable scope" उपयोग करने के लिए मिल सकती है टावरों के बीच चर साझा करने की सुविधा के लिए।

+0

यह इतना आसान है कि यह वास्तव में मेरे दिमाग में नहीं आया :) बहुत बहुत धन्यवाद। –

+0

@VojtechLetal कृपया उत्तर दें – fabrizioM

+0

क्या कोई कारण है कि आपने यहां बहु-प्रोसेसिंग के बजाय पायथन थ्रेडिंग मॉड्यूल का उपयोग किया है? – darshan

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