Я не уверен, считается ли это проблемой ОС, но я подумал, что спрошу здесь, если у кого-то есть какое-то представление о вещах, связанных с Python.
Я пытался распараллелить 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
время выполнения этого скрипта:
Я запускаю Ubuntu 12.10 (3.5.0-26) на ноутбуке с 4 ядрами. Очевидно, что joblib.Parallel
для разных рабочих процессов создаются отдельные процессы, но есть ли способ заставить эти процессы выполняться на разных ядрах?
Ответы:
После еще нескольких поисков в Google я нашел здесь ответ .
Оказывается, что некоторые модули Python (
numpy
,scipy
,tables
,pandas
,skimage
...) связывайтесь с основным сродством по импорту. Насколько я могу судить, эта проблема, похоже, вызвана именно тем, что они связаны с многопоточными библиотеками OpenBLAS.Обходной путь - сбросить привязку задачи с помощью
С этой строкой, вставленной после импорта модуля, мой пример теперь работает на всех ядрах:
По моему опыту, это не оказывает никакого отрицательного влияния на
numpy
производительность, хотя это, вероятно, зависит от машины и задачи.Обновить:
Есть также два способа отключить поведение OpenBLAS по сбросу привязки ЦП. Во время выполнения вы можете использовать переменную среды
OPENBLAS_MAIN_FREE
(илиGOTOBLAS_MAIN_FREE
), напримерИли, в качестве альтернативы, если вы компилируете OpenBLAS из исходного кода, вы можете навсегда отключить его во время сборки, отредактировав,
Makefile.rule
чтобы он содержал строкуисточник
psutil
.Python 3 теперь предоставляет методы для прямой установки сродства
источник
Похоже, это обычная проблема Python в Ubuntu, и она не относится к
joblib
:Я предлагаю поэкспериментировать с CPU affinity (
taskset
).источник
Python on Ubuntu
Это означает, что он работает без проблем в Windows и других ОС. Это?