Через год мне наконец удалось получить то, что я хотел.
1) Создайте функцию с тем, что вы хотите делать на другом процессоре. Здесь это просто вызов скрипта из bash командой !
magic ipython. Я думаю, это будет работать с функцией call()
.
def my_func(my_file):
!python pgm.py {my_file}
Не забывайте {}
при использовании !
Также обратите внимание, что путь к my_file
должен быть абсолютным, так как кластеры находятся там, где вы начали блокнот (при выполнении jupyter notebook
или ipython notebook
), а не обязательно там, где находитесь вы.
2) Запустите свой кластер ноутбуков ipython с нужным количеством ЦП. Подождите 2 секунды и выполните следующую ячейку:
from IPython import parallel
rc = parallel.Client()
view = rc.load_balanced_view()
3) Получите список файлов, которые вы хотите обработать:
files = list_of_files
4) Асинхронно сопоставьте вашу функцию со всеми вашими файлами с view
ваших только что созданных движков. (не уверен в формулировке).
r = view.map_async(my_func, files)
Пока он работает, вы можете делать что-то еще в блокноте (он работает в «фоновом режиме»!). Вы также можете вызвать r.wait_interactive()
, который интерактивно подсчитывает количество обработанных файлов, количество затраченного времени и количество оставшихся файлов. Это помешает вам запускать другие ячейки (но вы можете прервать это).
И если у вас больше файлов, чем движков, не беспокойтесь, они будут обработаны, как только движок завершит работу с 1 файлом.
Надеюсь, это поможет другим!
Этот урок может быть полезен:
http://nbviewer.ipython.org/github/minrk/IPython-parallel-tutorial/blob/master/Index.ipynb
Обратите также внимание, что у меня все еще есть IPython 2.3.1
, я не знаю, изменилось ли оно с Jupyter
.
Изменить: по-прежнему работает с Jupyter, см. здесь различия и возможные проблемы, с которыми вы можете столкнуться< /а>
Обратите внимание, что если вы используете внешние библиотеки в своей функции, вам необходимо импортировать их в разные движки с помощью:
%px import numpy as np
or
%%px
import numpy as np
import pandas as pd
То же самое с переменными и другими функциями, вам нужно поместить их в пространство имен движка:
rc[:].push(dict(
foo=foo,
bar=bar))
person
jrjc
schedule
30.07.2015