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% его. Что я сделал не так?
Ответы
Ответ 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 исследует проблему.