Программа многопроцессорной обработки Python, использующая только 2 из 20 ядерLinux

Ответить
Anonymous
 Программа многопроцессорной обработки Python, использующая только 2 из 20 ядер

Сообщение Anonymous »

Я новичок в многопроцессорной обработке, поэтому это может быть глупый вопрос.
Я использую Ubuntu 20.04.6 LTS (64-разрядная версия) с процессором Intel(R) Core 12-го поколения. (TM) процессор i7-12700K и 16 ГБ ОЗУ под Python 3.9.19. Когда я запускаю следующий код, команда htop показывает, что все 10 ядер используются должным образом:

Код: Выделить всё

import time

def fun(ele):
ele ** 1000

if __name__ == '__main__':
import multiprocessing

input_list = [1000] * 10000000
start_time = time.time()

pool = multiprocessing.Pool(10)
result = pool.map(func=fun, iterable=input_list)
pool.close()
pool.join()

end_time = time.time()
print(end_time - start_time)
Однако, когда я импортирую некоторые дополнительные библиотеки (например, PIL, numpy и т. д.), кажется, что работают только 2 ядра, хотя 11 процессов (Создается 1 основной процесс и 10 дочерних процессов). Вот измененный код:

Код: Выделить всё

import time
from PIL import Image
import numpy as np
import pickle
import os
import torch

def fun(ele):
ele ** 1000

if __name__ == '__main__':
import multiprocessing

input_list = [1000] * 1000000
start_time = time.time()

pool = multiprocessing.Pool(10)
result = pool.map(func=fun, iterable=input_list)
pool.close()
pool.join()

end_time = time.time()
print(end_time - start_time)
Использование команды ps aux | греп [п]итон | grep $name_of_program$ | wc -l, я подтверждаю, что 11 процессов действительно созданы (1 основной процесс и 10 дочерних процессов). Однако похоже, что эти процессы не распределяются по всем ядрам ЦП.
После установки метода запуска для создания с помощью multiprocessing.set_start_method('spawn') все 10 ядер снова работают корректно.

Код: Выделить всё

import time

from PIL import Image

import numpy as np

import time
import numpy as np
from PIL import Image

import pickle
import os

import torch

def fun(ele):
ele**1000

if __name__ == '__main__':
import multiprocessing
multiprocessing.set_start_method('spawn')
input_list = [1000]*1000000
n = 250000
start_time = time.time()
pool = multiprocessing.Pool(10)
result = pool.map(func=fun, iterable=input_list)
pool.close()
pool.join()
end_time = time.time()
print(end_time-start_time)
[*]Почему во втором случае используются только 2 ядра?
[*]Может ли эта проблема быть связана с ограничениями памяти, вызванными дополнительными библиотеками, которые я импортировал?
[*]Какие шаги я могу предпринять, чтобы в таких случаях процессы равномерно распределялись по ядрам ЦП (методом вилки)?


Подробнее здесь: https://stackoverflow.com/questions/792 ... e-20-cores
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»