Изменение данных в общей памяти при использовании модуля ray в Python

#python #parallel-processing #ray

#python #параллельная обработка #ray

Вопрос:

В настоящее время я пытаюсь распараллелить некоторые части Python кода с помощью ray модуля. К сожалению, ray не позволяет изменять данные в общей памяти по умолчанию (по крайней мере, в соответствии с моим пониманием). Это означает, что мне нужно будет выполнить numpy.copy() сначала, что звучит для меня очень неэффективно.

Это, вероятно, очень неэффективный пример:

 import numpy as np
import ray

@ray.remote
def mod_arr( arr ):
    arr_cp  = np.copy(arr)
    arr_cp  = np.ones(arr_cp.shape)
    return arr_cp

ray.init()
arr = np.zeros( (2,3,4) )
arr = ray.get(mod_arr.remote(arr))
 

Если я опущу np.copy() in в функции mod_arr() и попытаюсь изменить arr вместо этого, я получаю следующую ошибку

 ValueError: output array is read-only
 

Я использую ray совершенно неправильно, или это неправильный инструмент для моей цели?

Ответ №1:

Из-за GIL в Python несколько потоков не могут выполняться параллельно на Python. Поэтому весь истинный параллелизм достигается либо за пределами Python, когда модуль выпускает GIL, либо с помощью многопроцессорной обработки.

При многопроцессорной обработке эта копия памяти является обычным процессом. Не только там, но и на самом деле в чистом функциональном программировании, где аргументы функций неизменяемы, решение состоит в том, чтобы всегда копировать память, когда это необходимо. Он имеет много преимуществ в стабильности, при этом платя приемлемое снижение производительности.

По сути, рассматривайте эти функции как чистые функции.

Комментарии:

1. Спасибо за понимание, звучит разумно (но что вы на самом деле имеете в виду, говоря «рассматривать эти функции как чистые функции» ?)

2. en.wikipedia.org/wiki/Pure_function Обратите больше внимания на то, что у них нет побочных эффектов — они нигде не изменяют никаких данных. Они только создают данные.