কেন আমি ন্যম্পিটি আমদানি করার পরে মাল্টিপ্রসেসিং কেবল একটি একক কোর ব্যবহার করে?


127

ওএস ইস্যু হিসাবে এটি আরও বেশি গণ্য হয়েছে কিনা তা আমি নিশ্চিত নই, তবে আমি ভেবেছিলাম যে বিষয়গুলির পাইথনের শেষের দিক থেকে যদি কারও কিছু অন্তর্দৃষ্টি থাকে তবে আমি এখানে জিজ্ঞাসা করব।

আমি সিপিইউ-ভারী forলুপটি ব্যবহার করে সমান্তরাল করার চেষ্টা করেছি joblib, তবে আমি দেখতে পেয়েছি যে প্রতিটি কর্মী প্রক্রিয়া একটি আলাদা কোরকে অর্পণ করার পরিবর্তে, আমি তাদের সবার একই কোরে নির্ধারিত হয়েছি এবং কোনও কার্যকারিতা লাভ করতে পারছি না।

এখানে একটি খুব তুচ্ছ উদাহরণ ...

from joblib import Parallel,delayed
import numpy as np

def testfunc(data):
    # some very boneheaded CPU work
    for nn in xrange(1000):
        for ii in data[0,:]:
            for jj in data[1,:]:
                ii*jj

def run(niter=10):
    data = (np.random.randn(2,100) for ii in xrange(niter))
    pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
    results = pool(delayed(testfunc)(dd) for dd in data)

if __name__ == '__main__':
    run()

... এবং htopএই স্ক্রিপ্টটি চলাকালীন আমি এখানে যা দেখতে পাচ্ছি তা এখানে :

htop

আমি 4 টি কোর সহ ল্যাপটপে উবুন্টু 12.10 (3.5.0-26) চালাচ্ছি। স্পষ্টতই joblib.Parallelবিভিন্ন শ্রমিকদের জন্য পৃথক প্রক্রিয়া তৈরি করা হচ্ছে, তবে কি কোনও উপায় আছে যে আমি এই প্রক্রিয়াগুলি বিভিন্ন কোরে কার্যকর করতে পারি?


stackoverflow.com/questions/15168014/… - সেখানে কোনও উত্তর নেই আমি ভীত, তবে এটি একই সমস্যার মতো মনে হচ্ছে।
এনপিই



এই সমস্যাটি কি এখনও আছে? আমি পাইথন ৩.7 দিয়ে এটি পুনরায় তৈরি করার চেষ্টা করছি এবং মাল্টিপ্রসেসিং.পুল () দিয়ে নম্পি আমদানি করছি এবং এটি সমস্ত থ্রেড (যেমনটি হওয়া উচিত) ব্যবহার করছে। এটি স্থির হয়েছে তা নিশ্চিত করতে চাই।
জারেড

উত্তর:


148

আরও কিছু গুগল করার পরে আমি উত্তরটি এখানে পেয়েছি ।

এটা পরিনত হয় যে নির্দিষ্ট পাইথন মডিউল ( numpy, scipy, tables, pandas, skimage...) আমদানিতে কোর সম্বন্ধ সঙ্গে জগাখিচুড়ি। আমি যতদূর বলতে পারি, এই সমস্যাটি বিশেষত তাদের বহুবিধ ওপেনবিএলএএস লাইব্রেরির সাথে সংযোগ স্থাপনের কারণে ঘটেছে বলে মনে হচ্ছে।

একটি workaround হ'ল টাস্ক অ্যাফিনিটি ব্যবহার করে পুনরায় সেট করা

os.system("taskset -p 0xff %d" % os.getpid())

এই লাইনটি মডিউল আমদানির পরে আটকানো হয়েছে, আমার উদাহরণটি এখন সমস্ত কোরে চলে:

htop_workaround

এখনও পর্যন্ত আমার অভিজ্ঞতা হয়েছে যে এটির numpyকার্য সম্পাদনে কোনও নেতিবাচক প্রভাব আছে বলে মনে হচ্ছে না , যদিও এটি সম্ভবত মেশিন- এবং কার্য-নির্দিষ্ট।

হালনাগাদ:

ওপেনবিএলএসের সিপিইউ অ্যাফিনিটি-রিসেট আচরণটি অক্ষম করার দুটি উপায়ও রয়েছে। রান-টাইমে আপনি পরিবেশের পরিবর্তনশীল OPENBLAS_MAIN_FREE(বা GOTOBLAS_MAIN_FREE) ব্যবহার করতে পারেন , উদাহরণস্বরূপ

OPENBLAS_MAIN_FREE=1 python myscript.py

অথবা বিকল্প হিসাবে, আপনি যদি উত্স থেকে ওপেনবিএলএস সংকলন করে থাকেন Makefile.ruleতবে লাইনটি ধারণ করতে সম্পাদনা করে আপনি বিল্ড-টাইমে স্থায়ীভাবে অক্ষম করতে পারবেন

NO_AFFINITY=1

ধন্যবাদ, আপনার সমাধান সমস্যার সমাধান করেছে। একটি প্রশ্ন, আমার একই কোড আছে তবে বিভিন্ন মেশিনে ভিন্নভাবে চালাচ্ছি। দুটি মেশিনই উবুন্টু 12.04 এলটিএস, অজগর 2.7, তবে কেবল একটির কাছে এই সমস্যা রয়েছে। আপনি কেন কোন ধারণা আছে?
ইম্পাত

দুটি মেশিনেই ওপেনবিএলএস (ওপেনএমপিআই দিয়ে বিল্ড) রয়েছে।
আইএমপ্যাট

2
পুরানো থ্রেড, তবে অন্য কেউ যদি এই সমস্যাটি খুঁজে পান তবে আমার সঠিক সমস্যা ছিল এবং এটি সত্যই ওপেনব্ল্যাএস গ্রন্থাগারের সাথে সম্পর্কিত ছিল। দুটি সম্ভাব্য কর্মক্ষেত্র এবং কিছু সম্পর্কিত আলোচনার জন্য এখানে দেখুন ।
গ্যাব্রিয়েল

2
সিপিইউ অ্যাফিনিটি সেট করার আরেকটি উপায় ব্যবহার করাpsutil
আইওনিস ফিলিপিসিস

2
@ জেএইচজি এটি পাইথনের চেয়ে ওপেনব্ল্যাএলএসের একটি সমস্যা, সুতরাং পাইথন সংস্করণে কোনও পার্থক্য হওয়ার কোনও কারণ আমি দেখতে পাচ্ছি না
ali_m

27

পাইথন 3 এখন সরাসরি সম্পর্ক স্থাপনের পদ্ধতিগুলি প্রকাশ করে

>>> import os
>>> os.sched_getaffinity(0)
{0, 1, 2, 3}
>>> os.sched_setaffinity(0, {1, 3})
>>> os.sched_getaffinity(0)
{1, 3}
>>> x = {i for i in range(10)}
>>> x
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> os.sched_setaffinity(0, x)
>>> os.sched_getaffinity(0)
{0, 1, 2, 3}

1
ত্রুটি> অ্যাট্রিবিউটআরার: মডিউল 'ওএস'-এর কোনও' শিডিউল_জেটফিলিটি 'নেই, পাইথন 3.6
ধানের

4
লিঙ্কযুক্ত ডকুমেন্টেশন থেকে @ প্যাডি: এগুলি কেবল কয়েকটি ইউনিক্স প্ল্যাটফর্মে উপলব্ধ।
ব্ল্যাকজ্যাক 4'17

2
আমার একই সমস্যা আছে তবে আমি এই একই লাইনটি শীর্ষে ওএস.সিস্টেমে সংহত করেছি ("টাস্কসেট-পি 0xff% ডি"% ওসেটপিড ()) তবে এটি সমস্ত সিপিইউ ব্যবহার করে না
রাজেশিস

12

Python on Ubuntuএটি ইঙ্গিত দেয় যে এটি উইন্ডোজ এবং অন্যান্য ওএসে ঝামেলা ছাড়াই কাজ করছে। তাই কি?
মাস্ত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.