Подтвердить что ты не робот

IPython.параллельно не использовать многоядерные?

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

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

Ячейка 0:

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

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

Ячейка 1:

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

Ячейка 2:

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

Ячейка 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:
Для ясности здесь еще одна вещь, которая не использует несколько ядер:

Ячейка 1:

%%px --targets 0 --noblock

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

Ячейка 2:

%%px --targets 0 --noblock

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

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

4b9b3361

Ответ 1

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

Приоритет процессора - это механизм привязки процесса к конкретному ядру процессора, и проблема здесь в том, что иногда импорт 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 для получения количества процессоров, а затем связывает каждый движок со всеми CPU.

Ноутбук IPython исследует проблему.