का उपयोग नहीं कर रहा है, मैं भविष्यवाणी मॉडल के लिए ग्रिड खोज चलाने के लिए पाइथन मल्टीप्रोसेसिंग का उपयोग करना चाहता हूं। जब मैं कोर उपयोग को देखता हूं, तो यह हमेशा केवल एक कोर का उपयोग करता प्रतीत होता है। कोई विचार क्या मैं गलत कर रहा हूँ?पायथन मल्टीप्रोसेसिंग एक से अधिक कोर
import multiprocessing
from sklearn import svm
import itertools
#first read some data
#X will be my feature Numpy 2D array
#y will be my 1D Numpy array of labels
#define the grid
C = [0.1, 1]
gamma = [0.0]
params = [C, gamma]
grid = list(itertools.product(*params))
GRID_hx = []
def worker(par, grid_list):
#define a sklearn model
clf = svm.SVC(C=g[0], gamma=g[1],probability=True,random_state=SEED)
#run a cross validation function: returns error
ll = my_cross_validation_function(X, y, model=clf, n=1, test_size=0.2)
print(par, ll)
grid_list.append((par, ll))
if __name__ == '__main__':
manager = multiprocessing.Manager()
GRID_hx = manager.list()
jobs = []
for g in grid:
p = multiprocessing.Process(target=worker, args=(g,GRID_hx))
jobs.append(p)
p.start()
p.join()
print("\n-------------------")
print("SORTED LIST")
print("-------------------")
L = sorted(GRID_hx, key=itemgetter(1))
for l in L[:5]:
print l
एक बार जब आप उसमें शामिल हो जाते हैं, तो आप ग्लोबल इंटरप्रेटर लॉक (जीआईएल) पर भी पढ़ना चाहेंगे। पाइथन एक ही समय में दो धागे पर पायथन कोड निष्पादित नहीं कर सकता है। हालांकि, पाइथन के लिए सी लाइब्रेरी के मामले में numpy की तरह, उन पुस्तकालयों * बहुत computationally गहन कार्यों के दौरान जीआईएल छोड़ने के लिए * चुना * कर सकते हैं। यदि आप कई कोर प्रभावी ढंग से उपयोग करना चाहते हैं, तो सुनिश्चित करें कि आपका अधिकांश काम उन सी पुस्तकालयों में से एक में किया जाता है जो काम करते समय जीआईएल छोड़ देता है। –
नोट: आप शायद प्रत्येक प्रक्रिया को मैन्युअल रूप से बनाने और जुड़ने के बजाय एक ['पूल'] (https://docs.python.org/3/library/multiprocessing.html#multiprocessing.pool.Pool) का उपयोग करना चाहते हैं। बस 'pool.map करें (कार्यकर्ता, args = ज़िप (ग्रिड, [GRID_hx] * लेन (ग्रिड))])' और यह स्वचालित रूप से विभिन्न प्रक्रियाओं (समानांतर में) लॉन्च करेगा और उनसे जुड़ जाएगा। – Bakuriu
@CortAmmon आप जो लिख रहे हैं वह पूरी तरह से अप्रासंगिक है। वह बहु ** प्रसंस्करण ** बहु * थ्रेडिंग * का उपयोग नहीं कर रहा है, इसलिए जीआईएल उस कोड में * किसी भी * भूमिका को सादा नहीं करता है। इसके अलावा: तथ्य यह है कि वह 'थ्रेडिंग' के बजाय 'मल्टीप्रोसेसिंग' का उपयोग कर रहा है, इसका मतलब है कि वह पहले से ही जीआईएल के बारे में जानता है। – Bakuriu