[LINUX] Erstellen Sie einen nicht privilegierten Container, der NVIDIA-GPUs in LXC verwenden kann

Dies ist nützlich, wenn verschiedene Versionen von CUDA auf einem einzelnen Computer gleichzeitig vorhanden sein sollen. Stellen Sie sicher, dass sich nvidia-smi im Container so verhält, als hätten Sie nvidia-smi unter host-seitigem Linux ausgeführt. Angenommen, Sie haben bereits einen Container in LXC erstellt und ausgeführt. (Leicht aktualisierter Artikel für nicht privilegierte Container und Ubuntu 20.04). Wenn Sie einen Container als allgemeinen Benutzer (Nicht-Root-Benutzer) [hier] erstellen möchten (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)

Wenn Sie nvidia-smi auf der Hostseite ausführen, sieht es so aus

# 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 |
+-----------------------------------------------------------------------------+

Arbeiten auf der Host-Seite

Erstellen Sie zunächst einen Ubuntu-Container mit dem Namen lxc-create -n container -t download --- d ubuntu -r focal -a amd64. Wenn sich "/ var / lib / lxc" in BTRFS befindet, können Sie "-B btrfs" hinzufügen, und die Zeit, die benötigt wird, um den Container später mit "lxc-copy -n alter Container -N neuer Container" zu duplizieren, ist dramatisch. Wird kürzer.

Verwenden Sie dann lxc-execute -n Containername- / bin / passwd, um das entsprechende Passwort für root festzulegen.

Fügen Sie die folgenden Einstellungen hinzu

/var/lib/lxc/Containername/Zur Konfiguration hinzufügen


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
#Folgendes ist nicht erforderlich, wenn es sich um einen nicht privilegierten Container handelt und wenn es sich bei dem Host-Linux um eine Distribution handelt, die CGroup2 wie Fedora 31 verwendet
#Ersetzen Sie cgroup durch cgroup2
lxc.cgroup.devices.allow = c 195:* rwm
lxc.cgroup.devices.allow = c 235:* rwm

Zum Schluss starten Sie den Container mit lxc-start -F -n Containername. Melden Sie sich als root an, wenn Sie dazu aufgefordert werden. ** Um von einem nicht privilegierten Container aus auf die NVIDIA-GPU zuzugreifen, hosten Sie den Eigentümer oder die Gruppe der Dateien unter '/ dev'above vor dem Root (normalerweise 100000) im Container mit' chown oder chgrp`. Es muss seitlich gewechselt werden **.

Arbeiten in einem Container

apt-get --no-install-recommends install software-properties-common
add-apt-repository ppa:graphics-drivers/ppa
#Die beiden oben genannten Zeilen sind für Ubuntu Focal nicht erforderlich
apt-get --no-install-recommends install nvidia-utils-440

Beachten Sie, dass das letzte "nvidia-utils-440" zu einem Fehler führt und "nvidia-smi" nur funktioniert, wenn es genau mit der NVIDIA-Treiberversion des Host-Linux identisch ist. Wenn Sie dies bisher tun und nvidia-smi im Container ausführen

# 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      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Wird sein.

Um das Host / Home im Container sichtbar zu machen

/var/lib/lxc/Containername/Zur Konfiguration hinzufügen


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

Im Fall eines nicht privilegierten Containers Mit der oben beschriebenen Methode wird der Eigentümer aller Dateien unter "/ home" zu "niemandem" und es kann nicht ordnungsgemäß darauf zugegriffen werden. Um die Unannehmlichkeiten zu beseitigen, wird beispielsweise angenommen, dass die UID der Datei, die Sie lesen und schreiben möchten, 1000 ist. Die Zeile "lxc.idmap", die die Konvertierungsmethode von UID / GID in der Containereinstellungsdatei angibt, lautet beispielsweise wie folgt. Es ist gut, umzuschreiben.

$HOME/.local/share/lxc/Containername/Konfiguration ändern


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

Durch Umschreiben wie oben werden UID 1000 und GID 1000 des Home-Verzeichnisses auf der Host-Seite auch innerhalb des Containers UID 1000 und GID 1000 zugewiesen, sodass der Benutzer mit UID 1000 die Dateien in diesem Home-Verzeichnis bearbeiten kann.

Um es für andere Hosts als Netzwerk sichtbar zu machen

Fügen Sie der Einstellungsdatei den folgenden Inhalt hinzu. Die folgenden Einstellungen können keinen Fehler verursachen, es sei denn, Sie starten "lxc-start" von root aus (der Container kann nicht privilegiert sein).

/var/lib/lxc/Containername/Zur Konfiguration hinzufügen


lxc.net.0.type = macvlan
lxc.net.0.link = enp6s0 #Dieser Name ist"ip l"Der Name der Ethernet-Schnittstelle, die in angezeigt wird
lxc.net.0.flags = up
lxc.net.0.name = eth0

Recommended Posts

Erstellen Sie einen nicht privilegierten Container, der NVIDIA-GPUs in LXC verwenden kann
Erstellen Sie einen DI-Container mit Python
Erstellen Sie mit Numpy ein leeres Array, um Zeilen für jede Schleife hinzuzufügen
So erstellen Sie eine NVIDIA Docker-Umgebung
Erstellen Sie ein Bild mit Zeichen mit Python (Japanisch)
Führen Sie eine mehrdeutige Suche nach MySQL in Django durch