Производительность OpenGL и проблемы внутри контейнера Singularity при запуске openai-gym - PullRequest
0 голосов
/ 01 ноября 2018

Я нахожусь в процессе создания некоторых контейнеров особенностей 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 ГГц

GPU: 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))
...