От распределенной обработки на нескольких ядрах до распределенной обработки на нескольких многоядерных узлах - PullRequest
1 голос
/ 05 апреля 2019

Фон

В Python я совсем недавно узнал, как ускорить последовательную процедуру с именем модуля serial_procedure.py, используя 4 ядра моего ноутбука, используя пакет multiprocessing, что дает модуль multicore_procedure.py.

Вопрос

Теперь я собираюсь использовать компьютерный кластер с 3 узлами, и каждый узел имеет 4 ядра. Как бы я ускорил multicore_procedure.py, распараллелив его на 3 * 4 ядра кластера?

Более конкретный запрос

Учитывая, что мои знания в области программирования и разработки программного обеспечения очень минимальны, я был бы признателен за несколько явных примеров сценариев на python, которые будут использоваться как с программными системами управления ресурсами slurm, так и с condor. Цель состоит в том, чтобы автоматически определить 3 * 4 = 12 доступных ядер и написать единый код.

Дополнительная информация

Примеры модулей serial_procdure.py и multicore_procedure.py представлены ниже. Обратите внимание, что на каждой итерации ell проводятся интенсивные вычисления, в результате чего получается значение, помеченное как total . Случайный абзац записывается в данное имя файла под меткой total . Параллельные процессы не должны смешивать абзацы вместе, но все процессы должны записывать в один и тот же файл.

Я пытался использовать пакет mpi4py для реализации mpi, но я, похоже, не понял его правильно, так как результирующая производительность была похожа на serial_procedure.py.

Последовательная процедура

import numpy as np
import csv
import lorem
import time

# data
high=2**10;
nsamples=2**18;
labels=np.random.randint(0,high,nsamples)

# Serial version
serial_start_time=time.time()
filename='serial.txt'
total=0
with open(filename,'w') as file:
    for ell in labels:
        # supposedly intensive computation:
        for k in range(ell):
            total=total+k; 
        w = csv.writer(file) ;
        w.writerow([total])
        w.writerow(['****'])
        w.writerow(lorem.paragraph())
        total=0;
serial_time=time.time()-serial_start_time;
print('Serial write takes '+ str(serial_time)+' seconds')
# Serial write takes 43.09408092498779 second

Многоядерная процедура

import numpy as np
import csv
import lorem
import time
from multiprocessing import Pool, Value

# data
high=2**10;
nsamples=2**18;
labels=np.random.randint(0,high,nsamples)
filename='four_cores_parallel.txt'

# supposedly intensive computation
def worker(ell):
    total=0
    for k in range(ell):
        total=total+k;
    return(total)

multicore_start_time=time.time()
pool=Pool(4);

with open(filename,'w') as file:
    for total in pool.map(worker, labels):
        w = csv.writer(file) ;
        w.writerow([total])
        w.writerow(['****'])
        w.writerow(lorem.paragraph())
multicore_time=time.time()-multicore_start_time;
print('Multicore write takes '+ str(multicore_time)+' seconds')
# Multicore write takes 20.171985149383545 seconds
...