Ни Семафор, ни Пул (процессы =) не мешают моему коду использовать все ядра общей системы. - PullRequest
0 голосов
/ 24 октября 2019

У меня есть код, который загружает файл, делает некоторый анализ, строит его и затем сохраняет его в формате png. Этот процесс долгий (есть много файлов, каждый по 260 МБ), и я бы предпочел запустить его на нашей университетской машине с 48 ядрами.

Независимо от того, что я пытаюсь сделать, мой код в конечном итоге занимаетвсе ядра, их перегрузка и проблемы с ИТ-отделом.

Что я делаю не так? Я привык к тому, что некоторые библиотеки (например, AGAMA) имеют встроенную многопроцессорность и запрашивают только OMP_NUM_THREADS = N, поэтому я могу неправильно понять, как решить эту проблему. Поскольку есть одна функция, которая использует разные файлы и не зависит от смежных процессов, является ли многопроцессорный правильный выбор?

Я определил функцию, которая зависит только от одной переменной: числа, присутствующего в имени файла для загрузки.

После определения функции я впервые использовал функцию пула из многопроцессорной библиотеки и ограничил ее двумя процессами (что, как я предполагал, ограничило бы ядра). Код на секунду запускается на двух ядрах, затем обгоняет их все. Наконец, я использовал функцию семафора и установил ограничение на 4 ядра - результат тот же. Немного работает на 4 ядрах, затем захватывает все ядра.

#These are my loaded libraries
import matplotlib; matplotlib.use('agg')
import multiprocessing
import pynbody as pb
import numpy as np
from astroML.stats import binned_statistic_2d as bs2d
import matplotlib.pyplot as plt

def plot(i):
    a=loadfile(i)
    ...
    plt.savefig()
    plt.close()

if __name__ == '__main__':
    sem=multiprocessing.Semaphore(4)
    pool = multiprocessing.Pool(processes=2)
    pool.map(plot, range(328))
    pool.close()

Результаты - код работает, но за счет каждого ядра на общей машине университета. Нет сообщений об ошибках.

Я ожидаю, что код будет запускаться на указанных ядрах без внешних команд терминала, таких как taskset -cp, которые я только, как выбрать конкретные ядра, не выбирая доступные самостоятельно.

Везде, где я ищу, вопрос всегда противоположен «Как использовать 100% ядер». Мне нужно иметь возможность изменить этот параметр, чтобы не перегружать машину университета.

...