Параллельный Python: ограничение на число процессов на ядро

Я работаю со следующим кодом (это только часть полного кода) в параллельном Python на компьютере с двумя ядрами

import pp
from scheduling import *
from numpy import *

def sched_pp_process(B,T,D,BL,blocks,number_block,number_core):
   ppservers = ()
   job_server = pp.Server(number_core,ppservers)
   jobs = [(i, job_server.submit(local_sched,(B,T,D,blocks[i][0],blocks[i][1],i), (), ("MineLink","time","sys","gurobipy"))) for i in range(number_block)]
   for i, job in jobs:
       if job() == ():
           pass
       else:
           BL.append(job())

def block_est_list(B,T,BL,blocks,number_block,case):
    if case == 1:
        for i in range(number_block):
        blocks.append((random.randint(0,B+1),random.randint(1,T+1)))
    elif case == 2:
        for i in range(number_block):
        blocks.append((random.randint(0,B+1),random.randint(T/2+1,T+1)))

B = 4004
D = 2 
T = 4
number_block = 100

blocks = []
BL = []

block_est_list(B,T,BL,blocks,number_block,1)

sched_pp_process(B,T,D,BL,blocks,number_block,2)

local_sched Функция слишком велика, чтобы указывать ее здесь, но она решает проблему оптимизации с помощью gurobipy. Когда я указываю 2 ядра (number_core = 2) Я могу запустить только 12 процессов для каждого ядра, поэтому я могу запустить только 24 процесса, даже когда есть 100 процессов; после этого python перестает работать, даже когда в диспетчере задач Windows говорится, что python все еще работает. Когда это происходит, мне нужно остановить процесс с помощью диспетчера задач de windows, чтобы снова использовать командную строку de. Если я укажу 3 ядра, я смогу запустить 36 из 100 процессов и так далее. Насколько я знаю, этого не должно быть. кто-нибудь знает, почему это произошло?

1 ответ

Я не думаю, что это ограничение процессов на ядро, но более вероятно, что вы применяете какие-то ограничения из-за памяти (или иным образом) на каждом ядре. В зависимости от того, как настроен ваш код, pp запускает местный ppserver за работу или за ядро, а также запускает экземпляр python для каждой работы. pp может быть настроен так, что он начнет работать в режиме подкачки (ваши процессы меняются по очереди на тех, кто получает доступ к процессору, а кто на простоя), и это медленно. Встроенный балансировщик нагрузки будет пытаться разгрузить задания на другое ядро… но если у вас есть только 2, то он просто зависает.

pp помещает задания в очередь, снимает их и начинает запускать их на ppserver узлы. Если вы перегружаете ppserverПогрузится. Решение состоит в том, чтобы использовать больше ядер или настроить ppservers таким образом, вы ограничиваете количество заданий, работающих на каждом ядре. Казалось бы, ваш лимит составляет около 12.

Кстати... Вы можете также проверить ppft (вилка pp), который имеет лучшие возможности для передачи объектов кода между процессорами, работает на Python 2 или 3 и является pip устанавливаемая. Есть также pathos.pp, который обеспечивает более высокий уровень pipe а также map интерфейс поверх pp... и пытается минимизировать накладные расходы на нерест ppservers, Если вы делаете оптимизацию, где вы используете pp чтобы запустить работу, то вы можете быть заинтересованы в mystic, который может использовать pathos запускать задания по оптимизации параллельно. Некоторые из кодов имеют недавние выпуски, в то время как другие имеют выпуски, которые устарели на несколько лет. Все они находятся в процессе сокращения новых релизов. Однако общедоступная магистраль: https://github.com/uqfoundation всегда довольно стабильна. Да, я являюсь автором приведенных выше кодов, так что это тоже немного бессовестный плагин... но похоже, что они могут быть полезны для вас.

Другие вопросы по тегам