0 Голосов

JupyterHab+Cuda+nvidia-container-toolkit

Редактировал(а) Виталий Александров 04.02.2025 21:02

# jupyterhub-cuda
# Развертывание JupyterHub с помощью Docker Compose

Данный проект описывает процесс развертывания JupyterHub с использованием Docker Compose. Решение включает настройку аутентификации через GitHub OAuth, поддержку GPU-вычислений и использование DockerSpawner для создания изолированных окружений для пользователей.

---

## Содержание
1. [Общая информация](#общая-информация)
2. [Структура проекта](#структура-проекта)
3. [Настройка Dockerfile](#настройка-dockerfile)
4. [Настройка docker-compose.yml](#настройка-docker-composeyml)
5. [Конфигурация jupyterhub_config.py](#конфигурация-jupyterhub_configpy)
6. [Запуск сервиса](#запуск-сервиса)

---

## Общая информация

JupyterHub — это система управления многопользовательскими ноутбуками Jupyter. В данном решении используется Docker Compose для управления контейнерами, а также DockerSpawner для запуска индивидуальных серверов для каждого пользователя. Поддерживается аутентификация через GitHub OAuth и настройки GPU-окружения.

---

## Структура проекта

```
.
├── Dockerfile.jupyterhub          # Файл для сборки образа JupyterHub
├── docker-compose.yml             # Конфигурация Docker Compose
├── jupyterhub_config.py           # Конфигурация JupyterHub
├── requirements.txt               # Зависимости Python
└── data/                          # Директория для хранения данных
```

---

## Настройка Dockerfile

`Dockerfile.jupyterhub` определяет базовый образ и устанавливает необходимые зависимости.

```dockerfile
FROM jupyterhub/jupyterhub:5.2.1
WORKDIR /srv/jupyterhub

# Создаем директорию для данных и изменяем владельца
RUN mkdir -p /srv/jupyterhub/data && \
    chown -R 1000:100 /srv/jupyterhub 

# Обновляем систему и устанавливаем дополнительные библиотеки
RUN apt-get update -y && \
    python3 -m pip install --no-cache-dir \
    psycopg2-binary \
    dockerspawner \
    oauthenticator   

# Копируем файл requirements.txt и устанавливаем зависимости
COPY requirements.txt /srv/jupyterhub/requirements.txt
RUN python3 -m pip install --no-cache-dir -r /srv/jupyterhub/requirements.txt

# Копируем конфигурационный файл JupyterHub
COPY jupyterhub_config.py /srv/jupyterhub/jupyterhub_config.py

# Запускаем JupyterHub с указанным конфигурационным файлом
CMD ["jupyterhub", "-f", "/srv/jupyterhub/jupyterhub_config.py"]
```

---

## Настройка docker-compose.yml

`docker-compose.yml` описывает параметры развертывания JupyterHub.

```yaml
version: '3.8'

services:
  jupyterhub:
    build:
      context: .
      dockerfile: Dockerfile.jupyterhub
    restart: always
    image: jupyterhub
    container_name: jupyterhub
    networks:
      - jupyterhub-network
    volumes:
      # Привязываем конфигурационный файл
      - "./jupyterhub_config.py:/srv/jupyterhub/jupyterhub_config.py"
      # Привязываем сокет Docker для работы DockerSpawner
      - "/var/run/docker.sock:/var/run/docker.sock:rw"
      # Привязываем том для данных JupyterHub
      - "jupyterhub-data:/srv/jupyterhub/data"
    ports:
      - "35001:8000" # Порт для доступа к JupyterHub
    environment:
      - JUPYTERHUB_BASE_URL=/hub
      - JUPYTERHUB_URL=http://skayfaks.keenetic.pro:35001
    runtime: nvidia
    privileged: true
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

volumes:
  jupyterhub-data:

networks:
  jupyterhub-network:
    name: jupyterhub-network
```

### Основные параметры:
- **`build`**: Указывает Dockerfile для сборки образа.
- **`volumes`**: Монтирует конфигурационный файл и данные.
- **`ports`**: Открывает порт `35001` для доступа к JupyterHub.
- **`runtime`**: Использует NVIDIA runtime для поддержки GPU.
- **`privileged`**: Предоставляет привилегии для работы с Docker внутри контейнера.

---

## Конфигурация jupyterhub_config.py

`jupyterhub_config.py` содержит основные настройки JupyterHub.

```python
from dockerspawner import DockerSpawner
from oauthenticator.github import GitHubOAuthenticator
import os

c = get_config()

# Основные настройки JupyterHub
c.JupyterHub.bind_url = 'http://:8000'
c.JupyterHub.hub_bind_url = 'http://0.0.0.0:8081'
c.JupyterHub.start_timeout = 360
c.JupyterHub.shutdown_no_activity_timeout = 600
c.JupyterHub.shutdown_on_logout = True
c.DockerSpawner.use_internal_ip = True

# Аутентификация через GitHub OAuth
c.JupyterHub.authenticator_class = GitHubOAuthenticator
c.GitHubOAuthenticator.client_id = '*'  # Укажите ваш client_id
c.GitHubOAuthenticator.client_secret = '*'  # Укажите ваш client_secret
c.GitHubOAuthenticator.oauth_callback_url = 'https://jupiter45.skayfaks.keenetic.pro/hub/oauth_callback'
c.OAuthenticator.admin_users = {'hek1412'}
c.GitHubOAuthenticator.allowed_organizations = {'1T45git'}
c.GitHubOAuthenticator.scope = ['read:user', 'user:email', 'read:org']

# Настройка DockerSpawner
c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'
c.DockerSpawner.image = 'quay.io/jupyter/pytorch-notebook:cuda12-python-3.11.8'
c.Spawner.http_timeout = 180
c.DockerSpawner.network_name = "jupyterhub-network"
c.Spawner.start_timeout = 240
c.DockerSpawner.notebook_dir = '/home/jovyan/work'
c.DockerSpawner.volumes = { 'jupyterhub-data_{username}': '/home/jovyan/work' }
c.DockerSpawner.remove = True
c.DockerSpawner.debug = True
c.DockerSpawner.cpu_limit = 4
c.DockerSpawner.mem_limit = '16G'
c.JupyterHub.active_server_limit = 6

# Настройки GPU
c.DockerSpawner.extra_create_kwargs = {
    'runtime': 'nvidia'
}
c.DockerSpawner.extra_host_config = {
    'device_requests': [
        {
            'Driver': 'nvidia',
            'Count': -1,
            'Capabilities': [['gpu']],
        }
    ]
}

# Настройки безопасности
data_dir = '/srv/jupyterhub/data'
c.JupyterHub.cookie_secret_file = os.path.join(data_dir, 'jupyterhub_cookie_secret')
c.JupyterHub.db_url = "sqlite:////srv/jupyterhub/data/jupyterhub.sqlite"
c.JupyterHub.log_level = 'DEBUG'
```

### Основные параметры:
- **Аутентификация**: Используется GitHub OAuth с указанием `client_id`, `client_secret` и разрешенных организаций.
- **DockerSpawner**: Настроен для создания изолированных контейнеров для каждого пользователя с поддержкой GPU.
- **Безопасность**: Используется SQLite для хранения данных и секретов.

---

## Запуск сервиса

1. **Создайте необходимые файлы**:
   - `Dockerfile.jupyterhub`
   - `docker-compose.yml`
   - `jupyterhub_config.py`
   - `requirements.txt`

2. **Соберите образ**:
   ```bash
   docker-compose build
   ```

3. **Запустите сервис**:
   ```bash
   docker-compose up -d
   ```

4. **Проверьте статус**:
   ```bash
   docker-compose ps
   ```
5. **Посмотреть логи**
   ```bash
   docker logs jupyterhub
   ```
6. **Доступ к JupyterHub**:
   Откройте браузер и перейдите по адресу: `http://skayfaks.keenetic.pro:35001/hub`.

![image](https://github.com/user-attachments/assets/e1927c3d-1e36-4f4a-9b4d-454b3b4c830d)

![image](https://github.com/user-attachments/assets/90f228bb-a654-45c5-b3fc-6554348d6f24)

![image](https://github.com/user-attachments/assets/b55b65ed-79d6-4383-8fb2-29b4d813de3e)

 ![image](https://github.com/user-attachments/assets/1c27d617-95da-4703-ae7e-13fcf88d62dc)
 
8. Дополнительные команды Docker
   ```bash
   docker volume ls -q
   docker volume rm имя тома
   docker system prune -a --volumes
   docker logs jupyterhub
   docker compose down
   ```
---

## Первая часть выполнена) Возможные проблемы в GitHub решаются чтением инструкции по созданию приложения с сайта. Мы развернули JupyterHub с использованием Docker Compose. Решение включает поддержку GPU, аутентификацию через GitHub и возможность создания изолированных окружений для каждого пользователя. Перед установкой необходимо проверить наличие актуальных драйверов `nvidia` и установить `nvidia-container-toolkit`, инструкция ниже.

# Проверка драйвера nvidia

**Проверка установки драйверов NVIDIA:**
   - Убедитесь, что на вашей машине установлены драйверы NVIDIA. Вы можете проверить их установку и статус с помощью команды:
     ```bash
     nvidia-smi
     ```
   Если команда возвращает информацию о вашей графической карте и cuda как на картинке ниже, значит драйверы установлены правильно. Можно переходить к установки `nvidia-container-toolkit`

   ![image](https://github.com/user-attachments/assets/6c8c711d-8f36-47ce-adf8-da61a9059ebf)

## Установка драйверов NVIDIA

1. **Обновите систему**:
   ```bash
   sudo apt-get update && sudo apt-get upgrade -y
   ```

2. **Добавьте репозиторий NVIDIA**:
   - Для Ubuntu 20.04:
     ```bash
     sudo add-apt-repository ppa:graphics-drivers/ppa
     sudo apt-get update
     ```
   - Для Ubuntu 22.04 и выше рекомендуется использовать официальные репозитории.

3. **Установите драйверы**:
   - Просмотрите доступные версии драйверов:
     ```bash
     ubuntu-drivers devices
     ```
     ![image](https://github.com/user-attachments/assets/d49cd66d-233c-41be-90e7-49f384e264df)

   - Установите рекомендуемую версию (например, `nvidia-driver-560`):
     ```bash
     sudo apt-get install nvidia-driver-525
     ```

4. **Установите дополнительные утилиты (по желанию, не обязательно)**:
   - Установите `nvidia-utils` для получения инструментов мониторинга:
     ```bash
     sudo apt-get install nvidia-utils-560
     ```

5. **Перезагрузите систему**:
   ```bash
   sudo reboot now
   ```

---

## Проверка работы драйверов

После перезагрузки системы проверьте, что драйверы успешно установлены и работают.

1. **Проверьте статус драйвера**:
   ```bash
   nvidia-smi
   ```
   - Команда должна вывести информацию о GPU, включая модель, температуру и использование памяти.
    
   ![image](https://github.com/user-attachments/assets/6c8c711d-8f36-47ce-adf8-da61a9059ebf)

2. **Проверьте журнал ядра**:
   ```bash
   dmesg | grep nvidia
   ```
   - Журнал должен содержать сообщения об успешной загрузке модуля ядра NVIDIA.

3. **Проверьте модуль ядра**:
   ```bash
   lsmod | grep nvidia
   ```
   - Если модуль загружен, он будет отображен в списке.

---

## Разрешение проблем

Если возникают проблемы при установке или работе драйверов, выполните следующие шаги:

1. **Проверьте логи системы**:
   - Просмотрите логи ядра:
     ```bash
     dmesg | grep -i error
     ```
   - Просмотрите логи APT:
     ```bash
     cat /var/log/apt/history.log
     ```

2. **Отключите Secure Boot**:
   - На некоторых системах Secure Boot может блокировать загрузку модулей NVIDIA. Отключите его в BIOS.

3. **Убедитесь, что система поддерживает GPU**:
   - Проверьте совместимость вашей видеокарты с установленной версией драйвера:
     [Матрица совместимости NVIDIA](https://www.nvidia.com/Download/Find.aspx)

4. **Попробуйте другую версию драйвера**:
   - Иногда более новая или старая версия драйвера может решить проблемы.

5. **Обратитесь к документации**:
   - [Официальная документация NVIDIA](https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html)

---

## Наличие драйвера не гарантирует нормальную работу, нужно еще установить `nvidia-container-toolkit` и не забываем про сам отраз для ноутбуков (Обязательно наличие CUDA) и библиотек для питона в 'requirements'.

---

# Установка и Настройка `nvidia-container-toolkit`

Для обеспечения поддержки GPU в контейнерах Docker необходимо установить и правильно настроить `nvidia-container-toolkit`. Этот инструмент позволяет контейнерам использовать ресурсы графических процессоров NVIDIA. Ниже описан пошаговый процесс установки и проверки конфигурации.

[Официальная документация](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)

---

## Содержание
1. [Общая информация](#общая-информация)
2. [Установка nvidia-container-toolkit](#установка-nvidia-container-toolkit)
3. [Настройка Docker для работы с NVIDIA](#настройка-docker-для-работы-с-nvidia)
4. [Проверка конфигурации](#проверка-конфигурации)
5. [Разрешение проблем](#разрешение-проблем)

---

## Общая информация

`nvidia-container-toolkit` — это набор инструментов, который интегрирует NVIDIA GPU с Docker. Он позволяет контейнерам использовать ресурсы GPU без необходимости изменения кода приложения. После установки вы сможете запускать GPU-приложения внутри Docker-контейнеров.

---

## Установка `nvidia-container-toolkit`

1. **Добавьте репозиторий NVIDIA**:
   - Определите ваше распределение Linux (например, Ubuntu 20.04):
     ```bash
     distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
     ```
   - Добавьте ключ GPG NVIDIA:
     ```bash
     curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
     ```
   - Добавьте репозиторий NVIDIA для вашего распределения:
     ```bash
     curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
     ```

2. **Обновите список пакетов**:
   ```bash
   sudo apt-get update
   ```

3. **Установите `nvidia-container-toolkit`**:
   ```bash
   sudo apt-get install -y nvidia-container-toolkit
   ```

4. **Настройте runtime Docker для использования NVIDIA**:
   ```bash
   sudo nvidia-ctk runtime configure --runtime=docker
   ```

5. **Перезапустите демон Docker**:
   ```bash
   sudo systemctl restart docker
   ```

---

## Настройка Docker для работы с NVIDIA

Чтобы Docker мог использовать GPU, убедитесь, что он настроен для работы с `nvidia-container-runtime`.

1. **Отредактируйте файл конфигурации Docker**:
   - Откройте файл `/etc/docker/daemon.json`:
     ```bash
     sudo nano /etc/docker/daemon.json
     ```

2. **Добавьте следующую конфигурацию**:
   ```json
   {
       "runtimes": {
           "nvidia": {
               "path": "nvidia-container-runtime",
               "runtimeArgs": []
           }
       }
   }
   ```

3. **Сохраните файл и перезапустите Docker**:
   ```bash
   sudo systemctl restart docker
   ```

---

## Проверка конфигурации

После завершения установки и настройки проверьте, что Docker может использовать GPU.

1. **Запустите тестовый контейнер**:
   ```bash
   sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
   ```
   - Если всё настроено правильно, команда выведет информацию о доступных GPU, аналогично тому, как работает `nvidia-smi` непосредственно на хост-машине. Пример на скрине ниже:
 
   ![image](https://github.com/user-attachments/assets/6c8c711d-8f36-47ce-adf8-da61a9059ebf)

2. **Проверьте логи Docker**:
   - Если возникают ошибки, проверьте логи Docker:
     ```bash
     sudo journalctl -u docker.service
     ```

---

## Разрешение проблем

Если Docker не видит GPU или возникают другие проблемы, выполните следующие шаги:

1. **Убедитесь, что драйверы NVIDIA установлены**:
   - Проверьте версию драйвера:
     ```bash
     nvidia-smi
     ```
   - Если драйверы не установлены, следуйте инструкциям из [официальной документации NVIDIA](https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html).

2. **Проверьте права доступа к устройствам GPU**:
   - Убедитесь, что пользователь имеет права доступа к `/dev/nvidia*`:
     ```bash
     ls -l /dev/nvidia*
     ```

3. **Перепроверьте конфигурацию Docker**:
   - Убедитесь, что `/etc/docker/daemon.json` содержит правильные настройки для `nvidia-container-runtime`.

4. **Перезапустите систему**:
   - Иногда требуется перезагрузка системы для применения изменений:
     ```bash
     sudo reboot now
     ```

---
После успешной установки и настройки `nvidia-container-toolkit`, Docker сможет работать с GPU, что особенно полезно для машинного обучения, обработки данных и других задач, требующих высокопроизводительных вычислений. Если у вас возникли сложности, обратитесь к [официальной документации NVIDIA](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html) или сообществу разработчиков.

# jupyterhub-cuda
# Развертывание JupyterHub с помощью Docker Compose

Данный проект описывает процесс развертывания JupyterHub с использованием Docker Compose. Решение включает настройку аутентификации через GitHub OAuth, поддержку GPU-вычислений и использование DockerSpawner для создания изолированных окружений для пользователей.

---

## Содержание
1. [Общая информация](#общая-информация)
2. [Структура проекта](#структура-проекта)
3. [Настройка Dockerfile](#настройка-dockerfile)
4. [Настройка docker-compose.yml](#настройка-docker-composeyml)
5. [Конфигурация jupyterhub_config.py](#конфигурация-jupyterhub_configpy)
6. [Запуск сервиса](#запуск-сервиса)

---

## Общая информация

JupyterHub — это система управления многопользовательскими ноутбуками Jupyter. В данном решении используется Docker Compose для управления контейнерами, а также DockerSpawner для запуска индивидуальных серверов для каждого пользователя. Поддерживается аутентификация через GitHub OAuth и настройки GPU-окружения.

---

## Структура проекта

```
.
├── Dockerfile.jupyterhub          # Файл для сборки образа JupyterHub
├── docker-compose.yml             # Конфигурация Docker Compose
├── jupyterhub_config.py           # Конфигурация JupyterHub
├── requirements.txt               # Зависимости Python
└── data/                          # Директория для хранения данных
```

---

## Настройка Dockerfile

`Dockerfile.jupyterhub` определяет базовый образ и устанавливает необходимые зависимости.

```dockerfile
FROM jupyterhub/jupyterhub:5.2.1
WORKDIR /srv/jupyterhub

# Создаем директорию для данных и изменяем владельца
RUN mkdir -p /srv/jupyterhub/data && \
    chown -R 1000:100 /srv/jupyterhub 

# Обновляем систему и устанавливаем дополнительные библиотеки
RUN apt-get update -y && \
    python3 -m pip install --no-cache-dir \
    psycopg2-binary \
    dockerspawner \
    oauthenticator   

# Копируем файл requirements.txt и устанавливаем зависимости
COPY requirements.txt /srv/jupyterhub/requirements.txt
RUN python3 -m pip install --no-cache-dir -r /srv/jupyterhub/requirements.txt

# Копируем конфигурационный файл JupyterHub
COPY jupyterhub_config.py /srv/jupyterhub/jupyterhub_config.py

# Запускаем JupyterHub с указанным конфигурационным файлом
CMD ["jupyterhub", "-f", "/srv/jupyterhub/jupyterhub_config.py"]
```

---

## Настройка docker-compose.yml

`docker-compose.yml` описывает параметры развертывания JupyterHub.

```yaml
version: '3.8'

services:
  jupyterhub:
    build:
      context: .
      dockerfile: Dockerfile.jupyterhub
    restart: always
    image: jupyterhub
    container_name: jupyterhub
    networks:
      - jupyterhub-network
    volumes:
      # Привязываем конфигурационный файл
      - "./jupyterhub_config.py:/srv/jupyterhub/jupyterhub_config.py"
      # Привязываем сокет Docker для работы DockerSpawner
      - "/var/run/docker.sock:/var/run/docker.sock:rw"
      # Привязываем том для данных JupyterHub
      - "jupyterhub-data:/srv/jupyterhub/data"
    ports:
      - "35001:8000" # Порт для доступа к JupyterHub
    environment:
      - JUPYTERHUB_BASE_URL=/hub
      - JUPYTERHUB_URL=http://skayfaks.keenetic.pro:35001
    runtime: nvidia
    privileged: true
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]

volumes:
  jupyterhub-data:

networks:
  jupyterhub-network:
    name: jupyterhub-network
```

### Основные параметры:
- **`build`**: Указывает Dockerfile для сборки образа.
- **`volumes`**: Монтирует конфигурационный файл и данные.
- **`ports`**: Открывает порт `35001` для доступа к JupyterHub.
- **`runtime`**: Использует NVIDIA runtime для поддержки GPU.
- **`privileged`**: Предоставляет привилегии для работы с Docker внутри контейнера.

---

## Конфигурация jupyterhub_config.py

`jupyterhub_config.py` содержит основные настройки JupyterHub.

```python
from dockerspawner import DockerSpawner
from oauthenticator.github import GitHubOAuthenticator
import os

c = get_config()

# Основные настройки JupyterHub
c.JupyterHub.bind_url = 'http://:8000'
c.JupyterHub.hub_bind_url = 'http://0.0.0.0:8081'
c.JupyterHub.start_timeout = 360
c.JupyterHub.shutdown_no_activity_timeout = 600
c.JupyterHub.shutdown_on_logout = True
c.DockerSpawner.use_internal_ip = True

# Аутентификация через GitHub OAuth
c.JupyterHub.authenticator_class = GitHubOAuthenticator
c.GitHubOAuthenticator.client_id = '*'  # Укажите ваш client_id
c.GitHubOAuthenticator.client_secret = '*'  # Укажите ваш client_secret
c.GitHubOAuthenticator.oauth_callback_url = 'https://jupiter45.skayfaks.keenetic.pro/hub/oauth_callback'
c.OAuthenticator.admin_users = {'hek1412'}
c.GitHubOAuthenticator.allowed_organizations = {'1T45git'}
c.GitHubOAuthenticator.scope = ['read:user', 'user:email', 'read:org']

# Настройка DockerSpawner
c.JupyterHub.spawner_class = 'dockerspawner.DockerSpawner'
c.DockerSpawner.image = 'quay.io/jupyter/pytorch-notebook:cuda12-python-3.11.8'
c.Spawner.http_timeout = 180
c.DockerSpawner.network_name = "jupyterhub-network"
c.Spawner.start_timeout = 240
c.DockerSpawner.notebook_dir = '/home/jovyan/work'
c.DockerSpawner.volumes = { 'jupyterhub-data_{username}': '/home/jovyan/work' }
c.DockerSpawner.remove = True
c.DockerSpawner.debug = True
c.DockerSpawner.cpu_limit = 4
c.DockerSpawner.mem_limit = '16G'
c.JupyterHub.active_server_limit = 6

# Настройки GPU
c.DockerSpawner.extra_create_kwargs = {
    'runtime': 'nvidia'
}
c.DockerSpawner.extra_host_config = {
    'device_requests': [
        {
            'Driver': 'nvidia',
            'Count': -1,
            'Capabilities': [['gpu']],
        }
    ]
}

# Настройки безопасности
data_dir = '/srv/jupyterhub/data'
c.JupyterHub.cookie_secret_file = os.path.join(data_dir, 'jupyterhub_cookie_secret')
c.JupyterHub.db_url = "sqlite:////srv/jupyterhub/data/jupyterhub.sqlite"
c.JupyterHub.log_level = 'DEBUG'
```

### Основные параметры:
- **Аутентификация**: Используется GitHub OAuth с указанием `client_id`, `client_secret` и разрешенных организаций.
- **DockerSpawner**: Настроен для создания изолированных контейнеров для каждого пользователя с поддержкой GPU.
- **Безопасность**: Используется SQLite для хранения данных и секретов.

---

## Запуск сервиса

1. **Создайте необходимые файлы**:
   - `Dockerfile.jupyterhub`
   - `docker-compose.yml`
   - `jupyterhub_config.py`
   - `requirements.txt`

2. **Соберите образ**:
   ```bash
   docker-compose build
   ```

3. **Запустите сервис**:
   ```bash
   docker-compose up -d
   ```

4. **Проверьте статус**:
   ```bash
   docker-compose ps
   ```
5. **Посмотреть логи**
   ```bash
   docker logs jupyterhub
   ```
6. **Доступ к JupyterHub**:
   Откройте браузер и перейдите по адресу: `http://skayfaks.keenetic.pro:35001/hub`.

![image](https://github.com/user-attachments/assets/e1927c3d-1e36-4f4a-9b4d-454b3b4c830d)

![image](https://github.com/user-attachments/assets/90f228bb-a654-45c5-b3fc-6554348d6f24)

![image](https://github.com/user-attachments/assets/b55b65ed-79d6-4383-8fb2-29b4d813de3e)

 ![image](https://github.com/user-attachments/assets/1c27d617-95da-4703-ae7e-13fcf88d62dc)
 
8. Дополнительные команды Docker
   ```bash
   docker volume ls -q
   docker volume rm имя тома
   docker system prune -a --volumes
   docker logs jupyterhub
   docker compose down
   ```
---

## Первая часть выполнена) Возможные проблемы в GitHub решаются чтением инструкции по созданию приложения с сайта. Мы развернули JupyterHub с использованием Docker Compose. Решение включает поддержку GPU, аутентификацию через GitHub и возможность создания изолированных окружений для каждого пользователя. Перед установкой необходимо проверить наличие актуальных драйверов `nvidia` и установить `nvidia-container-toolkit`, инструкция ниже.

# Проверка драйвера nvidia

**Проверка установки драйверов NVIDIA:**
   - Убедитесь, что на вашей машине установлены драйверы NVIDIA. Вы можете проверить их установку и статус с помощью команды:
     ```bash
     nvidia-smi
     ```
   Если команда возвращает информацию о вашей графической карте и cuda как на картинке ниже, значит драйверы установлены правильно. Можно переходить к установки `nvidia-container-toolkit`

   ![image](https://github.com/user-attachments/assets/6c8c711d-8f36-47ce-adf8-da61a9059ebf)

## Установка драйверов NVIDIA

1. **Обновите систему**:
   ```bash
   sudo apt-get update && sudo apt-get upgrade -y
   ```

2. **Добавьте репозиторий NVIDIA**:
   - Для Ubuntu 20.04:
     ```bash
     sudo add-apt-repository ppa:graphics-drivers/ppa
     sudo apt-get update
     ```
   - Для Ubuntu 22.04 и выше рекомендуется использовать официальные репозитории.

3. **Установите драйверы**:
   - Просмотрите доступные версии драйверов:
     ```bash
     ubuntu-drivers devices
     ```
     ![image](https://github.com/user-attachments/assets/d49cd66d-233c-41be-90e7-49f384e264df)

   - Установите рекомендуемую версию (например, `nvidia-driver-560`):
     ```bash
     sudo apt-get install nvidia-driver-525
     ```

4. **Установите дополнительные утилиты (по желанию, не обязательно)**:
   - Установите `nvidia-utils` для получения инструментов мониторинга:
     ```bash
     sudo apt-get install nvidia-utils-560
     ```

5. **Перезагрузите систему**:
   ```bash
   sudo reboot now
   ```

---

## Проверка работы драйверов

После перезагрузки системы проверьте, что драйверы успешно установлены и работают.

1. **Проверьте статус драйвера**:
   ```bash
   nvidia-smi
   ```
   - Команда должна вывести информацию о GPU, включая модель, температуру и использование памяти.
    
   ![image](https://github.com/user-attachments/assets/6c8c711d-8f36-47ce-adf8-da61a9059ebf)

2. **Проверьте журнал ядра**:
   ```bash
   dmesg | grep nvidia
   ```
   - Журнал должен содержать сообщения об успешной загрузке модуля ядра NVIDIA.

3. **Проверьте модуль ядра**:
   ```bash
   lsmod | grep nvidia
   ```
   - Если модуль загружен, он будет отображен в списке.

---

## Разрешение проблем

Если возникают проблемы при установке или работе драйверов, выполните следующие шаги:

1. **Проверьте логи системы**:
   - Просмотрите логи ядра:
     ```bash
     dmesg | grep -i error
     ```
   - Просмотрите логи APT:
     ```bash
     cat /var/log/apt/history.log
     ```

2. **Отключите Secure Boot**:
   - На некоторых системах Secure Boot может блокировать загрузку модулей NVIDIA. Отключите его в BIOS.

3. **Убедитесь, что система поддерживает GPU**:
   - Проверьте совместимость вашей видеокарты с установленной версией драйвера:
     [Матрица совместимости NVIDIA](https://www.nvidia.com/Download/Find.aspx)

4. **Попробуйте другую версию драйвера**:
   - Иногда более новая или старая версия драйвера может решить проблемы.

5. **Обратитесь к документации**:
   - [Официальная документация NVIDIA](https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html)

---

## Наличие драйвера не гарантирует нормальную работу, нужно еще установить `nvidia-container-toolkit` и не забываем про сам отраз для ноутбуков (Обязательно наличие CUDA) и библиотек для питона в 'requirements'.

---

# Установка и Настройка `nvidia-container-toolkit`

Для обеспечения поддержки GPU в контейнерах Docker необходимо установить и правильно настроить `nvidia-container-toolkit`. Этот инструмент позволяет контейнерам использовать ресурсы графических процессоров NVIDIA. Ниже описан пошаговый процесс установки и проверки конфигурации.

[Официальная документация](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html)

---

## Содержание
1. [Общая информация](#общая-информация)
2. [Установка nvidia-container-toolkit](#установка-nvidia-container-toolkit)
3. [Настройка Docker для работы с NVIDIA](#настройка-docker-для-работы-с-nvidia)
4. [Проверка конфигурации](#проверка-конфигурации)
5. [Разрешение проблем](#разрешение-проблем)

---

## Общая информация

`nvidia-container-toolkit` — это набор инструментов, который интегрирует NVIDIA GPU с Docker. Он позволяет контейнерам использовать ресурсы GPU без необходимости изменения кода приложения. После установки вы сможете запускать GPU-приложения внутри Docker-контейнеров.

---

## Установка `nvidia-container-toolkit`

1. **Добавьте репозиторий NVIDIA**:
   - Определите ваше распределение Linux (например, Ubuntu 20.04):
     ```bash
     distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
     ```
   - Добавьте ключ GPG NVIDIA:
     ```bash
     curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
     ```
   - Добавьте репозиторий NVIDIA для вашего распределения:
     ```bash
     curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
     ```

2. **Обновите список пакетов**:
   ```bash
   sudo apt-get update
   ```

3. **Установите `nvidia-container-toolkit`**:
   ```bash
   sudo apt-get install -y nvidia-container-toolkit
   ```

4. **Настройте runtime Docker для использования NVIDIA**:
   ```bash
   sudo nvidia-ctk runtime configure --runtime=docker
   ```

5. **Перезапустите демон Docker**:
   ```bash
   sudo systemctl restart docker
   ```

---

## Настройка Docker для работы с NVIDIA

Чтобы Docker мог использовать GPU, убедитесь, что он настроен для работы с `nvidia-container-runtime`.

1. **Отредактируйте файл конфигурации Docker**:
   - Откройте файл `/etc/docker/daemon.json`:
     ```bash
     sudo nano /etc/docker/daemon.json
     ```

2. **Добавьте следующую конфигурацию**:
   ```json
   {
       "runtimes": {
           "nvidia": {
               "path": "nvidia-container-runtime",
               "runtimeArgs": []
           }
       }
   }
   ```

3. **Сохраните файл и перезапустите Docker**:
   ```bash
   sudo systemctl restart docker
   ```

---

## Проверка конфигурации

После завершения установки и настройки проверьте, что Docker может использовать GPU.

1. **Запустите тестовый контейнер**:
   ```bash
   sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi
   ```
   - Если всё настроено правильно, команда выведет информацию о доступных GPU, аналогично тому, как работает `nvidia-smi` непосредственно на хост-машине. Пример на скрине ниже:
 
   ![image](https://github.com/user-attachments/assets/6c8c711d-8f36-47ce-adf8-da61a9059ebf)

2. **Проверьте логи Docker**:
   - Если возникают ошибки, проверьте логи Docker:
     ```bash
     sudo journalctl -u docker.service
     ```

---

## Разрешение проблем

Если Docker не видит GPU или возникают другие проблемы, выполните следующие шаги:

1. **Убедитесь, что драйверы NVIDIA установлены**:
   - Проверьте версию драйвера:
     ```bash
     nvidia-smi
     ```
   - Если драйверы не установлены, следуйте инструкциям из [официальной документации NVIDIA](https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html).

2. **Проверьте права доступа к устройствам GPU**:
   - Убедитесь, что пользователь имеет права доступа к `/dev/nvidia*`:
     ```bash
     ls -l /dev/nvidia*
     ```

3. **Перепроверьте конфигурацию Docker**:
   - Убедитесь, что `/etc/docker/daemon.json` содержит правильные настройки для `nvidia-container-runtime`.

4. **Перезапустите систему**:
   - Иногда требуется перезагрузка системы для применения изменений:
     ```bash
     sudo reboot now
     ```

---
После успешной установки и настройки `nvidia-container-toolkit`, Docker сможет работать с GPU, что особенно полезно для машинного обучения, обработки данных и других задач, требующих высокопроизводительных вычислений. Если у вас возникли сложности, обратитесь к [официальной документации NVIDIA](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html) или сообществу разработчиков.