Небольшой контекст: в 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
.