Производительность OpenGL и проблемы в контейнере сингулярности при запуске openai-gym
Я нахожусь в процессе создания некоторых контейнеров особенностей OpenAI + TensorFlow для запуска разных версий CPU/Cuda и TensorFlow. Мне удалось получить версию CPU и GPU с графическим интерфейсом, работающим внутри контейнеров сингулярности, но по сравнению с простым примером проблемы в среде VirtualBox с отключенным аппаратным ускорением производительность ужасна (хотя HwAccel в VBox намного медленнее).
Проблема связана с рендерингом OpenGL среды OpenAI, потому что, если я закомментирую env.render()
В строке теста я получаю очень похожую производительность (хотя все еще быстрее в VBox, где я думал бы, что сингулярность должна быть быстрее из-за меньших накладных расходов?).
Если я запускаю тестовый скрипт в VBox с env.render()
это в среднем около ~4,3 с для запуска.
Если я запускаю его в контейнере сингулярности, он может занять от 35 до 45 секунд. Может кто-нибудь, пожалуйста, укажите мне в каком-то направлении, я слишком долго стучал головой об эту штуку! Я выключил VSync на хосте, так как думал, что он может быть ограничен, но, увы, не так.
Существует также некоторая другая форма проблемы, связанной с OpenGL, потому что иногда среда открывается и работает без помех, в других случаях я получаю Segmentation fault
а потом другие я получаю *** stack smashing detected ***
, Это происходит совершенно случайно, и я не могу на всю жизнь выяснить, что это исправляет, но пока что комбинация бега glxgears
на хосте, выйдя из системы и вернувшись в контейнер, запустив glxgears в контейнере, а иногда просто подождав пару секунд и попробовав снова, иногда удается исправить это за несколько запусков. Также добавление флага --contain помогает большую часть времени (но не все!).
О, я также получаю ошибки libGL/swrast, если не использую флаг --nv при попытке запустить версию только для процессора. Я пробовал каждую комбинацию mesa-lib, но безрезультатно! Любое понимание того, почему я не могу рендерить OpenGL в контейнере с особенностями без привязки библиотек Nvidia, было бы очень кстати:)
Процессор: i7 6700 3,4 ГГц
Графический процессор: Nvidia Quadro P400
Nvidia Драйверы: 410.73
Хост ОС: Ubuntu 18.04
Singularity
файл:
Bootstrap: docker
From: ubuntu:16.04
%post
apt -y update
apt -y upgrade
apt -y install git curl mesa-utils
apt-get -y install python3 python3-dev python3-opengl
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python3 get-pip.py
pip install pyglet matplotlib virtualenv tensorflow
%runscript
if [ "$@" = "setup" ]; then
echo "setting up..."
git clone https://github.com/openai/gym.git || true
cd gym
git pull
python3 -m virtualenv --system-site-packages ../pyenv-cpu
. ../pyenv-cpu/bin/activate
pip install -e .
pip install -e .[atari]
pip install -e .[box2d]
pip install -e .[classic_control]
else
. ./pyenv-cpu/bin/activate
python3 "$@"
fi
И мой тестовый скрипт:
from time import time
import gym
tic = time()
env = gym.make('CartPole-v0')
for i_episode in range(100):
observation = env.reset()
for t in range(5000):
env.render()
print(observation)
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
print('finished')
break
env.close()
toc = time()
print("Took: {:0.3f}".format(toc - tic))