Tensorflow, OpenAI Gym, Keras-rl проблема производительности на базовом примере обучения подкрепления
Я занимаюсь подкреплением и у меня проблемы с производительностью.
Ситуация, без пользовательского кода:
- Я загрузил виртуальную машину Google Deep Learning ( https://console.cloud.google.com/marketplace/details/click-to-deploy-images/deeplearning) в Google Cloud. Это происходит со всеми установленными предварительными условиями (CUDA, cuDNN, драйверы) с видеокартой NVidia K80.
- Установил керас-рл, тренажерный зал OpenAI
- Теперь, когда я запускаю (стандартный) пример dqn_cartpole.py с visualize=False в строке 46, он использует около 20% моего графического процессора, что дает примерно 100 шагов в секунду, что примерно в 3 раза меньше, чем при использовании процессора на моем Razer Blade 15 (i7-8750H).
- Я проверил все узкие места, которые я могу себе представить, использование процессора, памяти и HD I/O все нормально.
Пожалуйста помоги!
заранее спасибо
1 ответ
Это не обязательно проблема. Использование графического процессора не является "бесплатным" с точки зрения производительности, и это не всегда быстрее, чем процессор. Поскольку не все работает на GPU (например, сама среда тренажерного зала все еще работает на CPU), вы несете "расходы на связь" (например, перемещение памяти в и из GPU). Это будет того стоить, только если вы действительно сможете эффективно использовать свой графический процессор.
Теперь графические процессоры также не обязательно быстрее, чем процессорные. Графические процессоры очень хороши для параллельного выполнения множества подобных вычислений. Это необходимо, например, для умножения матриц между большими матрицами, что действительно происходит довольно часто при обучении больших глубоких нейронных сетей. Если вам нужно только сравнительно небольшое количество вычислений, которые можно выполнять параллельно, и в большинстве случаев они содержат только последовательный код, то GPU определенно может работать медленнее, чем CPU (а упомянутый вами процессор довольно мощный).
Теперь, если я посмотрю на ту часть кода, которую вы связали, где строится нейронная сеть ( начиная со строки 22), она выглядит как довольно маленькая нейронная сеть; всего несколько слоев по 16 узлов в каждом. Это не огромная нейронная сеть, с сверточными слоями, за которыми следуют большие (например, сотни узлов) полностью соединенные слои (что, вероятно, было бы излишним для небольшой проблемы, такой как Cartpole). Поэтому неудивительно, что вы можете использовать только 20% графического процессора (он просто не может использовать больше параллельно, потому что умножаемые матрицы слишком малы), и не обязательно удивляет, что это будет медленнее, чем просто работает на процессоре либо.