Files
ubuntu-bare-metal/manual-tutorial/03-nvidia-container-toolkit.md
T
tomasz-syn-grzegorza 359afb3a59 Initial import: bare-metal stacks, Server UI, GPU fan, tutorials.
Infrastructure configs for GMKtec K11 (Docker, vLLM, LocalAI, ComfyUI,
control-plane, gpu-fan agent, Server UI with CLI/file explorer/GPU fan curve).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-05 12:02:04 +00:00

363 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 03 — NVIDIA Container Toolkit
> **Cel rozdziału:** skonfigurować Docker tak, aby kontenery miały dostęp do GPU NVIDIA (RTX 3090 Ti) — fundament pod vLLM i ComfyUI.
**Szacowany czas:** 1015 minut
**Wymagania:** ukończone rozdziały [01](01-system-update-and-docker.md) i [02](02-nvidia-driver.md)
---
## Spis treści
1. [Weryfikacja punktu startowego](#1-weryfikacja-punktu-startowego)
2. [Co robi NVIDIA Container Toolkit](#2-co-robi-nvidia-container-toolkit)
3. [Instalacja](#3-instalacja)
4. [Konfiguracja runtime Docker](#4-konfiguracja-runtime-docker)
5. [Test GPU w kontenerze](#5-test-gpu-w-kontenerze)
6. [Składnia GPU dla Compose (podgląd)](#6-składnia-gpu-dla-compose-podgląd)
7. [Weryfikacja](#7-weryfikacja)
8. [Troubleshooting](#8-troubleshooting)
9. [Czego nie robimy w tym kroku](#9-czego-nie-robimy-w-tym-kroku)
10. [Następny krok](#10-następny-krok)
---
## 1. Weryfikacja punktu startowego
```bash
# sterownik NVIDIA z rozdziału 02
nvidia-smi
# Docker z rozdziału 01
docker --version
docker ps
# toolkit jeszcze niezainstalowany
which nvidia-ctk 2>/dev/null || echo "nvidia-ctk: not installed (expected)"
```
**Oczekiwany wynik:**
- `nvidia-smi` pokazuje RTX 3090 Ti, driver 595.x
- Docker działa (`docker ps` bez błędów)
- `nvidia-ctk` niedostępne
---
## 2. Co robi NVIDIA Container Toolkit
Bez tego pakietu Docker **nie widzi GPU** — kontener uruchomi się, ale bez akceleracji CUDA.
Toolkit dostarcza:
| Komponent | Rola |
|-----------|------|
| `nvidia-container-toolkit` | Integracja GPU z container runtime |
| `nvidia-ctk` | CLI do konfiguracji (Docker, containerd) |
| `libnvidia-container` | Biblioteka montująca sterownik i urządzenia GPU do kontenera |
**Jak to działa:**
```mermaid
flowchart LR
host["Host: nvidia-driver + nvidia-smi"]
docker["Docker Engine"]
toolkit["NVIDIA Container Toolkit"]
container["Kontener vLLM / ComfyUI"]
host --> toolkit
docker --> toolkit
toolkit --> container
```
Kontener **nie potrzebuje** własnego sterownika NVIDIA — dziedziczy go z hosta przez toolkit. Obraz musi mieć tylko biblioteki CUDA kompatybilne z wersją sterownika.
**Uwaga:** Nie instalujemy przestarzałego `nvidia-docker2` — został zastąpiony przez Container Toolkit.
---
## 3. Instalacja
### 3.1 Dodanie repozytorium NVIDIA
```bash
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
```
### 3.2 Instalacja pakietu
```bash
sudo apt update
sudo apt install -y nvidia-container-toolkit
```
### 3.3 Sprawdzenie wersji
```bash
nvidia-ctk --version
dpkg -l | grep nvidia-container
```
---
## 4. Konfiguracja runtime Docker
Toolkit musi zarejestrować runtime NVIDIA w Dockerze:
```bash
sudo nvidia-ctk runtime configure --runtime=docker
```
Ta komenda modyfikuje `/etc/docker/daemon.json` — dodaje konfigurację runtime `nvidia`, **zachowując** istniejące ustawienia (np. rotację logów z rozdziału 01).
Sprawdź wynik:
```bash
cat /etc/docker/daemon.json
```
Oczekiwana struktura (przykład — Twoja może wyglądać nieco inaczej):
```json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
},
"runtimes": {
"nvidia": {
"args": [],
"path": "nvidia-container-runtime"
}
}
}
```
Zrestartuj Docker:
```bash
sudo systemctl restart docker
```
Sprawdź, że daemon wstał:
```bash
sudo systemctl status docker --no-pager
```
---
## 5. Test GPU w kontenerze
### 5.1 Podstawowy test — `nvidia-smi` w kontenerze
```bash
docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi
```
**Oczekiwany wynik:**
- Ten sam GPU: NVIDIA GeForce RTX 3090 Ti
- Driver Version: 595.x (z hosta)
- Brak błędów `could not select device driver`
Pierwsze uruchomienie pobierze obraz CUDA (~100200 MB) — to normalne.
### 5.2 Test z jednym GPU (explicit)
Na tym serwerze jest jedna karta NVIDIA, ale warto od razu testować jawne przypisanie:
```bash
docker run --rm --gpus '"device=0"' nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi -L
```
Oczekiwane: `GPU 0: NVIDIA GeForce RTX 3090 Ti`
### 5.3 Test bez GPU (kontrolny)
```bash
docker run --rm nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi
```
Oczekiwane: błąd — kontener bez `--gpus` nie widzi GPU. To potwierdza, że GPU nie jest przypadkowo dostępne dla każdego kontenera.
---
## 6. Składnia GPU dla Compose (podgląd)
W rozdziałach 04 (vLLM) i 05 (ComfyUI) użyjemy `docker compose` z GPU. Podgląd składni:
```yaml
services:
vllm:
image: vllm/vllm-openai:latest
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
```
Alternatywnie (prostsza składnia, działa w Compose v2):
```yaml
services:
comfyui:
image: yanwk/comfyui-boot:latest
gpus: all
```
Na razie **nie twórz** tych plików — to tylko podgląd na przyszłość.
---
## 7. Weryfikacja
### Checklist
- [ ] `nvidia-ctk --version` zwraca wersję
- [ ] `/etc/docker/daemon.json` zawiera runtime `nvidia`
- [ ] `docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi` działa
- [ ] W kontenerze widać RTX 3090 Ti (24 GB)
- [ ] `docker run` **bez** `--gpus` nie widzi GPU (kontrolny test)
- [ ] Docker z rozdziału 01 nadal działa (`hello-world` OK)
### Szybki test końcowy
```bash
docker run --rm hello-world
docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi
```
---
## 8. Troubleshooting
### 8.1 `could not select device driver "" with capabilities: [[gpu]]`
**Przyczyna:** Runtime NVIDIA nie skonfigurowany lub Docker nie zrestartowany.
**Rozwiązanie:**
```bash
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
docker info | grep -i nvidia
```
### 8.2 `nvidia-smi` działa na hoście, ale nie w kontenerze
**Diagnostyka:**
```bash
# na hoście
nvidia-smi
# sprawdź runtime w docker info
docker info 2>/dev/null | grep -A5 -i runtime
# logi toolkit
sudo journalctl -u docker --no-pager -n 30
```
**Rozwiązanie:**
```bash
sudo apt install --reinstall nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
```
### 8.3 Konflikt w `daemon.json`
**Objaw:** `systemctl restart docker` → failed po edycji `daemon.json`.
**Rozwiązanie:**
```bash
# walidacja JSON
python3 -m json.tool /etc/docker/daemon.json
# jeśli błąd składni — przywróć minimalną konfigurację i skonfiguruj ponownie
sudo tee /etc/docker/daemon.json <<'EOF'
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "3"
}
}
EOF
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
```
### 8.4 `apt update` — konflikt Signed-By
**Objaw:** Błąd repozytorium przy `apt update` po dodaniu NVIDIA repo.
**Rozwiązanie:**
```bash
# usuń i dodaj repo ponownie (sekcja 3.1)
sudo rm /etc/apt/sources.list.d/nvidia-container-toolkit.list
# ... powtórz kroki 3.1 i 3.2
```
### 8.5 Obraz CUDA — `pull` failed / timeout
```bash
# test połączenia z registry
docker pull nvidia/cuda:12.6.0-base-ubuntu24.04
# alternatywny lekki obraz testowy
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
```
### 8.6 `CUDA Version` w kontenerze vs na hoście
Na hoście `nvidia-smi` może pokazywać CUDA 13.2, a obraz testowy CUDA 12.6 — to **normalne**. Kontener używa sterownika hosta; wersja CUDA w obrazie to maksymalna wersja bibliotek w kontenerze, nie sterownik.
---
## 9. Czego nie robimy w tym kroku
| Element | Rozdział |
|---------|----------|
| vLLM | 04 |
| ComfyUI | 05 |
| Pobieranie modeli LLM | 04 |
| CUDA Toolkit na hoście | niepotrzebne |
| Firewall | 06 |
| Katalog `/data` na modele | później |
---
## 10. Następny krok
Po przejściu checklisty z sekcji 7:
1. Zgłoś w rozmowie z Cursorem, że krok 03 jest gotowy (lub opisz problemy).
2. Przejdź do rozdziału [**03b — Narzędzia bazowe**](03b-system-tools.md), a następnie [**04 — Dysk + vLLM**](04-vllm-stack.md).
---
## Podsumowanie wykonanych zmian
Po ukończeniu tego rozdziału na serwerze powinno być:
- Zainstalowany `nvidia-container-toolkit`
- Skonfigurowany runtime NVIDIA w Dockerze
- Działający `docker run --gpus all` z widoczną RTX 3090 Ti
- Gotowa infrastruktura pod vLLM i ComfyUI w kontenerach