2013-05-24 3 views
10

मैं doParallel और foreach पैकेज का उपयोग करने की कोशिश कर रहा हूं लेकिन मुझे CRANpage पर मिली मार्गदर्शिका में बूटस्ट्रैपिंग उदाहरण का उपयोग करके प्रदर्शन में कमी आ रही है।DoParallel और foreach के साथ शुरू करने का प्रयास कर रहा है लेकिन कोई सुधार

library(doParallel) 
library(foreach) 
registerDoParallel(3) 
x <- iris[which(iris[,5] != "setosa"), c(1,5)] 
trials <- 10000 
ptime <- system.time({ 
    r <- foreach(icount(trials), .combine=cbind) %dopar% { 
    ind <- sample(100, 100, replace=TRUE) 
    result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) 
    coefficients(result1) 
    } 
    })[3] 
ptime 

यह उदाहरण 56.87 देता है।

जब मैं बदल dopar सिर्फ do इसे चलाने के लिए करने के लिए क्रमिक रूप से करने के बजाय समानांतर में, यह 36.65 देता है।

यह 42.11 करने के लिए नीचे समानांतर समय हो जाता है अगर मैं registerDoParallel(6) है, लेकिन अभी भी क्रमिक रूप से की तुलना में धीमी है। registerDoParallel(8)40.31 अनुक्रमिक से भी बदतर हो जाता है।

यदि मैं trials को 100,000 तक बढ़ाता हूं तो अनुक्रमिक रन 417.16 लेता है और 3 श्रमिकों के साथ समानांतर रन 597.31 लेता है। समांतर में 6 श्रमिकों के साथ 425.85 लगता है।

मेरे प्रणाली

  • डेल Optiplex 990

  • विंडोज 7 प्रोफेशनल 64-बिट

  • 16GB राम

  • इंटेल आई-7-2600 3.6GHz है ट्रैक्टर हाइपरथ्रेडिंग के साथ कोर

क्या मैं यहां कुछ गलत कर रहा हूं? यदि मैं सबसे अधिक प्रतिस्पर्धी चीज करता हूं तो मैं सोच सकता हूं (Sys.sleep(1) के साथ कम्प्यूटेशनल कोड को प्रतिस्थापित करना) तो मुझे श्रमिकों की संख्या के मुकाबले एक वास्तविक कमी मिलती है। मैं सोच रहा हूं कि मार्गदर्शिका में उदाहरण मेरे लिए प्रदर्शन क्यों कम करता है, जबकि उनके लिए यह चीजों को बढ़ा देता है?

+6

यह लगभग एक अकसर किये गए सवाल है: आप Sys.sleep() के साथ परीक्षण करना ठीक था, और यह दिखाता है कि धागे को स्थापित करने से कंप्यूटिंग की तुलना में अधिक समय की आवश्यकता होती है। समस्या का आकार बढ़ाने की कोशिश करें, यानी नमूना (10000), और आप एक सुधार देखेंगे। हालांकि, आपकी मशीन प्रभावी रूप से केवल 4 कोर है, इसलिए 4 कोर से परे कुछ भी काम नहीं करता है। मैंने कभी भी हाइपरथ्रेडिंग (विंडोज़ के तहत, और विशेष आर संकलन के बिना) का प्रभाव कभी नहीं देखा है –

+0

@DieterMenne: इसके बारे में आपका प्रश्न पूछे जाने वाले प्रश्नोत्तरी अच्छी तरह से ली गई है। तथ्य यह है कि गाइड के उदाहरण ने मेरे माध्यम से मेरे लिए लाभ नहीं बनाया। आप सही थे कि नमूना आकार में वृद्धि से मुझे समानांतर चलने वाला एक सुधार मिलेगा। इसके अलावा, एचटी के बारे में टिप के लिए धन्यवाद। मैंने 4 बनाम 8 श्रमिकों के साथ एक परीक्षण किया और यह मूल रूप से एक ही समय था। –

उत्तर

9

मूल समस्या है कि doParallel पैकेज खोज पथ को निर्यात चर जोड़ने के लिए PSOCK समूह के कार्यकर्ताओं पर हर काम के निष्पादन के लिए कार्यान्वित attach है। यह विभिन्न स्कोपिंग मुद्दों को हल करता है, लेकिन विशेष रूप से कम अवधि के कार्यों और निर्यात किए गए डेटा की बड़ी मात्रा के साथ प्रदर्शन को नुकसान पहुंचा सकता है। यह आपके उदाहरण के साथ लिनक्स और मैक ओएस एक्स पर नहीं होता है, क्योंकि वे का उपयोग clusterApplyLB के बजाय करेंगे, लेकिन यदि आप स्पष्ट रूप से एक पीओओएसके क्लस्टर पंजीकृत करते हैं तो यह सभी प्लेटफॉर्म पर होगा।

मुझे विश्वास है कि मैं कैसे एक अलग तरह से है कि प्रदर्शन को चोट नहीं करता है में काम scoping समस्याओं को हल करने समझ गए होंगे, और मैं doParallel और doSNOW की अगली फिल्म में से समाधान प्राप्त कर क्रांति Analytics के साथ काम कर रहा हूँ , जो भी एक ही समस्या है।

आप बेडौल कार्य का उपयोग करके इस समस्या को हल कर सकते हैं:

ptime2 <- system.time({ 
    chunks <- getDoParWorkers() 
    r <- foreach(n=idiv(trials, chunks=chunks), .combine='cbind') %dopar% { 
    y <- lapply(seq_len(n), function(i) { 
     ind <- sample(100, 100, replace=TRUE) 
     result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) 
     coefficients(result1) 
    }) 
    do.call('cbind', y) 
    } 
})[3] 

इस कार्यकर्ता प्रति केवल एक ही कार्य में परिणाम है, इसलिए प्रत्येक कार्यकर्ता केवल trials/3 बार से attach कार्यान्वित एक बार, बल्कि।इसके परिणामस्वरूप कम लेकिन बड़े सॉकेट ऑपरेशंस भी होते हैं, जिन्हें अधिकांश सिस्टम पर अधिक कुशलता से किया जा सकता है, लेकिन इस मामले में, महत्वपूर्ण समस्या attach है।

+0

4 श्रमिकों के साथ इसमें 9.2 सेकंड लग गए। जब मैंने chunks = 1 किया तो 28.18 –

+0

मैं रखरखाव को ईमेल करने के लिए ईमेल करने जा रहा था लेकिन यह क्रांति Analytics है और मैं बिक्री लोगों द्वारा हिट नहीं करना चाहता हूं। –

+2

@DeanMacGregor चिंता न करें: मैंने पहले से ही उनसे संपर्क किया है, खासकर जब से मैंने पाया कि वास्तविक अंतर्निहित समस्या क्या है और मेरा मानना ​​है कि मैंने इसे ठीक कर दिया है। मैं अभी क्रांति के साथ काम कर रहा हूं ताकि इसे दोनों डूनो और डूपरेल की अगली रिलीज में तय किया जा सके। –

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

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