Python программа останавливается без ошибок, несмотря на достаточно памяти - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь воспроизвести процесс Alpha Go Zero в чистом python, который включает в себя рост дерева поиска Монте-Карло через определенное количество воспроизведений из заданного состояния игры root. Чтобы сэкономить время выполнения, я сохраняю множество переменных и вычислений, которые буду использовать позже снова, чтобы не повторять процесс снова и снова. Кроме того, это проект с несколькими настраиваемыми модулями, и я импортирую библиотеки tensorflow и numpy.

Запуск 800 воспроизведений из одного состояния кажется нормальным в большинстве случаев, но иногда он просто останавливается: При запуске скрипта объем памяти увеличивается до 1,04 ГБ, что я подтвердил через psutils и Windows '«Диспетчер задач». Во время воспроизведения объем памяти увеличивается только немного, примерно от 10 до 20 МБ на следующие 20 секунд или около того. Для каждого воспроизведения в терминал отправляется сообщение print. Но в какой-то момент программа внезапно перестает print, но по-прежнему указывает, что она запущена (ни возврата, ни ошибки). Несмотря на это, использование памяти в диспетчере задач увеличивается еще сильнее, примерно до 20 МБ в секунду, но время от времени падает случайным образом. И он будет go так всегда, пока я не остановлю процесс вручную.

Мои вопросы следующие:

  1. Почему сценарий python может просто перестать работать без ошибок или возвратов, несмотря на явное использование ресурсов машины (ЦП переходит с 22% до постоянных 30% во время «работы» программы, несколько ГБ ОЗУ после остановки программы, но никогда не превышают 1,1 ГБ во время выполнения как и ожидалось)?
  2. Это связано с моей памятью или оборудованием / программным обеспечением? У меня 8 ГБ ОЗУ с (старым) Intel i7 6-го поколения. Во время выполнения программы ни одно другое приложение не запущено, кроме моей IDE PyCharm 2020.2 с Python 3.8 (и не более чем Windows Task-Manager). Используя psutil.virtual_memory().free, у меня должно быть около 4 ГБ свободной виртуальной памяти для моего интерпретатора. Почему он не исчерпывает эти 4 ГБ, а просто зависает после того, как немного больше 1 ГБ?
  3. Как я могу это обойти? Фактически для моделирования всего В игре необходимо смоделировать 800 воспроизведений для каждого хода (что в моем случае представляет собой общую продолжительность игры в 70 ходов на доске 5x5, что необходимо для выполнения 70 * 800 = 56 000 воспроизведений). Поскольку MCTS, конечно, динамически, после выполнения одного хода можно просто установить дочерний узел root на новый root и выбросить весь родительский узел, что я и сделал. Я даже мусор вручную собираю. Тем не менее, все это не помогает сделать более 20 ходов в игре.

Прошу прощения за отсутствие примеров кода, но проект довольно большой. Я думаю, что больше всего памяти используются массивы numpy для статистики MCTS, функция ввода стека 12x5x5 для нейронной net, а также состояние игры, в котором хранится вся группа для каждой точки (поэтому группы избыточны. для легкого превышения).

Заранее спасибо!

...