Распараллеливание поиска по дереву Монте-Карло

#python #python-3.x #parallel-processing #reinforcement-learning #monte-carlo-tree-search

#python #python-3.x #параллельная обработка #подкрепление-обучение #поиск по дереву методом Монте-Карло

Вопрос:

У меня есть реализация поиска по дереву Монте-Карло, которую мне нужно оптимизировать. Итак, я подумал о распараллеливании фазы развертывания. Как это сделать? (Есть ли пример кода). Есть ли какие-либо модули python и т.д., которые вы бы порекомендовали?

Я прошу прощения, если это неподходящее место для публикации этого.

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

1. Пакет многопроцессорной обработки — хорошее место для начала. docs.python.org/3.7/library/multiprocessing.html

2. Это интересно, спасибо! рассмотрим это.

Ответ №1:

вы не предоставили демонстрационный код, поэтому трудно полностью решить вашу проблему

 class MCTS:
    ....
    def _run_search(self):
        ...
        for node in nodes:
            node.reward = self._rollout(node) # rollout
        ...
  

И с multiprocessing помощью этого вы можете:

 from multiprocessing import Pool
class MCTS:
    ....
    def _run_search(self):
        ...
        with Pool(os.cpu_count()-2) as p:
            result = p.map(self._rollout, nodes)
        # for node in nodes:
        #    node.reward = self._rollout(node) # rollout
        ...
  

Итак, если вы можете предоставить демонстрационный код, проблема станет более понятной.

И, кстати, вы всегда можете заменить a for loop на multiprocessing вот так:

Мы видим эту ситуацию: для цикла

 # inp
data = [1,2,3,4,5]
def f(x):
    return x**2

# processing (for loop)
result = []
for i in data:
    result.append(f(i))

# out
print(result) # [1,4,9,16,25]
  

Метод 0: многопроцессорная обработка (то, что вы хотите ~)

 # inp
data = [1,2,3,4,5]
def f(x):
    return x**2

# processing (multiprocessing)
with Pool(os.cpu_count()-2) as p:
    result = p.map(f, data)

# out
print(result) # [1,4,9,16,25]
  

Метод 2: понимание списка

 # inp
data = [1,2,3,4,5]
def f(x):
    return x**2

# processing (list comprehension)
result = [f(i) for i in data]

# out
print(result) # [1,4,9,16,25]
  

Метод 3: сопоставление лямбда-выражение

 # inp
data = [1,2,3,4,5]
def f(x):
    return x**2

# processing (lambda   map)
result = map(lambda x: f(x), data)

# out
print(result) # [1,4,9,16,25]
  
  1. для цикла
  2. многопроцессорная обработка
  3. понимание списка
  4. карта лямбда-выражение

Как вы видите, for loop , multiprocessing , list comprehensive , map lambda есть четыре способа сделать одну вещь пакетно