Я пытаюсь воспроизвести процесс Alpha Go Zero в чистом python, который включает в себя рост дерева поиска Монте-Карло через определенное количество воспроизведений из заданного состояния игры root. Чтобы сэкономить время выполнения, я сохраняю множество переменных и вычислений, которые буду использовать позже снова, чтобы не повторять процесс снова и снова. Кроме того, это проект с несколькими настраиваемыми модулями, и я импортирую библиотеки tensorflow
и numpy
.
Запуск 800 воспроизведений из одного состояния кажется нормальным в большинстве случаев, но иногда он просто останавливается: При запуске скрипта объем памяти увеличивается до 1,04 ГБ, что я подтвердил через psutils
и Windows '«Диспетчер задач». Во время воспроизведения объем памяти увеличивается только немного, примерно от 10 до 20 МБ на следующие 20 секунд или около того. Для каждого воспроизведения в терминал отправляется сообщение print
. Но в какой-то момент программа внезапно перестает print
, но по-прежнему указывает, что она запущена (ни возврата, ни ошибки). Несмотря на это, использование памяти в диспетчере задач увеличивается еще сильнее, примерно до 20 МБ в секунду, но время от времени падает случайным образом. И он будет go так всегда, пока я не остановлю процесс вручную.
Мои вопросы следующие:
- Почему сценарий python может просто перестать работать без ошибок или возвратов, несмотря на явное использование ресурсов машины (ЦП переходит с 22% до постоянных 30% во время «работы» программы, несколько ГБ ОЗУ после остановки программы, но никогда не превышают 1,1 ГБ во время выполнения как и ожидалось)?
- Это связано с моей памятью или оборудованием / программным обеспечением? У меня 8 ГБ ОЗУ с (старым) Intel i7 6-го поколения. Во время выполнения программы ни одно другое приложение не запущено, кроме моей IDE PyCharm 2020.2 с Python 3.8 (и не более чем Windows Task-Manager). Используя
psutil.virtual_memory().free
, у меня должно быть около 4 ГБ свободной виртуальной памяти для моего интерпретатора. Почему он не исчерпывает эти 4 ГБ, а просто зависает после того, как немного больше 1 ГБ? - Как я могу это обойти? Фактически для моделирования всего В игре необходимо смоделировать 800 воспроизведений для каждого хода (что в моем случае представляет собой общую продолжительность игры в 70 ходов на доске 5x5, что необходимо для выполнения 70 * 800 = 56 000 воспроизведений). Поскольку MCTS, конечно, динамически, после выполнения одного хода можно просто установить дочерний узел root на новый root и выбросить весь родительский узел, что я и сделал. Я даже мусор вручную собираю. Тем не менее, все это не помогает сделать более 20 ходов в игре.
Прошу прощения за отсутствие примеров кода, но проект довольно большой. Я думаю, что больше всего памяти используются массивы numpy
для статистики MCTS, функция ввода стека 12x5x5 для нейронной net, а также состояние игры, в котором хранится вся группа для каждой точки (поэтому группы избыточны. для легкого превышения).
Заранее спасибо!