Распараллеливайте сериализацию с помощью pickle или cloudpickle - PullRequest
0 голосов
/ 28 мая 2020

Небольшой контекст: в Adaptive-scheduler (пакет для запуска адаптивного анализа параметров на> 30 000 ядер) сериализация занимает большую часть времени (отправка функций (+ известные данные) для выполнения на вычислительные узлы ). В PR # 44 адаптивного планировщика * я пытаюсь выполнить сериализацию в потоках, однако я не наблюдаю никакого ускорения.

Я могу воспроизвести это с помощью следующего кода

%%time
import cloudpickle
import numpy as np
from concurrent.futures import ThreadPoolExecutor

x = np.random.rand(10000, 10000)
# y = cloudpickle.dumps(x)  # <-----------  takes 0.6s
with ThreadPoolExecutor() as ex:
    ex.map(cloudpickle.dumps, 20 * [x])

что занимает 15 секунд, только 1,25x ускорение вместо 20x.

Я думаю, что это происходит из-за GIL.

Использование ProcessPoolExecutor также не дает при любом ускорении (и даже медленнее, 44 с).

Есть ли способ, которым я могу эффективно вызывать cloudpickle.dumps на разных объектах параллельно?

Примечание: та же история применима для pickle вместо cloudpickle.

...