Rendu des environnements OpenAI Gym sur Binder et Google Colab
Remarques sur la résolution d’un problème fastidieux (mais important)
J’utilise actuellement ma quarantaine imposée par COVID-19 pour étendre mes compétences d’apprentissage en profondeur en complétant le Apprendre le renforcement profond Nanodegree de Udacity. Presque immédiatement, j’ai rencontré le problème fastidieux d’obtenir un rendu correct de mes simulations lors de la formation sur des serveurs distants.
En particulier, obtenir OpenAI Gym des environnements à restituer correctement dans des serveurs distants tels que ceux qui prennent en charge les installations de calcul gratuites populaires telles que Google Colab et Classeur s’est avéré plus difficile que je ne le pensais. Dans cet article, j’expose ma solution dans l’espoir de faire gagner du temps et des efforts aux autres pour la résoudre de manière indépendante.
Si vous souhaitez utiliser Google Colab, cette section est pour vous! Sinon, vous pouvez passer à la section suivante pour le préambule du classeur.
Installer les dépendances du système X11
Tout d’abord, vous devrez installer le nécessaire X11 dépendances, en particulier Xvfb, qui est un serveur X qui peut fonctionner sur des machines sans matériel d’affichage et sans périphériques d’entrée physiques. Vous pouvez installer des dépendances système dans votre bloc-notes Colab en ajoutant à la commande install un point d’exclamation (!
) qui exécutera la commande dans son propre shell Bash.
Installer des dépendances Python supplémentaires
Maintenant que vous avez installé Xvfb, vous devez installer un wrapper Python pyvirtualdisplay
afin d’interagir avec les affichages virtuels Xvfb depuis Python. Vous devez également installer les liaisons Python pour OpenGL: PyOpenGL et PyOpenGL-accélérer. Le premier est les liaisons Python réelles, le second est un ensemble facultatif d’extensions C (Cython) permettant l’accélération des opérations courantes dans PyOpenGL 3.x.
Installer OpenAI Gym
Ensuite, vous devez installer le package OpenAI Gym. Notez que selon l’environnement Gym que vous souhaitez utiliser, vous devrez peut-être ajouter des dépendances supplémentaires. Comme je vais simuler l’environnement LunarLander-v2 dans ma démo ci-dessous, je dois installer le box2d
supplémentaire qui permet des environnements Gym qui dépendent de la Box2D simulateur de physique.
Pour plus de simplicité, j’ai rassemblé toutes les étapes d’installation du logiciel dans un seul bloc de code que vous pouvez couper et coller dans votre ordinateur portable.
Créer un affichage virtuel en arrière-plan
Maintenant que tous les logiciels requis sont installés, vous êtes prêt à créer un affichage virtuel (c’est-à-dire un affichage qui s’exécute en arrière-plan) auquel les OpenAI Gym Envs peuvent se connecter à des fins de rendu. Vous pouvez effectivement vérifier qu’il n’y a pas d’affichage actuellement en confirmant que la valeur du DISPLAY
la variable d’environnement n’a pas encore été définie.
Le code dans la cellule ci-dessous crée un affichage virtuel en arrière-plan auquel votre Gym Envs peut se connecter pour le rendu. Vous pouvez régler size
du tampon virtuel comme vous le souhaitez, mais vous devez définir visible=False
lorsque vous travaillez avec Xvfb.
Ce code ne doit être exécuté qu’une seule fois dans votre ordinateur portable pour démarrer l’affichage.
Après avoir exécuté le code ci-dessus dans votre ordinateur portable, vous pouvez faire écho à la valeur du DISPLAY
variable d’environnement à nouveau pour confirmer que vous avez maintenant un affichage en cours d’exécution.
Pour plus de commodité, j’ai regroupé les étapes ci-dessus en deux cellules que vous pouvez copier et coller dans le haut de vos blocs-notes Google Colab.
Si vous souhaitez utiliser Classeur, alors cette section est pour vous!
Aucune installation supplémentaire requise!
Contrairement à Google Colab, avec Binder, vous pouvez créer toutes les dépendances requises (y compris les dépendances du système X11!) Dans l’image Docker sur laquelle l’instance de Binder est basée à l’aide des fichiers de configuration de Binder. Ces fichiers de configuration peuvent vivre dans le répertoire racine de votre dépôt Git ou dans un binder
sous-répertoire (mon choix préféré).
binder / apt.txt
Le premier fichier de configuration à définir est le apt.txt
fichier utilisé pour installer les dépendances du système. Vous pouvez simplement créer un fichier nommé de manière appropriée, puis répertorier les dépendances que vous souhaitez installer (une par ligne). Après un peu d’essais et d’erreurs, je suis tombé sur la combinaison gagnante suivante.
binder / environment.yml
Le deuxième fichier de configuration est le standard environment.yml
fichier utilisé pour définir un environnement Conda. Si vous n’êtes pas familier avec Conda, alors je vous suggère de consulter mes articles récents sur Débuter avec Conda et Gestion des environnements spécifiques au projet avec Conda.
binder / requirements.txt
Le dernier fichier de configuration requis est le requirements.txt
fichier utilisé par Conda pour installer les dépendances Python supplémentaires qui ne sont pas disponibles via les canaux Conda à l’aide de pip
.
Si vous souhaitez en savoir plus sur Binder, consultez la documentation de BinderHub qui est la technologie sous-jacente du projet Binder.
Créer un affichage virtuel en arrière-plan
Ensuite, vous devez créer un affichage virtuel en arrière-plan auquel les Gym Envs peuvent se connecter à des fins de rendu. Vous pouvez vérifier qu’il n’y a pas d’affichage actuellement en confirmant que la valeur du DISPLAY
la variable d’environnement n’a pas encore été définie.
Le code dans la cellule ci-dessous crée un affichage virtuel en arrière-plan auquel votre Gym Envs peut se connecter pour le rendu. Vous pouvez régler size
du tampon virtuel comme vous le souhaitez, mais vous devez définir visible=False
lorsque vous travaillez avec Xvfb.
Ce code ne doit être exécuté qu’une fois par session pour démarrer l’affichage.
Après avoir exécuté la cellule ci-dessus, vous pouvez faire écho à la valeur du DISPLAY
variable d’environnement à nouveau pour confirmer que vous avez maintenant un affichage en cours d’exécution.
Juste pour prouver que la configuration ci-dessus fonctionne comme annoncé, je lancerai une courte simulation. Je définis d’abord un Agent
qui choisit une action au hasard dans l’ensemble des actions possibles, puis définit une fonction qui peut être utilisée pour créer de tels agents. Ensuite, je termine le code pour simuler un seul épisode d’un environnement OpenAI Gym. Notez que la mise en œuvre suppose que l’environnement fourni prend en charge rgb_array
rendu (que tous les environnements Gym ne prennent pas en charge!).
Actuellement, il semble y avoir une quantité non négligeable de scintillement pendant la simulation. Je ne sais pas exactement ce qui cause ce comportement indésirable. Si vous avez une idée de comment améliorer cela, veuillez laisser un commentaire ci-dessous. Je serai sûr de mettre à jour ce message en conséquence si je trouve une bonne solution.