পান্ডাস এবং নম্প্পিতে অদ্ভুত বাগ মাল্টিথ্রেডিং সম্পর্কিত


25

নম্পির বেশিরভাগ ফাংশন ডিফল্টরূপে মাল্টিথ্রেডিং সক্ষম করবে।

উদাহরণস্বরূপ, আমি যদি একটি স্ক্রিপ্ট চালনা করি তবে আমি 8-কোর ইন্টেল সিপিইউ ওয়ার্কস্টেশনটিতে কাজ করি

import numpy as np    
x=np.random.random(1000000)
for i in range(100000):
    np.sqrt(x)

লিনাক্স topচলমান চলাকালীন 800% সিপিইউ ব্যবহার দেখায় এখানে চিত্র বর্ণনা লিখুন যার অর্থ নম্পীটি স্বয়ংক্রিয়ভাবে সনাক্ত করে যে আমার ওয়ার্কস্টেশনটিতে 8 টি কোর রয়েছে এবং np.sqrtস্বয়ংক্রিয়ভাবে সমস্ত 8 টি কোর ব্যবহারের গতি বাড়ানোর জন্য ব্যবহার করবে।

তবে আমি একটি অদ্ভুত বাগ পেয়েছি। আমি যদি স্ক্রিপ্ট চালাই

import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.random((10,10)))
df+df
x=np.random.random(1000000)
for i in range(100000):
    np.sqrt(x)

সিপিইউ ব্যবহার 100% !! এর অর্থ হ'ল যদি আপনি কোনও নিম্পী ক্রিয়াকলাপ চালানোর আগে দুটি পান্ডাস ডেটাফ্রেম যোগ করেন তবে নমপির অটো মাল্টিথ্রেডিং বৈশিষ্ট্যটি কোনও সতর্কতা ছাড়াই চলে যায়! এটি একেবারে যুক্তিসঙ্গত নয়, পান্ডাস ডেটা ফ্রেমের গণনা নম্পি থ্রেডিং সেটিংকে কেন প্রভাব ফেলবে? এটা কি বাগ? কিভাবে এই চারপাশে কাজ?এখানে চিত্র বর্ণনা লিখুন


পুনশ্চ:

আমি লিনাক্স perfসরঞ্জাম ব্যবহার করে আরও খনন করি ।

প্রথম স্ক্রিপ্ট শো চলছে

এখানে চিত্র বর্ণনা লিখুন

দ্বিতীয় স্ক্রিপ্ট শো চলাকালীন

এখানে চিত্র বর্ণনা লিখুন

সুতরাং উভয় স্ক্রিপ্ট জড়িত libmkl_vml_avx2.so, প্রথম স্ক্রিপ্ট অতিরিক্ত জড়িতlibiomp5.so যা ওপেনএমপি সম্পর্কিত বলে মনে হচ্ছে।

এবং যেহেতু ভিএমএল মানে ইনটেল ভেক্টর ম্যাথ লাইব্রেরি, সুতরাং ভিএমএল ডক অনুসারে আমার ধারণা কমপক্ষে নীচের ফাংশনগুলি সমস্ত স্বয়ংক্রিয়ভাবে মাল্টিথ্রেডেড

এখানে চিত্র বর্ণনা লিখুন


আমি নিশ্চিত না যে আমি আপনার প্রশ্নটি বুঝতে পেরেছি। তুমি কি বিস্তারিত বলতে পারো?
এএমসি

@ এএমসি আমি আমার পোস্ট আপডেট করেছি, আশা করি এটি এখন পরিষ্কার হয়ে গেছে
ইউজার 15964

আমি মনে করি এনপি, পান্ডাস, সংস্করণ, সিপিইউ, ওএস ধরণের মতো আরও তথ্যের প্রয়োজন ... আমি আমার মেশিনে পুনরুত্পাদন করতে পারি না। এটি উভয় কোডে একাধিক সিপিইউ ব্যবহার করে না।
শিকারী

@ হুঞ্জার ঠিক আছে, এখানে তথ্য রয়েছে: উবুন্টু 16.04.5 এলটিএস ন্যালি 1.17.2 পিআই 37haad9e8e_0 পান্ডাস 0.25.1 পাই 37he6710b0_0 ইন্টেল (আর) জিয়ন (আর) সিপিইউ E5-1680 ভি 4 @ 3.40GHz। পুনশ্চ. আমি অ্যানাকোন্ডা ব্যবহার করি
ব্যবহারকারীর 15964

1
আপনি দয়া করে এটি পরীক্ষা করতে পারেন:import numpy as np import pandas as pd import os os.environ["MKL_NUM_THREADS"] = '4' print(os.environ["MKL_NUM_THREADS"]) df=pd.DataFrame(np.random.random((10,10))) df+df print(os.environ["MKL_NUM_THREADS"]) a = np.random.random((20000000, 3)) b = np.random.random((3, 30)) for _ in range(10): c = np.dot(a, b)
স্টাস বুজুলুক

উত্তর:


13

পান্ডারা numexprকিছু ক্রিয়াকলাপ গণনা করতে হুডের নীচে ব্যবহার করে এবং numexprযখন তা আমদানি করা হয় তখন ভিএমএল-এর জন্য সর্বাধিক সংখ্যক থ্রেড সেট করে :

# The default for VML is 1 thread (see #39)
set_vml_num_threads(1)

এক্সপ্রেশন.পিপিতেdf+df মূল্যায়ন করা হয় এবং এটি পান্ডাস দ্বারা আমদানি হয় :

from pandas.core.computation.check import _NUMEXPR_INSTALLED

if _NUMEXPR_INSTALLED:
   import numexpr as ne

যাইহোক, Anaconda দ্বারা বন্টন এছাড়াও যেমন কাজকর্মের জন্য vml-কার্যকারিতা ব্যবহার sqrt, sin, cosইত্যাদি - এবং একবারnumexpr 1 সেট vml-থ্রেড সর্বোচ্চ সংখ্যা, numpy-ফাংশন আর ব্যবহার parallelization।

সমস্যাটি সহজেই জিডিবিতে দেখা যায় (আপনার ধীর স্ক্রিপ্ট ব্যবহার করে):

>>> gdb --args python slow.py
(gdb) b mkl_serv_domain_set_num_threads
function "mkl_serv_domain_set_num_threads" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (mkl_serv_domain_set_num_threads) pending.
(gbd) run
Thread 1 "python" hit Breakpoint 1, 0x00007fffee65cd70 in mkl_serv_domain_set_num_threads () from /home/ed/anaconda37/lib/python3.7/site-packages/numpy/../../../libmkl_intel_thread.so
(gdb) bt 
#0  0x00007fffee65cd70 in mkl_serv_domain_set_num_threads () from /home/ed/anaconda37/lib/python3.7/site-packages/numpy/../../../libmkl_intel_thread.so
#1  0x00007fffe978026c in _set_vml_num_threads(_object*, _object*) () from /home/ed/anaconda37/lib/python3.7/site-packages/numexpr/interpreter.cpython-37m-x86_64-linux-gnu.so
#2  0x00005555556cd660 in _PyMethodDef_RawFastCallKeywords () at /tmp/build/80754af9/python_1553721932202/work/Objects/call.c:694
...
(gdb) print $rdi
$1 = 1

উদাহরণস্বরূপ, আমরা দেখতে পাচ্ছি, numexprথ্রেডের সংখ্যা 1 তে সেট করে যা পরে vML-sqrt ফাংশন বলা হয়ে থাকে:

(gbd) b mkl_serv_domain_get_max_threads
Breakpoint 2 at 0x7fffee65a900
(gdb) (gdb) c
Continuing.

Thread 1 "python" hit Breakpoint 2, 0x00007fffee65a900 in mkl_serv_domain_get_max_threads () from /home/ed/anaconda37/lib/python3.7/site-packages/numpy/../../../libmkl_intel_thread.so
(gdb) bt
#0  0x00007fffee65a900 in mkl_serv_domain_get_max_threads () from /home/ed/anaconda37/lib/python3.7/site-packages/numpy/../../../libmkl_intel_thread.so
#1  0x00007ffff01fcea9 in mkl_vml_serv_threader_d_1i_1o () from /home/ed/anaconda37/lib/python3.7/site-packages/numpy/../../../libmkl_intel_thread.so
#2  0x00007fffedf78563 in vdSqrt () from /home/ed/anaconda37/lib/python3.7/site-packages/numpy/../../../libmkl_intel_lp64.so
#3  0x00007ffff5ac04ac in trivial_two_operand_loop () from /home/ed/anaconda37/lib/python3.7/site-packages/numpy/core/_multiarray_umath.cpython-37m-x86_64-linux-gnu.so

সুতরাং আমরা দেখতে পাচ্ছি যে ন্যাম্পি ভিটিএমএল এর বাস্তবায়ন vdSqrtব্যবহার mkl_vml_serv_threader_d_1i_1oকরে যা গণনা সমান্তরালভাবে করা উচিত কিনা তা স্থির করে এবং এটি থ্রেডের সংখ্যা দেখায়:

(gdb) fin
Run till exit from #0  0x00007fffee65a900 in mkl_serv_domain_get_max_threads () from /home/ed/anaconda37/lib/python3.7/site-packages/numpy/../../../libmkl_intel_thread.so
0x00007ffff01fcea9 in mkl_vml_serv_threader_d_1i_1o () from /home/ed/anaconda37/lib/python3.7/site-packages/numpy/../../../libmkl_intel_thread.so
(gdb) print $rax
$2 = 1

নিবন্ধনকর্মী %rax সর্বাধিক সংখ্যক থ্রেড রয়েছে এবং এটি 1।

এখন আমরা ভিএমএল-থ্রেডের সংখ্যা বাড়াতে ব্যবহার numexprকরতে পারি , অর্থাত:

import numpy as np
import numexpr as ne
import pandas as pd
df=pd.DataFrame(np.random.random((10,10)))
df+df

#HERE: reset number of vml-threads
ne.set_vml_num_threads(8)

x=np.random.random(1000000)
for i in range(10000):
    np.sqrt(x)     # now in parallel

এখন একাধিক কোর ব্যবহার করা হয়!


তোমাকে অনেক ধন্যবাদ! অবশেষে, একটি দুর্দান্ত উত্তর সমস্ত ব্যাখ্যা করে। শেষ পর্যন্ত, এটি numexprদৃশ্যের পিছনে।
ব্যবহারকারীর 15964

রাজি .. খনন ভাল! পরবর্তী প্রশ্ন যদিও .. কেন numexpr থ্রেড 1 গণনা করা হয়? অস্থিরতা / থ্রেড-নিরাপদ সমস্যার কারণে সম্ভবত? 8 টি গণনাটিকে পিছনে চাপানোর পরিবর্তে এটি NumPy এর থ্রেড-নিরাপদ / স্থিতিশীল সংস্করণে এগিয়ে যাওয়া নিরাপদ। সম্ভবত এটির প্রয়োজন নেই যদি সর্বশেষতম এবং সর্বশ্রেষ্ঠ NumPy এর সাথে এই পরিবর্তনশীলটি পরীক্ষা করা ভাল তবে এটি প্রযুক্তিগত দিক থেকে একটি বাগ g
অ্যান্ড্রু অ্যাট্রেইস

আপনি কটাক্ষপাত করা করতে পারেন @AndrewAtrens github.com/pydata/numexpr/issues/39 এবং github.com/pydata/numexpr/issues/355
EAD

2

নালীর দিকে তাকানো থেকে দেখে মনে হচ্ছে, মাল্টিথ্রেডিংয়ের সাথে এটি যে ফণাটি ছিল / তার বাইরে চলেছিল এবং আপনি যে সংস্করণটি ব্যবহার করছেন তার উপর নির্ভর করে আপনি যখন ne.set_vML_num_threads () টুটাচ্ছেন তখন ক্র্যাশগুলি দেখা শুরু হতে পারে বলে আশা করা যায় ..

http://numpy-discussion.10968.n7.nabble.com/ANN-NumExpr-2-7-0-Release-td47414.html

আপনার কোড উদাহরণটি দেওয়া হয়েছে যেখানে এটি মনে হয় একাধিক বাহ্যিকভাবে সিঙ্ক্রোনাস / অর্ডারযুক্ত কলগুলি এনপি.এসকিআরটি () এর সাথে সমান্তরালভাবে এগিয়ে যেতে দেয় বলে মনে হচ্ছে, এটি কীভাবে পাইথন ইন্টারপ্রেটারে এটি আটকানো হয়েছে তার চারপাশে আমার মাথা পেতে হবে। আমার ধারণা, পাইথন দোভাষী যদি কোনও বস্তুর স্ট্যাকটি পপ করেন তখন সর্বদা কেবল কেবল কোনও রেফারেন্স ফিরিয়ে দেয় এবং আপনার উদাহরণে কেবলমাত্র সেই উল্লেখগুলিকেই পিচ করে দেওয়া হয় এবং কোনওভাবেই এ্যাসাইন করা বা হেরফের করা হয় না তবে তা ঠিক হবে। তবে যদি পরবর্তী লুপ পুনরাবৃত্তিগুলি পূর্ববর্তীগুলির উপর নির্ভর করে তবে কীভাবে এগুলি নিরাপদে সমান্তরাল হতে পারে তা কম পরিষ্কার বলে মনে হয়। তর্কযুক্ত নিঃশব্দ ব্যর্থতা / ভুল ফলাফল ক্র্যাশগুলির চেয়ে খারাপ ফলাফল।


হাই, অ্যান্ড্রু অ্যাটেনস, আপনি প্রায় আছেন। এটি ne.set_vML_num_threads () এর সমস্যা। আমার ইস্যুতে আপনার উত্সর্গীকৃত সময়ের জন্য আপনাকে অনেক ধন্যবাদ।
ব্যবহারকারী 15964

হ্যাপি ট্রেইলস :)
অ্যান্ড্রু অ্যাট্রেস

0

আমি মনে করি আপনার প্রাথমিক ভিত্তি ভুল হতে পারে -

আপনি বলেছিলেন: যার অর্থ ন্যালিটি স্বয়ংক্রিয়ভাবে সনাক্ত করে যে আমার ওয়ার্কস্টেশনটিতে 8 টি কোর রয়েছে, এবং np.sqrt স্বয়ংক্রিয়ভাবে সমস্ত 8 টি কোর ব্যবহারের গতি বাড়ানোর জন্য ব্যবহার করে।

একটি একক ক্রিয়াকলাপ np.sqrt () অনুমান করতে পারে না যে এটি কীভাবে চাওয়া হবে বা আংশিকভাবে সম্পন্ন হওয়ার আগে ফিরে আসবে return পাইথনে প্যারালালিজম পদ্ধতি রয়েছে তবে কোনওটি স্বয়ংক্রিয় নয়।

এখন, এই কথাটি বলে, অজগর দোভাষী প্যারালালিজমের জন্য লুপের জন্য অনুকূলিত করতে সক্ষম হতে পারেন যা আপনি যা দেখছেন তা হতে পারে তবে আমি দৃ strongly়ভাবে সন্দেহ করি যে আপনি যদি এই লুপটি কার্যকর করার জন্য প্রাচীর-ঘড়ির সময়টি লক্ষ্য করেন তবে তা কোনও হবে না আপনি যদি 8 টি কোর বা 1 কোর ব্যবহার করছেন (আপাতদৃষ্টিতে) আলাদা হন তবে ভিন্ন।

আপডেট: আরও কিছু মন্তব্য পড়ার পরে মনে হচ্ছে আপনি যে মাল্টি-কোর আচরণটি দেখছেন তা পাইথন ইন্টারপ্রেটারের অ্যানাকোন্ডা বিতরণের সাথে সম্পর্কিত। আমি একবার দেখেছি তবে এর জন্য কোনও উত্স কোড খুঁজে পেতে অক্ষম, তবে মনে হচ্ছে পাইথন লাইসেন্স সত্ত্বাগুলিকে (অ্যানাকোন্ডা ডটকমের মতো) সংস্থাগুলির পরিবর্তনগুলি প্রকাশের প্রয়োজন ছাড়াই সংকলন এবং বিতরণ করার অনুমতি দেয়।

আমি অনুমান করি যে আপনি অ্যানাকোন্ডা লোকদের কাছে পৌঁছাতে পারবেন - আপনি যে আচরণটি দেখছেন তা বুঝতে না পেরে বুঝতে হবে / কীভাবে যদি তারা অনুবাদকের কোন পরিবর্তন করে থাকে ..

এটি সত্যই 8x দ্রুত কিনা তা দেখার জন্য / অপটিমাইজেশন ছাড়াই প্রাচীর ঘড়ির সময়ের একটি দ্রুত চেক করুন - এমনকি যদি আপনি 1 এর পরিবর্তে সমস্ত 8 টি কোরের সাথে কাজ করে থাকেন তবে ফলাফলটি 8x হয় কিনা তা জানা ভাল হবে to দ্রুত বা যদি এমন কোনও স্পিনলকস রয়েছে যা এখনও একটি একক শ্বেতকে সিরিয়াল করে চলেছে।


1
হাই, অ্যান্ড্রু অ্যাটেন্স তবে সমান্তরালকরণ পাইথন দ্বারা করা হয় না, এটি অ্যানাকোন্ডা নম্পির ব্যাকএন্ড দ্বারা সম্পন্ন হয় যা ইন্টেল এমকেএল। এবং হ্যাঁ, আমি ন্যাপিগুলিতে একটি সমস্যা খুলেছি, তারা আমাকে অ্যানাকোন্ডায় একটি সমস্যা খোলার পরামর্শ দিয়েছে, এবং আমি এটি করেছি। তবে, আমি এক সপ্তাহের জন্য এখনও অ্যানাকোন্ডা থেকে একটি উত্তর পাইনি। সুতরাং তারা কেবল আমার প্রতিবেদনটিকে উপেক্ষা করেছে ...
ব্যবহারকারীর 15964

পাইথন ইন্টারপ্রেটারের অ্যানাকোন্ডা সংস্করণ / রিলিজ নিয়ে এটি একটি সমস্যা - তাদের সংস্করণটি ওপেন্প ব্যবহার করে যেখানে মানক পাইথন রিলিজ হয় না।
অ্যান্ড্রু অ্যাটেনস

পাইথন ইন্টারপ্রেটারের অ্যানাকোন্ডা সংস্করণ / রিলিজের এটি একটি সমস্যা - তাদের সংস্করণটি ওপেনএমপি এপিএস-এর সাথে লিঙ্ক করে / ব্যবহার করে যেখানে মানক পাইথন রিলিজ ইন্টারপ্রেটারটি করে না। যখন আমি বলি ব্যবহার করি তখন আমি আক্ষরিক অর্থে ওপেনএমপি এপিআই ফাংশনগুলিকে 'হুডের নীচে' ডাকা করি। যে কোনও অন্তর্নিহিত অপ্টিমাইজেশানের মতো যেখানে আমরা উত্স কোডটি দেখতে পাচ্ছি না আমরা কেবল এটির প্রতিবেদন করতে পারি (যেমন আপনার আছে) এবং যদি সম্ভব চেষ্টা করে এটির চারপাশে কাজ করে।
অ্যান্ড্রু অ্যাটেনস

এ সম্পর্কে আরেকটি চিন্তাভাবনা .. আপনি স্পষ্টভাবে পাইথন মাল্টিথ্রেডিং গ্রন্থাগারগুলি ব্যবহার করতে আপনার অ্যাপ্লিকেশনটিকে পুনরায় কোড করতে পারেন এবং এটি আপনার জন্য দোভাষীর অপ্টিমাইজারের উপর নির্ভর না করে আমি থ্রেড পুলের কথা ভাবছি .. আপনার অ্যাপ্লিকেশনটি কতটা জটিল, তার উপর নির্ভর করে, এবং যদি থ্রেডেড প্রোগ্রামিং এ এটি আপনার প্রথম দিকে না যায় তবে এটি খুব কঠিন নাও হতে পারে .. বহনযোগ্যতার ব্যবহার বজায় রাখার জন্য অ্যানাকোন্ডা বা ওপেনম্পের সাথে সম্পর্কিত কোনও কিছু এড়ানোর চেষ্টা করা উচিত - আমার সময় না থাকায় আমি এটি আপনার কাছে ছেড়ে দেব এটি খনন করতে ... :) যাইহোক শুভ কামনা এবং আশা করি এটি আপনাকে যা দেখছে তা ডি-কুয়াশাতে সহায়তা করে। :) :)
অ্যান্ড্রু এট্রেস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.