URL: https://linuxfr.org/users/alexg/journaux/lxc-et-opencl-c-est-possible Title: LXC et OpenCL c'est possible ! Authors: Alex G. Date: 2017年09月27日T01:54:42+02:00 License: CC By-SA Tags: lxc, opencl, ubuntu et apparmor Score: 15 Hello, juste un petit journal rapide car je suis content: j'ai réussi à faire fonctionner [[OpenCL]] dans [LXC](https://linuxcontainers.org/fr/) en [[Espace utilisateur]]. C'est pratique pour pouvoir expérimenter des librairies etc. sans casser son système ! Malheureusement je ne suis pas sur d'avoir tout noté, mais tout de même un petit récap. # Création du container # Je pars d'un LXC en Espace utilisateur. Pour cela voir [la doc officielle de lxc](https://linuxcontainers.org/fr/lxc/getting-started/), mais en résumé c'est (pour mon utilisateur nommé _alex_): * édition de `/etc/lxc/lxc-usernet` pour dire que mon utilisateur à le droit de créer une interface réseau virtuelle lxcbr0 ([man lxc-usernet](http://manpages.ubuntu.com/manpages/zesty/en/man5/lxc-usernet.5.html)) ``` alex veth lxcbr0 10 ``` * édition /etc/subuid qui dit quels uid supplémentaire mon utilisateur peut utiliser ([man subuid](http://manpages.ubuntu.com/manpages/zesty/en/man5/subuid.5.html)) ``` alex:165536:65536 ``` * édition /etc/subgid pareil pour les groupes ([man subgid](http://manpages.ubuntu.com/manpages/zesty/en/man5/subgid.5.html)) ``` alex:165536:65536 ``` * copie de la template générale de lxc dans son dossier: ```bash $ cp /etc/lxc/default.conf to ~/.config/lxc/default.conf ``` * Dans ce fichier, on ajoute des instruction de translation d'uid. **Attention c'est un point important** ! Pour que notre utilisateur ubuntu du container est accès au socket X11 de l'hôte, on va lui donner le même uid (cf. [[User identifier]]) que notre utilisateur sur l'hôte. Dans mon cas, le futur utilisateur _ubuntu_ (dans le container) aura pour uid 1000, mais mon utilisateur _alex_ a pour uid 1001. ``` # mapping uid before 1000 to 165536+ on host lxc.id_map = u 0 165536 1000 lxc.id_map = g 0 165536 1000 # mapping uid 1000 to 1001 on host lxc.id_map = u 1000 1001 1 lxc.id_map = g 1000 1001 1 # mapping uid above 1000 to 166537+ lxc.id_map = u 1001 166537 64535 lxc.id_map = g 1001 166537 64535 ``` cette configuration est une adaptation de celle proposée dans [ce billet de blog](https://stgraber.org/2014/02/09/lxc-1-0-gui-in-containers/) mais c'est également bien pratique en général, vu que l'utilisateur de l'hôte pourra ainsi voir les fichiers de l'utilisateur du container ! * enfin sur ubuntu zesty, pour des problématiques de sécurité liés à AppArmor, il me faut ajouter (toujours dans ce fichier): ``` lxc.aa_allow_incomplete = 1 ``` De là on peut créer un container LXC, par exemple: ```bash $ lxc-create -n opencl-test -t download -- -d ubuntu -r zesty -a amd64 ``` # Options spéciales # Maintenant pour que ce container puisse utiliser la carte graphique, on doit encore monter `/dev/dri`, l'accès à l'accélération graphique et `/tmp/.X11-unix` qui contient les sockets pour communiquer avec le serveur X11. (comme indiqué par [ce billet de blog cité précédemment](https://stgraber.org/2014/02/09/lxc-1-0-gui-in-containers/)). Pour cela on édite la configuration de notre container, normalement dans `~/.local/share/lxc/opencl-test/config` pour ajouter: ``` # access to resource for opencl lxc.mount.entry = /dev/dri dev/dri none bind,optional,create=dir lxc.mount.entry = /tmp/.X11-unix tmp/.X11-unix none bind,optional,create=dir ``` **Attention** ce partage du socket X11 ne fonctionne que parce-que l'on a donné à l'utilisateur _ubuntu_ le même uid que _alex_ (cf. ci-dessus). Sinon le fichier sera présent mais non accessible. On peut démarrer notre container et entrer dedans (après avoir mis un mot de passe) ```bash $ lxc-start -n opencl-test $ lxc-attach -n opencl-test passwd ubuntu $ lxc-console -n opencl-test ``` # Test # Pour tester, ayant une Intel [[Skylake]], j'ai installé [beignet](https://www.freedesktop.org/wiki/Software/Beignet/) et [clinfo](http://manpages.ubuntu.com/manpages/zesty/man1/clinfo.1.html): ```bash (opencl-test)$ sudo apt update && sudo apt upgrade (opencl-test)$ sudo apt install beignet-opencl-icd clinfo (opencl-test)$ clinfo ``` Cette dernière commande devrait vous donner les infos sur votre carte graphique. On peut également essayer une lib comme [pyopencl](https://documen.tician.de/pyopencl/): ```bash (opencl-test)$ sudo apt install build-essential libffi-dev libblas-dev liblapack-dev (opencl-test)$ sudo -H pip3 install Cython numpy (opencl-test)$ sudo -H pip3 install pyopencl ``` Et après avoir copié l'exemple de la documentation dans `test_pyopencl.py`: ```bash (opencl-test)$ PYOPENCL_CTX='0' python3 test_pyopencl.py Beignet: "unable to find good values for local_work_size[i], please provide\n" " local_work_size[] explicitly, you can find good values with\n" " trial-and-error method." [ 0. 0. 0. ..., 0. 0. 0.] 0.0 ``` Le warning n'est pas top, mais ne pose pas de problème. Le résultat égal à 0 est ce qu'on attendait. Bon j'ai essayé l'installation de [theano](http://www.deeplearning.net/software/theano/) et [gpuarray](http://deeplearning.net/software/libgpuarray/installation.html), mais pour le moment c'est pas ça (segfault lors des tests) !