Как поделиться объектом в многопроцессорной среде 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