Příspěvek

Vybudování vývojového prostředí pro hluboké učení pomocí NVIDIA Container Toolkit a Dockeru/Podmanu (1) – Instalace NVIDIA Container Toolkit a kontejnerového enginu

Tato série popisuje, jak na lokálním stroji vytvořit kontejnerové vývojové prostředí pro deep learning pomocí NVIDIA Container Toolkit a jak jej připravit pro vzdálené použití přes SSH a JupyterLab. Tento první díl se zaměřuje na instalaci NVIDIA Container Toolkit a kontejnerového enginu.

Vybudování vývojového prostředí pro hluboké učení pomocí NVIDIA Container Toolkit a Dockeru/Podmanu (1) – Instalace NVIDIA Container Toolkit a kontejnerového enginu

Přehled

V této sérii nainstalujeme NVIDIA Container Toolkit a Docker nebo Podman a na základě obrazů CUDA a cuDNN poskytovaných v repozitáři nvidia/cuda na Docker Hubu napíšeme Dockerfile, abychom vybudovali vývojové prostředí pro hluboké učení. Aby si to kdokoli mohl snadno převzít a použít, sdílím výsledný Dockerfile a obrazy přes GitHub a Docker Hub a navíc poskytuji průvodce nastavením SSH a JupyterLabu pro využití jako vzdálený server.
Série bude mít 3 články a tento, který právě čtete, je první díl.

Postup předpokládá systém s NVIDIA GPU podporující CUDA v prostředí x86_64 Linux. Na distribucích jiných než Ubuntu nebo Fedora jsem to netestoval, takže některé detaily se mohou mírně lišit.
(revize 12026.1.6.)

Složení vývojového prostředí

Srovnání s dříve napsaným průvodcem pro vytvoření ML prostředí

V tomto blogu už existuje původní průvodce vytvořením vývojového prostředí pro machine learning, ale protože došlo k řadě změn, napsal jsem tento nový článek. Rozdíly shrnuje tabulka níže.

RozdílPůvodní článek (verze 12021)Tento článek (napsáno 12024, revize 12026)
Linux distribucePrimárně UbuntuKromě Ubuntu i Fedora/RHEL/Centos,
Debian, openSUSE/SLES apod.
Způsob sestavení prostředíPřímá instalace na hostiteli
Python virtuální prostředí přes venv
Kontejnerové prostředí na bázi Dockeru
pomocí NVIDIA Container Toolkit
Virtuální prostředí a správa balíčků přes uv
Instalace NVIDIA grafického ovladačeOO
Přímá instalace
CUDA a cuDNN na hostitele
O (přes Apt)X (používají se předinstalované
obrazy od NVIDIA na Docker Hubu, není potřeba nic ručně instalovat)
PřenositelnostPři přesunu na jiný systém je nutné
znovu vybudovat celé prostředí
Protože jde o Docker, lze
kdykoli znovu buildit nový obraz z Dockerfile nebo
snadno přenést dříve používaný obraz
(kromě dodatečných volume či nastavení sítě)
Využití dalších
GPU akceleračních knihoven mimo cuDNN
XZavedení CuPy, RAPIDS, DALI
Rozhraní Jupyter NotebookuJupyter Notebook (classic)JupyterLab (Next-Generation)
Nastavení SSH serveruNení samostatně pokrytoZahrnuje základní konfiguraci SSH serveru

0. Předběžná kontrola

  • NVIDIA Container Toolkit lze používat na Linux distribucích podporujících balíčkové manažery Apt, Yum nebo Dnf, Zypper. Na odkazované stránce lze ověřit seznam podporovaných distribucí. Ve oficiální tabulce není Fedora explicitně uvedena, ale protože je (stejně jako RHEL) postavená na Red Hat Linux základu, funguje bez problémů. Pokud nejste v Linuxu zběhlí a nejste si jistí, jakou distribuci zvolit, Ubuntu LTS je obvykle nejbezpečnější volba. Snadno se používá i pro začátečníky, protože se automaticky instalují i proprietární ovladače, a protože má velkou uživatelskou základnu, většina technické dokumentace je psána právě pro Ubuntu.
    • Architekturu systému a verzi Linux distribuce zjistíte v terminálu příkazem uname -m && cat /etc/*release.
  • Nejdříve je potřeba ověřit, že GPU v systému podporuje verze CUDA a cuDNN, které chcete používat.

Pokud plánujete koupit novou GPU na deep learning, kritéria výběru jsou dobře shrnuta v následujícím článku (autor jej nepravidelně aktualizuje).

Pokud potřebujete i obecnější doporučení pro sestavu hardwaru, velmi užitečný je také článek A Full Hardware Guide to Deep Learning od stejného autora.

Pokud splňujete všechny výše uvedené podmínky, můžeme začít sestavovat pracovní prostředí.

1. Instalace NVIDIA grafického ovladače

Nejprve je potřeba nainstalovat NVIDIA grafický ovladač na hostitelský systém. Můžete si stáhnout .run instalátor z NVIDIA stránky pro stahování ovladačů, ale z hlediska správy verzí a údržby je lepší použít balíčkový manažer dané distribuce. S odkazem na oficiální dokumentaci https://docs.nvidia.com/cuda/cuda-installation-guide-linux/#driver-installation nainstalujte ovladač odpovídající vašemu prostředí.

Proprietary modul vs Open-source modul

NVIDIA linuxový ovladač se skládá z několika kernelových modulů a od ovladače verze 515 (a novějších) NVIDIA poskytuje dva typy kernelových modulů ovladače:

Proprietary ovladač je poskytován pro GPU navržené na architekturách od Maxwell po období před Blackwell; od architektury Blackwell se jeho podpora plánuje ukončit.
Naopak open-source ovladač je podporován pro architektury Turing a novější.

NVIDIA doporučuje používat open-source kernelové moduly, pokud je to možné.
Zda je vaše GPU kompatibilní s open-source ovladačem, ověříte na tomto odkazu.

V tomto článku budu předpokládat instalaci open-source ovladače.

Debian & Ubuntu

V případě Ubuntu nebo Debianu nainstalujte v terminálu následujícími příkazy:

1
2
sudo apt update
sudo apt install nvidia-open

Fedora

Pro Fedoru 40 ukážu instalaci předbuildovaných balíčků poskytovaných přes RPM Fusion.

1-Fedora-1. Nastavení RPM Fusion repozitářů

Postupujte podle oficiálního průvodce RPM Fusion.
V terminálu spusťte:

1
2
sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
sudo dnf config-manager setopt fedora-cisco-openh264.enabled=1

Ve starších verzích DNF (Fedora 40 a dříve) měl druhý řádek pro povolení repozitáře knihoven openh264 podobu:

1
sudo dnf config-manager --enable fedora-cisco-openh264

Od DNF 5 (Fedora 41+) je však nutné místo toho použít:

1
sudo dnf config-manager setopt fedora-cisco-openh264.enabled=1

a proto jsem text článku aktualizoval.

1-Fedora-2. Instalace balíčku akmod-nvidia

Dle instalačního návodu pro NVIDIA ovladač od RPM Fusion nainstalujte balíček akmod-nvidia.

1
2
3
sudo dnf update  # pokud zde dojde k aktualizaci kernelu, nejprve rebootněte do nejnovějšího kernelu a pak pokračujte
sudo dnf install akmod-nvidia
sudo dnf mark user akmod-nvidia

Podobně ve starších verzích DNF (Fedora 40 a dříve) měl třetí řádek, který bránil odstranění ovladače při autoremove, podobu:

1
sudo dnf mark install akmod-nvidia

Od DNF 5 (Fedora 41+) je nutné místo toho použít:

1
sudo dnf mark user akmod-nvidia

což jsem v článku zohlednil.

RPM Fusion v minulosti zastávalo vůči NVIDIA open-source kernelovým modulům spíše negativní postoj a pokud jste nic neuvedli, poskytovalo ve výchozím nastavení proprietární ovladač. Podle nedávno (prosinec 12025) změněných pokynů RPM Fusion nyní pro hardware s duplicitní podporou (architektury od Turing po období před Blackwell) automaticky zvolí a poskytne lepší variantu, takže už není potřeba ručně vybírat. Pro starší architektury před Turingem a pro nejnovější architektury Blackwell a novější stejně vždy existovala jen jedna možnost, takže zde se nic nemění. Na základě toho jsem ověřil, že informace o volbě open-source modulů přes /etc/rpm/macros.nvidia-kmod byly odstraněny.

Dále se uvádí, že balíček akmod-nvidia-open se nemá používat, pokud nepotřebujete přímo aplikovat downstream změny do kernel-space ovladače.

Tyto body jsem také promítl do aktualizace textu.

1-Fedora-3. Registrace klíče pro správné načtení ovladače při Secure Boot

Po provedení níže popsaných doplňkových kroků lze Secure Boot běžně používat spolu s NVIDIA ovladačem. Vypnutí Secure Bootu výrazně oslabuje bezpečnost systému, proto jej nedoporučuji vypínat. Minimálně od začátku 12020s obvykle neexistuje dobrý důvod Secure Boot vypínat.

Nejprve nainstalujte následující nástroje:

1
sudo dnf install kmodtool akmods mokutil openssl

Poté vytvořte klíč:

1
sudo kmodgenca -a

Nyní je potřeba zaregistrovat vytvořený klíč do MOK v UEFI firmwaru.

1
sudo mokutil --import /etc/pki/akmods/certs/public_key.der

Po spuštění příkazu budete vyzváni k zadání hesla pro registraci klíče. Za chvíli budete rebootovat a toto jednorázové heslo budete potřebovat v průběhu registrace, takže zadejte něco, co si krátce zapamatujete.

Poté restartujte systém:

1
systemctl reboot

Během bootu se automaticky zobrazí okno správy MOK. Zvolte „Enroll MOK“, poté postupně „Continue“ a „Yes“; následně budete vyzváni k zadání hesla, které jste nastavili. Po zadání hesla bude registrace hotová. Poté zvolte reboot a po dalším startu by se měl NVIDIA ovladač načíst správně.

Ověření instalace NVIDIA ovladače

V terminálu můžete ověřit aktuálně načtený NVIDIA kernelový modul:

1
cat /proc/driver/nvidia/version

Pokud se zobrazí zpráva podobná této, instalace je v pořádku:

1
2
NVRM version: NVIDIA UNIX Open Kernel Module for x86_64  555.58.02  Release Build  (dvs-builder@U16-I3-B03-4-3)  Tue Jun 25 01:26:03 UTC 2024
GCC version:  gcc version 14.2.1 20240801 (Red Hat 14.2.1-1) (GCC) 

Dále je potřeba, aby po instalaci NVIDIA ovladače byl vypnut open-source grafický ovladač nouveau (kernelový modul), který bývá v Linuxu často výchozí. Pokud by zůstal aktivní, může způsobovat problémy. Po instalaci ovladače a rebootu by následující příkaz neměl vypsat nic:

1
lsmod |grep nouveau

2. Instalace NVIDIA Container Toolkit

Nyní je potřeba nainstalovat NVIDIA Container Toolkit. Postupujte podle oficiálního instalačního průvodce NVIDIA Container Toolkit, ale v případě Fedory existují během instalace důležité poznámky — proto si nejdříve dočtěte tuto sekci až do konce a pak pokračujte.

Pokud používáte Apt (Ubuntu, Debian apod.)

2-Apt-1. Nastavení repozitáře pro stahování balíčků

1
2
3
4
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

2-Apt-2. Aktualizace seznamu balíčků

1
sudo apt update

2-Apt-3. Instalace balíčku

1
sudo apt install nvidia-container-toolkit

Pokud používáte Yum nebo Dnf (Fedora, RHEL, Centos apod.)

Při testování na Fedoře 40 jsem zjistil, že na rozdíl od Ubuntu nejsou příkaz nvidia-smi ani balíček nvidia-persistenced součástí základní instalace NVIDIA ovladače, takže bylo nutné doinstalovat balíček xorg-x11-drv-nvidia-cuda. RHEL ani Centos jsem přímo netestoval, ale protože mají se Fedorou velmi podobnou skladbu systému, pokud byste při postupu podle tohoto návodu narazili na problém, může pomoci zkusit stejný postup.

Na Fedoře 40 mi po instalaci xorg-x11-drv-nvidia-cuda a otestování na ukázkovém workloadu vše fungovalo. Pokud by přesto vznikaly potíže (např. kvůli SELinux), může pomoci Fedora-specifický balíček a návod pro nvidia-container-toolkit od Fedora AI-ML skupiny.

2-Dnf-1. Nastavení repozitáře pro stahování balíčků

1
2
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

2-Dnf-2. Instalace balíčku

1
sudo dnf install nvidia-container-toolkit

nebo

1
sudo yum install nvidia-container-toolkit

Pokud používáte Zypper (openSUSE, SLES)

2-Zypper-1. Nastavení repozitáře pro stahování balíčků

1
sudo zypper ar https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo

2-Zypper-2. Instalace balíčku

1
sudo zypper --gpg-auto-import-keys install nvidia-container-toolkit

3. Instalace kontejnerového enginu

Dále nainstalujte jako kontejnerový engine buď Docker CE, nebo Podman. Vyberte si podle svého prostředí a preferencí; postupujte podle oficiální dokumentace Dockeru a oficiální dokumentace Podmanu.

Následující tabulka shrnuje hlavní rozdíly, výhody a nevýhody Dockeru a Podmanu.

KritériumDockerPodman
ArchitekturaKlient–server model, na bázi démona (daemon)„Daemonless“ architektura
BezpečnostSpoléhá na démona běžícího ve výchozím stavu s root právy,
což představuje potenciální bezpečnostní riziko
(od verze 20.10 vydané v 12020 podporuje rootless
mód, ale vyžaduje dodatečné nastavení)
Bez závislosti na démonu; pokud nic neurčíte,
běží ve výchozím stavu rootless a je chráněn
SELinuxem
Spotřeba prostředkůKvůli démonové architektuře běží v pozadí proces trvale,
typicky tedy spotřebovává více prostředků
Obvykle menší režie (overhead)
Čas startu kontejneruRelativně pomalejšíDíky zjednodušené architektuře až o ~50 %
rychlejší spuštění
Ekosystém a dokumentaceVelmi rozsáhlý ekosystém a komunitní podpora,
bohatá dokumentace
Relativně menší ekosystém a méně dokumentace
SíťováníDocker Bridge NetworkCNI (Container Network Interface)
pluginy
Nativní podpora Kubernetes YAMLX (vyžaduje převod)O

Zdroje:

Docker má delší historii a dlouho byl de facto průmyslovým standardem; největší výhodou je proto široký ekosystém a množství související dokumentace.
Podman byl vyvinut relativně nedávno firmou Red Hat a díky své koncepci „daemonless“ a „rootless“ přináší výhody v oblasti bezpečnosti, spotřeby systémových prostředků i doby startu kontejnerů. Silnou stránkou Podmanu je i to, že na rozdíl od Dockeru (kde pád démona může shodit všechny kontejnery) jsou kontejnery plně nezávislé, takže pád jednoho kontejneru neovlivní ostatní.

Nejdůležitější je vybrat nástroj podle vlastních podmínek a potřeb, ale pro úplné začátečníky se jako dobrá volba jeví začít s Podmanem. I když je jeho ekosystém oproti Dockeru menší, díky výše uvedeným výhodám rychle roste a rozdíl se zmenšuje. Zároveň je v mnoha ohledech kompatibilní s Dockerem (Dockerfile syntaxe, Docker obrazy, CLI). Pokud už nemáte vybudovaný velký systém postavený na Dockeru, kde by přechod na Podman znamenal významné náklady, dává smysl zvolit Podman rovnou od začátku.

Podman

Podman je v systémových repozitářích většiny hlavních Linux distribucí, takže jej lze nainstalovat jednoduše.

Ubuntu

1
sudo apt install podman

Fedora

1
sudo dnf install podman

openSUSE

1
sudo zypper install podman

Ověření, že je vše nastaveno správně

V terminálu spusťte:

1
podman run --rm hello-world

Pokud se vypíše následující zpráva, je to v pořádku:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
!... Hello Podman World ...!

         .--"--.           
       / -     - \         
      / (O)   (O) \        
   ~~~| -=(,Y,)=- |         
    .---. /`  \   |~~      
 ~/  o  o \~~~~.----. ~~   
  | =(X)= |~  / (O (O) \   
   ~~~~~~~  ~| =(Y_)=-  |   
  ~~~~    ~~~|   U      |~~ 

Project:   https://github.com/containers/podman
Website:   https://podman.io
Desktop:   https://podman-desktop.io
Documents: https://docs.podman.io
YouTube:   https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon:  @[email protected]

Při testování v čase 12025-12-18T00:43:00+09:00 (podman 5.7.1, passt 20251215.gb40f5cd-1.fc43.x86_64, Fedora 43) se při spuštění hello-world i při běhu kontejnerů nebo buildu obrazů objevila chyba:

1
2
Error: pasta failed with exit code 1:
Couldn't set IPv6 route(s) in guest: Operation not supported

Přestože IPv6 nepoužívám a jsem v IPv4 síti, při nastavování sítě kontejneru se zdá, že pasta (součást passt knihovny) zkouší nastavit IPv6 routování. Ověřil jsem, že při explicitním použití IPv4 přes volbu --net=pasta:-4 problém nenastává — jak při spuštění kontejneru, tak i ve fázi buildu obrazu popsané později.

1
podman run --net=pasta:-4 --rm hello-world

Při hledání jsem našel dříve nahlášený issue se stejnými příznaky. V issue se píše, že to bylo opraveno v 2024_06_24.1ee2eca, ale vzhledem k tomu, že pozorované chování je stejné a také šlo o problém při použití Proton VPN, mám podezření, že se podobný issue znovu objevil.

Docker CE

Ubuntu

3-Ubuntu-1. Odstranění starších nebo neoficiálních balíčků kvůli kolizím
1
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done
3-Ubuntu-2. Nastavení repozitáře
1
2
3
4
5
6
7
8
9
10
11
12
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
3-Ubuntu-3. Instalace balíčků
1
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3-Ubuntu-4. Vytvoření skupiny Docker a přidání uživatele

Aby mohl Docker spravovat i non-root uživatel bez sudo, stačí vytvořit skupinu Docker a přidat do ní uživatele:

1
2
sudo groupadd docker
sudo usermod -aG docker $USER

Poté se odhlaste a znovu přihlaste, aby se změny projevily. Na Ubuntu nebo Debianu se služba Docker obvykle spouští automaticky při bootu i bez dalších kroků.

Fedora

3-Fedora-1. Odstranění starších nebo neoficiálních balíčků kvůli kolizím
1
2
3
4
5
6
7
8
9
10
sudo dnf remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-selinux \
                docker-engine-selinux \
                docker-engine
3-Fedora-2. Nastavení repozitáře
1
2
sudo dnf install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
3-Fedora-3. Instalace balíčků
1
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Během instalace budete vyzváni k potvrzení GPG klíče. Pokud klíč odpovídá 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35, potvrďte zadáním y.

Pokud se GPG klíč neshoduje, může jít o podvržený balíček stažený v rámci supply-chain útoku, a instalaci je nutné okamžitě přerušit.

3-Fedora-4. Spuštění Docker démona

Docker je nyní nainstalovaný, ale neběží. Spusťte jej:

1
sudo systemctl start docker

Chcete-li, aby se Docker spouštěl automaticky při bootu:

1
2
sudo systemctl enable docker.service
sudo systemctl enable containerd.service
3-Fedora-5. Přidání uživatele do skupiny Docker

Aby mohl Docker spravovat i non-root uživatel, přidejte uživatele do skupiny Docker. Na Fedoře se skupina Docker vytvoří automaticky během instalace, takže stačí jen přidání uživatele:

1
sudo usermod -aG docker $USER

Poté se odhlaste a znovu přihlaste, aby se změny projevily.

Ověření, že je vše nastaveno správně

V terminálu spusťte:

1
docker run hello-world

Pokud se zobrazí zpráva jako níže, je to v pořádku:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Další čtení

Pokračování v dílu 2

Tento příspěvek je licencován pod CC BY-NC 4.0 autorem.