Я разработал детектор объектов на основе машинного обучения, который сканирует изображение с разным разрешением и извлекает элементы из «окна», которое скользит вдоль изображения.Это трудоемкий процесс, но версии изображения независимы, поэтому этот этап извлечения признаков может выполняться параллельно.Количество дополнительных изображений зависит от размеров исходного изображения, поэтому эта информация заранее недоступна.План состоит в том, чтобы использовать «многопроцессорный» пакет Python для
- Создавать только необходимые процессы в списке
- Прокручивать список для запуска каждого процесса
- ИзвлечьРезультаты каждого процесса
- Объедините результат и перейдите к следующему этапу обработки (сохраните как файл hdf5).
Следуя приведенным здесь советам: https://docs.python.org/3/library/multiprocessing.html#multiprocessing-programmingи здесь: Многопроцессорная обработка цикла for? ,
Я решил использовать метод multiprocessing.Queue ().
К сожалению, мне не удалось успешно преобразовать мой код, поэтомуЯ решил создать простой случай, который соответствует моей проблеме по духу: он работает без ошибок и дает ожидаемые результаты, но мне интересно, есть ли лучший / быстрый / более Pythonian способ сделать это. Кроме того, я ожидаю, что каждыйпроцесс выполняется параллельно, но я не уверен. Код выводит локальный идентификатор родительского процесса и идентификатор процесса, а идентификаторы родителей одинаковые (5860), но идентификаторы процессов различныразличны.Как это интерпретируется?Распределены ли процессы между моими процессорами или просто как потоки на одном процессоре?Я смотрю на свои 4 процессора через диспетчер задач Windows, и я вижу одновременный рост и падение использования.Изменение величины не очень сильно отличается и не сильно отличается от некоторых одновременных взлетов и падений, когда код не выполняется (например, когда я набираю это сообщение)
Ниже у меня есть мой код и его вывод,Будем весьма благодарны за любые отзывы о том, как улучшить код и / или прояснение того, что именно происходит.
from multiprocessing import Process,Queue
import os
import numpy as np
np.set_printoptions(precision=2) # Used when printing matrix
class myob:
def __init__(self,val,N):
self.val= val
self.N=N
def printprocessinfo(self):
print("val = {}".format(self.val))
print('parent process:', os.getppid())
print('process id:', os.getpid())
def somelongprocess_mp(self):
# Take the inverse of a random matrix of size N
A=np.random.random((self.N, self.N))
np.fill_diagonal(A,100) # dominant diags will ensure invert.
return np.linalg.inv(A) * A # Should return identity matrix
def f(q,val,N):
a=myob(val,N)
a.printprocessinfo()
q.put(a.somelongprocess_mp())
def run_multiple_processes_using_lists():
numProcesses =5 # Number of processes
q=[] # Queue List
p=[] # Process List
d=[] # Output List
val_list=list(range(0,11)) # Values
xlist=[5,30,30,30,25,30,20,20,25,30,30,20] # Matrix Sizes (Hangs on 32+)
for i in range(0,numProcesses-1):
q.append(Queue())
p.append(Process(target=f,args=(q[i],val_list[i],xlist[i])))
print("*** Queue List ***")
print(q)
print("*** Process List ***")
print(p)
print("Start All Processes ...")
for j in range(0,numProcesses-1):
pp=p[j]
pp.start()
pp.join()
print("Collecting Results")
for k in range(0,numProcesses-1):
d.append(q[k].get())
print("Verify Output")
print(d[0]) # Print the first inverted matrices from the 1st process
print("Matrix Shapes")
for l in range(0,numProcesses-1):
print(d[l].shape)
if __name__ == '__main__':
run_multiple_processes_using_lists()
Вывод здесь:
(base) C:\Python Scripts>python Example.py
*** Queue List ***
[<multiprocessing.queues.Queue object at 0x0000020CEC1B4390>, <multiprocessing.queues.Queue object at 0x0000020CECE9B080>, <multiprocessing.queues.Queue object at 0x0000020CECE9B208>, <multiprocessing.queues.Queue object at 0x0000020CECE9B390>]
*** Process List ***
[<Process(Process-1, initial)>, <Process(Process-2, initial)>, <Process(Process-3, initial)>, <Process(Process-4, initial)>]
Start All Processes ...
val = 0
parent process: 5860
process id: 1912
val = 1
parent process: 5860
process id: 11068
val = 2
parent process: 5860
process id: 8248
val = 3
parent process: 5860
process id: 7176
Collecting Results
Verify Output
[[ 1.00e+00 -6.09e-06 -5.43e-08 -6.22e-05 -1.31e-05]
[-9.43e-06 1.00e+00 -3.60e-05 -1.59e-05 -2.85e-05]
[-4.36e-06 -8.55e-05 1.00e+00 -8.99e-06 -8.67e-05]
[-1.36e-05 -1.48e-05 -1.83e-06 1.00e+00 -9.68e-05]
[-7.75e-05 -8.54e-05 -4.44e-05 -3.25e-05 1.00e+00]]
Matrix Shapes
(5, 5)
(30, 30)
(30, 30)
(30, 30)