Journal LXC et OpenCL c'est possible !

Posté par  . Licence CC By‑SA.
Étiquettes :
15
27
sept.
2017

Hello, juste un petit journal rapide car je suis content:
j'ai réussi à faire fonctionner OpenCL dans LXC
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,
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)
  alex veth lxcbr0 10
  • édition /etc/subuid qui dit quels uid supplémentaire mon utilisateur peut utiliser (man subuid)
  alex:165536:65536
  • édition /etc/subgid pareil pour les groupes (man subgid)
  alex:165536:65536
  • copie de la template générale de lxc dans son dossier:
  $ 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
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:

$ 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).

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)

$ 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
et clinfo:

(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:

(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:

(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 et gpuarray, mais pour le moment c'est pas ça (segfault lors des tests) !

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.