Проблема: студенты смотрят, а не пишут
Знакомо? Вы стоите у доски, объясняете градиентный спуск, показываете код в Jupyter Notebook. Аудитория кивает. Потом просите повторить - и тишина. Потому что 80% студентов просто смотрят на ваш экран, а не пишут код.
Google Colab? Да, удобно. Но у него есть проблемы:
- Сессии сбрасываются через 12 часов (а иногда и раньше)
- Ограничения по GPU для бесплатных аккаунтов
- Нет контроля над окружением - сегодня библиотека версии X, завтра Y
- Студенты тратят 15 минут на установку зависимостей вместо работы
- Нет нормальной совместной работы в реальном времени
Решение? Свой образовательный сервер с Docker и JupyterLab. Не просто "еще один Jupyter", а настроенная под семинары среда.
Ключевая идея: дать студентам одинаковое окружение за 30 секунд. Не "установите библиотеки", а "запустите контейнер". Все зависимости уже внутри.
Что получится в итоге
Образовательная платформа, где каждый студент получает:
| Что | Зачем |
|---|---|
| JupyterLab с предустановленными библиотеками ML | Не тратить время на установку |
| Встроенный Git и терминал | Работать как в реальном проекте |
| Real Time Collaboration (RTC) | Преподаватель видит код студентов сразу |
| Предзагруженные датасеты | Не качать по 2 ГБ каждый раз |
| Локальный AI-ассистент для кода | Помощь без выхода в интернет |
1 Подготовка: Dockerfile для ML-образования
Стандартный образ Jupyter - это голый Python. Нам нужен образ для обучения ML. Вот Dockerfile, который я использую с 2024 года (обновлен под 2026):
FROM jupyter/scipy-notebook:2026-01-15
# Устанавливаем русскую локаль (для студентов)
ENV LANG=ru_RU.UTF-8 \
LANGUAGE=ru_RU:ru \
LC_ALL=ru_RU.UTF-8
RUN apt-get update && apt-get install -y \
locales \
git-lfs \
htop \
nano \
&& rm -rf /var/lib/apt/lists/* \
&& localedef -i ru_RU -c -f UTF-8 -A /usr/share/locale/locale.alias ru_RU.UTF-8
# Основные ML библиотеки
RUN pip install --no-cache-dir \
torch==2.5.0 \
torchvision==0.20.0 \
torchaudio==2.5.0 \
scikit-learn==1.6.0 \
pandas==2.3.0 \
matplotlib==3.10.0 \
seaborn==0.13.2 \
plotly==5.24.0 \
xgboost==2.1.0 \
lightgbm==4.5.0 \
catboost==1.3.0 \
jupyterlab-git==0.50.0 \
jupyterlab-lsp==5.2.0 \
python-lsp-server[all]==1.10.0
# JupyterLab расширения для семинаров
RUN jupyter labextension install \
@jupyterlab/git \
@jupyter-widgets/jupyterlab-manager \
@jupyterlab/toc \
@jupyterlab/debugger \
--no-build
# Копируем учебные материалы
COPY datasets/ /home/jovyan/datasets/
COPY tutorials/ /home/jovyan/tutorials/
COPY exercises/ /home/jovyan/exercises/
# Права на запись (студенты будут сохранять работы)
RUN chmod -R 777 /home/jovyan/work
EXPOSE 8888
CMD ["start.sh", "jupyter", "lab", "--LabApp.token=''", "--LabApp.password=''"]
2 Makefile для упрощения жизни
Студенты не должны запоминать команды Docker. Дайте им Makefile:
.PHONY: build run stop clean help
IMAGE_NAME = ml-seminar-2026
CONTAINER_NAME = ml-student-$(shell whoami)
PORT = 8888
build:
docker build -t $(IMAGE_NAME) .
run:
docker run -d \
--name $(CONTAINER_NAME) \
-p $(PORT):8888 \
-v $(PWD)/work:/home/jovyan/work \
-v $(PWD)/.jupyter:/home/jovyan/.jupyter \
--gpus all \
$(IMAGE_NAME)
@echo "JupyterLab запущен: http://localhost:$(PORT)"
stop:
docker stop $(CONTAINER_NAME) || true
docker rm $(CONTAINER_NAME) || true
clean:
docker rmi $(IMAGE_NAME) || true
rm -rf work/*
help:
@echo "Команды для студентов:"
@echo " make run - запустить среду"
@echo " make stop - остановить"
@echo " make clean - очистить всё"
@echo ""
@echo "После make run откройте http://localhost:$(PORT)"
Студент делает три команды:
git clone https://github.com/your-university/ml-seminar.git
cd ml-seminar
make run
И получает рабочую среду. Никаких "pip install не работает", "версия конфликтует", "памяти не хватает".
3 Настройка JupyterLab для совместной работы
Стандартный JupyterLab - это индивидуальная работа. Для семинаров нужны расширения. Создаем конфигурацию:
# .jupyter/jupyter_server_config.py
c.ServerApp.allow_origin = '*' # Для локальной сети
c.ServerApp.allow_remote_access = True
c.ServerApp.ip = '0.0.0.0'
# Real Time Collaboration
c.LabApp.collaborative = True
c.ServerApp.disable_check_xsrf = True # Только для локальной сети!
# Автосохранение каждые 30 секунд
c.ContentsManager.checkpoints_kwargs = {'root_dir': '.ipynb_checkpoints/'}
c.FileContentsManager.autosave_interval = 30
# Лимиты для студентов
c.ExecutePreprocessor.timeout = 600 # 10 минут на ячейку
c.ExecutePreprocessor.kernel_name = 'python3'
# Отключаем предупреждения о больших данных
c.NbConvertApp.use_output_suffix = False
Внимание: отключение XSRF защиты - только для локальной образовательной сети! Для публичного доступа используйте аутентификацию.
Как это работает на семинаре
Сценарий живого семинара:
- За 5 минут до начала: студенты делают
make run - Преподаватель показывает код на своем экране
- Студенты повторяют в своих инстансах
- Преподаватель может зайти на любой студенческий инстанс (по IP:8888)
- Видит ошибки сразу, помогает точечно
- Все сохраняют работы в папку
work/, которая маппится на хост
Преимущество перед демонстрацией экрана: студенты не просто смотрят, они взаимодействуют. Каждый пишет код в своем темпе.
Добавляем локального AI-ассистента
Студенты задают вопросы. Преподаватель один на 20 человек. Решение - локальный код-ассистент. Поднимаем его в соседнем контейнере:
# docker-compose.yml
version: '3.8'
services:
jupyter:
build: .
ports:
- "8888:8888"
volumes:
- ./work:/home/jovyan/work
- ./datasets:/home/jovyan/datasets
environment:
- JUPYTER_ENABLE_LAB=yes
- GRANT_SUDO=yes
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
code-assistant:
image: ghcr.io/opencode/assistant:latest
ports:
- "8080:8080"
volumes:
- ./code-assistant-data:/data
environment:
- MODEL=deepseek-coder-7b-instruct-v2.5
- GPU_MEMORY=8
depends_on:
- jupyter
Теперь студенты могут спрашивать у AI-ассистента про синтаксис, ошибки, лучшие практики. Без интернета, без лимитов, без платных подписок.
Если нужен полноценный локальный AI с RAG - посмотрите мой гайд про развертывание локального ИИ-ассистента для кода. Там подробно про настройку моделей и экономию VRAM.
Предзагрузка датасетов и моделей
Самое раздражающее на семинаре - ждать, пока 20 человек скачают MNIST по 50 МБ каждый. Решение - положить датасеты в образ:
# scripts/prepare_datasets.py
import torchvision
import pandas as pd
from sklearn.datasets import fetch_openml
import pickle
import os
# Создаем папку для датасетов
os.makedirs('datasets', exist_ok=True)
# MNIST
print("Downloading MNIST...")
train = torchvision.datasets.MNIST('datasets/mnist', download=True)
# Boston Housing
print("Downloading Boston Housing...")
boston = fetch_openml(name='boston', version=1)
pd.DataFrame(boston.data, columns=boston.feature_names).to_csv('datasets/boston.csv', index=False)
# Titanic
print("Downloading Titanic...")
titanic = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')
titanic.to_csv('datasets/titanic.csv', index=False)
print("Datasets ready!")
Запускаем скрипт при сборке образа. Теперь датасеты доступны сразу.
Интеграция с Git для сдачи работ
Студенты делают задания. Как собирать работы? Через Git. Настраиваем в JupyterLab:
{
"git": {
"repository": "https://github.com/your-university/ml-assignments-2026",
"branch": "main",
"user": {
"name": "Student",
"email": "student@university.edu"
}
},
"notebook": {
"default_dir": "/home/jovyan/work",
"auto_save": true
}
}
Студенты делают commit прямо из JupyterLab. Преподаватель видит все изменения в одном репозитории.
Типичные ошибки и как их избежать
| Ошибка | Решение |
|---|---|
| Контейнеры конфликтуют по портам | Используйте разные порты: 8888, 8889, 8890. Или docker-compose с сетью |
| Нет доступа к GPU в контейнере | Установите nvidia-container-toolkit и флаг --gpus all |
| Студенты теряют работы при остановке | Маппите папку work на хост (volume) |
| Образ слишком большой (10+ ГБ) | Используйте многоэтапную сборку, удаляйте кэш pip |
| Студенты с Windows не могут запустить | Дайте им Docker Desktop или WSL2 инструкцию |
Масштабирование: когда студентов больше 20
Локальный Docker на ноутбуке преподавателя выдержит 10-20 контейнеров. Для 100+ студентов нужен сервер. Тут два пути:
1. JupyterHub с DockerSpawner - каждый студент получает свой контейнер по запросу. Сложнее в настройке, но автоматическое масштабирование.
2. Предварительно запущенные контейнеры - на сервере с 32 ядрами и 128 ГБ RAM можно запустить 50 контейнеров заранее. Студенты подключаются к свободным.
Для серьезных ML курсов с большим количеством студентов рекомендую посмотреть мой гайд про построение ML-песочницы на k8s. Kubernetes справится с сотнями инстансов.
Что дальше? От семинаров к проектам
Семинары - это хорошо. Но настоящие навыки появляются в проектах. Как перейти от упражнений к реальным задачам?
1. Добавьте продвинутые инструменты - MLflow для экспериментов, DVC для данных, Prefect для пайплайнов.
2. Интегрируйте с IDE - студенты пишут код в VSCode, который подключается к Jupyter kernel. Смотрите идеальный стек для self-hosted LLM и IDE.
3. Добавьте продвинутую аналитику - Grafana dashboard, где видно, какие задачи вызывают проблемы у большинства студентов.
4. Автоматическую проверку заданий - pytest + nbval, который проверяет ноутбуки студентов.
Чего не хватает в этом подходе?
Идеальных решений не бывает. У Docker+JupyterLab для образования есть минусы:
- Требует Docker на компьютерах студентов - не все могут установить (корпоративные ноутбуки)
- Нет автоматического сохранения в облако - если студент забыл сделать commit, работа теряется
- Сложнее демонстрировать работу с большими моделями - нужны GPU на стороне студентов
- Нет встроенной системы оценивания - преподаватель проверяет вручную
Но эти минусы решаемы. Для больших моделей используйте локальный запуск LLM через Ollama. Для автоматического оценивания - CI/CD пайплайны.
Финальный совет: начинайте с малого
Не пытайтесь сразу построить идеальную образовательную платформу. Начните с одного Dockerfile и Makefile. Проведите один семинар. Посмотрите, что понравилось студентам, что вызвало проблемы.
Через месяц у вас будет:
ml-seminar/
├── Dockerfile # Образ с библиотеками
├── Makefile # Простые команды для студентов
├── datasets/ # Предзагруженные данные
├── tutorials/ # Готовые ноутбуки
├── exercises/ # Задания
└── docker-compose.yml # Для продвинутых сценариев
И самое главное - студенты, которые действительно пишут код. Не смотрят на ваш экран, а экспериментируют, ошибаются, исправляют, учатся.
Потому что разница между "посмотреть демонстрацию" и "написать код самому" - это разница между "понять теорию" и "научиться применять". А в ML, как и в любом ремесле, навык важнее знаний.