[LINUX] Créez un conteneur sans privilège pouvant utiliser des GPU NVIDIA dans LXC

Ceci est utile lorsque vous souhaitez que différentes versions de CUDA coexistent sur un seul ordinateur. Faites en sorte que nvidia-smi se comporte dans le conteneur comme si vous exécutiez nvidia-smi sur Linux côté hôte. Supposons que vous ayez déjà créé et exécuté un conteneur dans LXC. (Article légèrement mis à jour pour les conteneurs non privilégiés et Ubuntu 20.04). Si vous souhaitez créer un conteneur en tant qu'utilisateur général (utilisateur non root) [ici](https://qiita.com/kakinaguru_zo/items/8c82954a1bb0a1ef9a40#lxc%E3%81%AB%E3%82%88%E3%82%8B % E9% 9D% 9E% E7% 89% B9% E6% A8% A9% E3% 82% B3% E3% 83% B3% E3% 83% 86% E3% 83% 8A)

Lorsque vous exécutez nvidia-smi du côté hôte, cela ressemble à ceci

# nvidia-smi
Tue Feb  4 10:52:19 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.48.02    Driver Version: 440.48.02    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  Off  | 00000000:08:00.0 Off |                  N/A |
| 30%   31C    P8    25W / 250W |     18MiB / 11016MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 208...  Off  | 00000000:09:00.0 Off |                  N/A |
| 29%   32C    P8    20W / 250W |      1MiB / 11019MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1262      G   /usr/lib/xorg/Xorg                            16MiB |
+-----------------------------------------------------------------------------+

Travailler du côté hôte

Tout d'abord, créez un conteneur Ubuntu avec lxc-create -n nom de conteneur -t download --- d ubuntu -r focal -a amd64. Si / var / lib / lxc est dans BTRFS, vous pouvez ajouter -B btrfs et le temps qu'il faut pour dupliquer le conteneur plus tard avec lxc-copy -n old container -N new container est dramatique. Devient plus court.

Utilisez ensuite lxc-execute -n nom du conteneur- / bin / passwd pour définir le mot de passe approprié pour root.

Ajoutez les paramètres suivants

/var/lib/lxc/Nom du conteneur/Ajouter à la configuration


lxc.mount.entry = /dev/nvidiactl dev/nvidiactl none bind,rw,create=file 0 0
lxc.mount.entry = /dev/nvidia-modeset dev/nvidia-modeset none bind,rw,create=file,optional 0 0
lxc.mount.entry = /dev/nvidia-uvm dev/nvidia-uvm none bind,rw,create=file 0 0
lxc.mount.entry = /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,rw,create=file 0 0
lxc.mount.entry = /dev/nvidia0 dev/nvidia0 none bind,rw,create=file 0 0
lxc.mount.entry = /dev/nvidia1 dev/nvidia1 none bind,rw,create=file,optional 0 0
#Ce qui suit n'est pas nécessaire s'il s'agit d'un conteneur sans privilèges et si l'hôte Linux est une distribution qui utilise CGroup2 telle que Fedora 31
#Remplacer cgroup par cgroup2
lxc.cgroup.devices.allow = c 195:* rwm
lxc.cgroup.devices.allow = c 235:* rwm

Enfin, démarrez le conteneur avec lxc-start -F -n nom du conteneur. Connectez-vous en tant que root lorsque vous y êtes invité. ** Pour accéder au GPU NVIDIA à partir d'un conteneur non privilégié, pré-hébergez le propriétaire ou le groupe des fichiers sous «/ dev» ci-dessus à root (généralement 100000) dans le conteneur avec «chown» ou «chgrp». Il doit être changé sur le côté **.

Travailler dans un conteneur

apt-get --no-install-recommends install software-properties-common
add-apt-repository ppa:graphics-drivers/ppa
#Les deux lignes ci-dessus ne sont pas nécessaires pour Ubuntu Focal
apt-get --no-install-recommends install nvidia-utils-440

Notez que le dernier nvidia-utils-440 entraînera une erreur s'il n'est pas exactement le même que la version du pilote NVIDIA de l'hôte Linux, et nvidia-smi ne fonctionnera pas. Si vous faites jusqu'ici et exécutez nvidia-smi dans le conteneur

# nvidia-smi
Tue Feb  4 02:01:33 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.48.02    Driver Version: 440.48.02    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 208...  Off  | 00000000:08:00.0 Off |                  N/A |
| 30%   31C    P8    26W / 250W |     18MiB / 11016MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce RTX 208...  Off  | 00000000:09:00.0 Off |                  N/A |
| 29%   32C    P8    20W / 250W |      1MiB / 11019MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Sera.

Pour rendre le domicile / l'hôte visible à l'intérieur du conteneur

/var/lib/lxc/Nom du conteneur/Ajouter à la configuration


lxc.mount.entry = /home home none bind,rw 0 0

Dans le cas d'un conteneur non privilégié Avec la méthode ci-dessus, le propriétaire de tous les fichiers sous «/ home» devient «personne», et il n'est pas accessible correctement. Afin d'éliminer les inconvénients, en supposant que l'UID du fichier que vous voulez lire et écrire est 1000, la ligne de lxc.idmap qui spécifie la méthode de conversion d'UID / GID dans le fichier de configuration du conteneur est la suivante, par exemple. Il est bon de réécrire.

$HOME/.local/share/lxc/Nom du conteneur/Changer de configuration


lxc.idmap = u 0 100000 1000
lxc.idmap = g 0 100000 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 101001 64535
lxc.idmap = g 1001 101001 64535

Lorsqu'ils sont réécrits comme ci-dessus, l'UID 1000 et le GID 1000 du répertoire de base du côté hôte sont affectés à l'UID 1000 et au GID 1000 même à l'intérieur du conteneur, de sorte que l'utilisateur avec l'UID 1000 peut exploiter les fichiers dans ce répertoire de base.

Pour le rendre visible aux autres hôtes en tant que réseau

Ajoutez le contenu suivant au fichier de paramètres. Les paramètres suivants ne peuvent pas provoquer d'erreur sauf si vous démarrez lxc-start à partir de la racine (le conteneur peut être sans privilège).

/var/lib/lxc/Nom du conteneur/Ajouter à la configuration


lxc.net.0.type = macvlan
lxc.net.0.link = enp6s0 #Ce nom est"ip l"Le nom de l'interface Ethernet affiché dans
lxc.net.0.flags = up
lxc.net.0.name = eth0

Recommended Posts

Créez un conteneur sans privilège pouvant utiliser des GPU NVIDIA dans LXC
Créer un conteneur DI avec Python
Créez un tableau vide avec Numpy pour ajouter des lignes pour chaque boucle
Comment créer un environnement NVIDIA Docker
Créer une image avec des caractères avec python (japonais)
Faites une recherche ambiguë pour mysql dans Django