2013-05-01 2 views
11

Я экспериментирую с IPython.parallel и просто хочу запустить несколько команд оболочки на разных машинах.IPython.параллельно не использовать многоядерные?

У меня есть следующий ноутбук:

Cell 0:

from IPython.parallel import Client 
client = Client() 
print len(client) 
5 

И запуск команды:

Cell 1:

%%px --targets 0 --noblock 
!python server.py 

Cell 2:

%%px --targets 1 --noblock 
!python mincemeat.py 127.0.0.1 

Cell 3:

%%px --targets 2 --noblock 
!python mincemeat.py 127.0.0.1 

Что она делает это использует mincemeat реализации MapReduce. Когда я запускаю первый !python mincemeat.py 127.0.0.1, он использует примерно 100% одного ядра, а затем, когда я запускаю второй, он падает до 50%. У меня есть 4 ядра (+ виртуальные ядра) на машине и их можно использовать при запуске непосредственно с терминала, но не в ноутбуке.

Есть что-то, что мне не хватает? Я хотел бы использовать одно ядро ​​для команды !python mincemeat.py 127.0.0.1.

EDIT:
Для ясности, вот еще одна вещь, которая не использует несколько ядер:

Cell 1:

%%px --targets 0 --noblock 

a = 0 
for i in xrange(100000): 
    for j in xrange(10000): 
     a += 1 

Cell 2:

%%px --targets 0 --noblock 

a = 0 
for i in xrange(100000): 
    for j in xrange(10000): 
     a += 1 

Полагаю, что я что-то упускаю. Я считаю, что эти две ячейки должны запускать один другой сердечник, если он доступен. Однако, похоже, это не так. Опять же, использование ЦП показывает, что они используют одно и то же ядро ​​и используют 50% его. Что я сделал не так?

+0

Я не уверен, что смысл использования IPython.Параллельно здесь, когда вы только запускаете однострочные команды оболочки на одной машине за раз, но маловероятно, что IPython.parallel может помешать тому, сколько ядер использует ваши подпроцессы. Как это выглядит, если вы делаете такой же пример без IPython.parallel (так как это всего лишь три однострочных вызова оболочки)? – minrk

+0

Привет @mnirk. Без Ipython.parallel ячейки блокируют, это намного менее интересно. Чтобы прояснить ситуацию, я не хочу запускать один процесс на разных ядрах, мне бы хотелось, чтобы каждый процесс получил одно ядро. Вот почему я назначаю каждую команду другой цели. Однако кажется, что все двигатели (цель от 0 до 4) работают на одном ядре. – zermelozf

+0

Я имею в виду сделать это в трех сеансах терминала - это все, что вы делаете прямо сейчас, запустив одну команду оболочки в трех отдельных сеансах. IPython вообще не задействован. – minrk

ответ

15

Резюме обсуждения чата:

CPU affinity является механизмом для закрепления процесса для конкретного ядра процессора, и проблемы здесь в том, что иногда импортировании NumPy может в конечном итоге прижав процессы Python на CPU 0, в результат связывания с конкретными библиотеками BLAS. Вы можете открепить все ваши двигатели, запустив эту ячейку:

%%px 
import os 
import psutil 
from multiprocessing import cpu_count 

p = psutil.Process(os.getpid()) 
p.set_cpu_affinity(range(cpu_count())) 
print p.get_cpu_affinity() 

который использует multiprocessing.cpu_count, чтобы получить число процессоров, а затем связывает каждый двигатель со всеми процессорами.

Ноутбук IPython exploring the issue.

+0

См. Также этот отчет об ошибке https://github.com/ipython/IPython/вопросы/840 –

Смежные вопросы