Как поделиться объектом в многопроцессорной среде Python

Спасибо, что прочитали это. Я разработал шахматный ИИ, например, AlphaGo Lee или AlphaGo Zero. Я использовал Python и tenorflow. Шахматный AI состоит из поиска по методу Монте-Карло, сети политик и сети ценностей.

Я изучал политику и сеть ценностей для поиска по дереву Монте-Карло. Нет проблем. но каждое моделирование в поиске дерева Монте-Карло идет слишком медленно. Поэтому я хочу повысить скорость каждой симуляции.

Я знал, что Python не разделяет объект из-за GIL. Мне действительно нужно помочь в этом. Если у вас есть опыт совместного использования объектов в многопроцессорной среде Python, поделитесь, пожалуйста, своим опытом.

Я публикую сводный код ниже этой страницы.

PS: я не очень хорош в английском. Так что, если вам неудобно читать эту страницу, это моя вина. пожалуйста, поймите это.

class monte
#I want to share Tree in multiprocessing
tree = Tree()

def doMontecarloTreeSearch:
    while numberOfsimulation:
        #I want to boost speed each simulation
        # but each search() computing neural network to make new node
        # so they spend much time.
        search()

def search:
    #node is created in each selection and is added in tree
    while is_gameover():
        selection()
        evaluation()
    backpropagation()

def selection
    #add best value node in Tree
def evaluation
    #each node is evaluated for expasion
def backpropagation
    # after gameove, leaf node backpropagate gameresult
    # and patent nodes are updated util parent node is root node

0 ответов

Я пробовал нечто подобное для движка Go, и я прошу прощения за попытку сделать это с проектом Python.

я начал с ускорения работы с использованием Cython и закончил с 90% кода в стиле Cython и 10% кода с Python. Ускорение на порядки от 70х до 230х в зависимости от тестируемой части, среднее ускорение геймплея было около 110х.

после этого я начал работать с многозадачностью, но, к сожалению, некоторые части Python довольно приятные, но довольно медленные. Тем не менее, есть способы получить чистую прибыль, в зависимости от того, что вы хотите сделать.

Создание игр для самостоятельной игры
работает довольно хорошо, я создал установку, где у меня было:

  • 1 рабочий, обрабатывающий общий поток, определяющий количество рабочего потока игрового генератора, когда обучать новую модель и т. Д. И т. Д.
  • 2 рабочих, кормящих GPU с должностями для оценки
  • x рабочие играют в игры, чтобы сгенерировать данные для самостоятельной игры или оценить силу модели
  • 1 рабочий, хранящий всю игру для самостоятельной игры, которая будет использоваться для обучения
  • 1 рабочий обучает новую модель

    он был в состоянии держать GPU около 80% заняты

многопоточный плеер
Я попробовал несколько подходов с работниками, сводя к минимуму обмен данными между ними, потому что это огромное узкое место. в общем, все сводится к главному контроллеру с игровым деревом, предписывающим другим рабочим исследовать определенный узел. компактное представление на доске для передачи данных между рабочими - это главное!

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

Будущее
Я должен был сделать это снова, и Python является требованием, я хотел бы создать хорошее взаимодействие для него и интегрировать какой-то другой язык. Например, вы можете интегрировать C / C++ с Cython

Другие вопросы по тегам