Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
6 / 6 / 3
Регистрация: 14.11.2016
Сообщений: 53

Производительность multiprocessing.Pool

25.03.2017, 01:50. Показов 1626. Ответов 0

Студворк — интернет-сервис помощи студентам
Сейчас в машинном обучении идёт соревнование за приз в 100 тысяч долларов по распознаванию рыб. Вот оттуда кусочек кода (я его немного поменял):

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def proc(n):
    pool = multiprocessing.Pool(n)
    
    #bar = progressbar.ProgressBar(max=len(train))
    distances = np.zeros((len(train), len(train)))
    #print("len=",len(train))
    for i, img in enumerate(train): #enumerate(bar(train)):
        #print("i=", i)
        all_imgs = [(img, f) for f in train]
        dists = pool.map(compare, all_imgs)
        distances[i, :] = dists
 
import time
for i in range(1,20):
    start = time.clock()
    print("Число потоков=",i)
    #print("")
    proc(i)
 
    print((time.clock() - start), "время")
Насколько я понимаю, multiprocessing.Pool позволяет включать много потоков, что даст преимущество при выполнении на многоядерных процессорах. У меня шестиядерник, но почему тогда быстрее всего код выполняется при i=1? (то есть когда задействован всего один поток) Я ожидал, что моя программа будет быстрее работать при нескольких потоках по сравнению с одним.

Число потоков= 1
1.963463 время
Число потоков= 2
2.415742 время
Число потоков= 3
2.965013000000001 время
Число потоков= 4
3.466954000000001 время
Число потоков= 5
4.2596859999999985 время
Число потоков= 6
4.298462999999998 время
Число потоков= 7
4.618592999999997 время
Число потоков= 8
4.644410000000001 время
Число потоков= 9
4.645676000000002 время
Число потоков= 10
4.758837999999997 время
Число потоков= 11
4.780180000000001 время
Число потоков= 12
4.875121 время
Число потоков= 13
5.853282 время
Число потоков= 14
5.875078000000002 время
Число потоков= 15
6.203491 время
Число потоков= 16
11.357840999999993 время
Число потоков= 17
9.881506000000002 время
Число потоков= 18
11.445920000000001 время
Число потоков= 19
10.693401999999992 время

А это более полный кусочек кода. У нас есть база с рыбами: train. Она состоит из многих файлов jpeg. Мы их загружаем, а затем начинает считать расстояние между двумя картинками. Это нам пригодится в будущем, чтобы попытаться вычислить ID каждого рыбацкого судна. Потоки мы применяем не к дисковым операциями, а к вычислению расстояние между картинками, поэтому я ожидал хоть небольшого роста скорости выполнения функции.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import pandas as pd
import numpy as np
import glob
from sklearn import cluster
from scipy.misc import imread
import cv2
import skimage.measure as sm
# import progressbar
import multiprocessing
import random
import matplotlib.pyplot as plt
import seaborn as sns
#%matplotlib inline
new_style = {'grid': False}
plt.rc('axes', **new_style)
 
# Function to show 4 images
def show_four(imgs, title):
    #select_imgs = [np.random.choice(imgs) for _ in range(4)]
    select_imgs = [imgs[np.random.choice(len(imgs))] for _ in range(4)]
    _, ax = plt.subplots(1, 4, sharex='col', sharey='row', figsize=(20, 3))
    plt.suptitle(title, size=20)
    for i, img in enumerate(select_imgs):
        ax[i].imshow(img)
 
# Function to show 8 images
def show_eight(imgs, title):
    select_imgs = [imgs[np.random.choice(len(imgs))] for _ in range(8)]
    _, ax = plt.subplots(2, 4, sharex='col', sharey='row', figsize=(20, 6))
    plt.suptitle(title, size=20)
    for i, img in enumerate(select_imgs):
        ax[i // 4, i % 4].imshow(img)
 
 
#In2
select = 50 # Only load 500 images for speed
# Data loading
train_files = sorted(glob.glob('/home/user-name/Data/Save_Fish/train/*/*.jpg'), key=lambda x: random.random())[:select]
train = np.array([imread(img) for img in train_files])
print('Length of train {}'.format(len(train)))
 
 
#In3
 
print('Sizes in train:')
shapes = np.array([str(img.shape) for img in train])
pd.Series(shapes).value_counts()
 
 
#In4
 
#for uniq in pd.Series(shapes).unique():
#    show_four(train[shapes == uniq], 'Images with shape: {}'.format(uniq))
#    plt.show()
 
 
 
#In5
 
# Function for computing distance between images
def compare(args):
    img, img2 = args
    img = (img - img.mean()) / img.std()
    img2 = (img2 - img2.mean()) / img2.std()
    return np.mean(np.abs(img - img2))
 
# Resize the images to speed it up.
train = [cv2.resize(img, (224, 224), cv2.INTER_LINEAR) for img in train]
 
# Create the distance matrix in a multithreaded fashion
 
#from multiprocessing import set_start_method, Pool
#set_start_method('forkserver')
 
# You can then start your Pool without each process
# cloning your entire memory
#pool = Pool()
#func = partial(parallelUpdateJSON, paramMatch, predictionmatrix)
#pool.map(func, data)
 
def proc(n):
    pool = multiprocessing.Pool(n)
 
    #bar = progressbar.ProgressBar(max=len(train))
    distances = np.zeros((len(train), len(train)))
    #print("len=",len(train))
    for i, img in enumerate(train): #enumerate(bar(train)):
        #print("i=", i)
        all_imgs = [(img, f) for f in train]
        dists = pool.map(compare, all_imgs)
        distances[i, :] = dists
 
import time
for i in range(1,20):
    start = time.clock()
    print("Число потоков=",i)
    #print("")
    proc(i)
 
    print((time.clock() - start), "время")
Добавлено через 35 минут
Update:

В сообщении выше результаты были получены при запуске 50 картинок.

Я запустил тест при 200 картинках. Итоги немного изменились. Программа стала выполняться быстрее при 3 потоках. Но почему не при 6? У меня же шесть ядер в процессоре. Почему один поток выполняется быстрее, чем в два?

Число потоков= 1
44.094465 секунды
Число потоков= 2
57.572348 секунды
Число потоков= 3
37.919949999999986 секунды
Число потоков= 4
50.39808500000001 секунды
Число потоков= 5
57.978549999999984 секунды
Число потоков= 6
53.041863999999975 секунды
Число потоков= 7
55.28851100000003 секунды
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.03.2017, 01:50
Ответы с готовыми решениями:

Медленный multiprocessing Pool
Да, я читал, что с параллельностью в питоне всё совсем хреново. Но тогда не понятно, зачем вообще нужен модуль multiprocessing, если в нем...

Multiprocessing: Value и Pool.map()
Есть код: from ctypes import c_int from multiprocessing import Process, Pool, Value, Lock def func(data): data.value...

Multiprocessing Queue vs multiprocessing.Manager Queue
Если кому интересно: обычная Queue из мультитпроцессинга имеет ограничение по размеру, если туда забивать объекты не считывая. а очередь из...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.03.2017, 01:50
Помогаю со студенческими работами здесь

Multiprocessing
if __name__ == '__main__': exe = 'pocketsphinx_continuous.exe -hmm zero_ru_cont_8k_v3\\zero_ru.cd_cont_4000 -dict...

Multiprocessing
В общем и целом, сбахал простейший скрипт для того, чтобы опробовать класс Process() из модуля multiprocessing. Выглядит он так: from...

Использование Multiprocessing
Кто может подсказать, как на данном участке кода задействовать мультипроцессинг ? if self.debug: ...

Multiprocessing vs multithreding
Здравствуйте! В python есть такие штуки как multithreding и multiprocessing. Но пока не нашел, где бы писали в каком случае, что лучше...

Multiprocessing в пайтоне
Я постараюсь навести пример. Есть у нас a = b = И чтоб результат программы выбивал что-то такое: Ваня - 1 Ваня - 2 Ваня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru