Заметки айтишника
JupyterHub для команды: как организовать общую среду для ML и разработки
JupyterHub — это сервер, который даёт каждому участнику команды собственную среду Jupyter в браузере на общем мощном оборудовании. Вместо того чтобы считать модели на ноутбуках и передавать файлы по почте, команда работает на одном сервере или кластере с общими данными, одинаковыми библиотеками и доступом к GPU. Для команды до нескольких десятков человек хватает одного сервера и варианта The Littlest JupyterHub. Для больших команд и общего пула видеокарт JupyterHub разворачивают на Kubernetes. При планировании ресурсов главное — оперативная память и правила распределения GPU.
Типичная картина в команде аналитиков или ML-разработчиков: у каждого своя версия Python и библиотек, датасеты лежат на личных ноутбуках, модель, которая работала у одного, не запускается у другого, а видеокарту на единственном сервере распределяют через общий чат. JupyterHub решает эти проблемы — если правильно его развернуть.

Разберём, как устроен JupyterHub, какой вариант установки выбрать, сколько ресурсов нужно команде и как поделить между людьми GPU.

Что такое JupyterHub

Jupyter Notebook и JupyterLab — среды, в которых пишут и выполняют код на Python прямо в браузере, видят результаты, графики и пояснения в одном документе. Это стандартный инструмент для анализа данных и машинного обучения.

JupyterHub — многопользовательская надстройка над ними. Он:

  • проверяет, кто входит, через корпоративные учётные записи;
  • запускает для каждого пользователя отдельный сервер Jupyter — изолированную рабочую среду;
  • выделяет каждому процессор, память и, при необходимости, GPU;
  • даёт доступ к общим данным и сохраняет личные файлы между сессиями.


Для пользователя это выглядит как ссылка в браузере: открыл, вошёл под своей учётной записью — и работает на мощном сервере, а не на ноутбуке.

Кому и когда нужен JupyterHub

JupyterHub для команды оправдан, если:

  • с данными работают больше 3–5 человек: аналитики, специалисты по data science, ML-инженеры, студенты;
  • данные нельзя хранить на личных ноутбуках — из-за объёма или требований безопасности;
  • нужны мощные ресурсы, которых нет на рабочих компьютерах, прежде всего GPU;
  • важно, чтобы у всех были одинаковые версии библиотек и результаты воспроизводились;
  • новых сотрудников нужно подключать за минуты, а не за день настройки окружения.


JupyterHub широко используют в университетах для учебных курсов и научной работы: преподаватель готовит среду один раз, а студенты получают её в браузере.

Как устроен JupyterHub

КомпонентЧто делает
HubЦентральный сервис: управляет пользователями и их серверами
ПроксиНаправляет запросы из браузера к нужному пользовательскому серверу
AuthenticatorПроверяет вход: LDAP / Active Directory, OAuth через GitLab, Keycloak и другие системы
SpawnerЗапускает пользовательские серверы: как процессы, Docker-контейнеры или поды Kubernetes
Пользовательский серверJupyterLab конкретного человека со своими ресурсами и файлами
Главный выбор при установке — spawner, то есть способ запуска пользовательских сред. От него зависят изоляция, ограничение ресурсов и масштабирование.

Какой вариант установки выбрать

ВариантДля когоОсобенности
The Littlest JupyterHub (TLJH)Небольшая команда на одном сервере, по рекомендации разработчиков — до 100 пользователейПростая установка, пользователи — учётные записи на сервере
JupyterHub с DockerSpawnerКоманда на одном-двух серверах, нужна изоляция окруженийКаждый пользователь в своём контейнере, разные образы под разные задачи
Zero to JupyterHub на KubernetesКрупные команды, несколько серверов, общий пул GPUУстановка через Helm, масштабирование, профили ресурсов, автоматическое освобождение ресурсов
Если у компании уже есть кластер Kubernetes, JupyterHub на нём — самый гибкий вариант. Если нет и команда небольшая, начинать с кластера ради JupyterHub не обязательно: одного сервера с TLJH или Docker достаточно.

Сколько ресурсов нужно команде

Ресурсы считают от двух вещей: сколько нужно одному пользователю и сколько человек реально работают одновременно. Процессор, память, диски и GPU при этом ведут себя по-разному, поэтому и считают их по-разному.

Пример для команды из 10 человек, которые анализируют данные и обучают небольшие модели:
ПараметрЛимит на одного пользователяКак считаем на командуИтого
Процессор4 ядраОдновременно считают обычно 5–6 человек из 10: 6 × 4 = 24 ядра, плюс запас24–32 ядра
Оперативная память16 ГБПамять не делится: 10 × 16 = 160 ГБ, плюс 20–30% на систему, сам JupyterHub и кэш файлов192–256 ГБ
Диски для личных файлов100 ГБ10 × 100 ГБ1 ТБ SSD
Общие датасеты—Хранятся один раз для всех, объём = все датасеты + ростNVMe в сервере или сетевое хранилище
GPU1 карта или её часть на задачуПо числу задач обучения, которые идут одновременно, а не по числу людей1–4 видеокарты
Разберём каждую строку подробнее.

Процессор. 4 ядра — это не постоянная загрузка, а верхний предел, который получает один пользователь. Большую часть времени человек пишет код, читает результаты или смотрит графики, и его ядра простаивают. Поэтому одновременно процессор нагружают обычно 5–6 человек из 10 — им нужно 24 ядра. Запас до 32 ядер позволяет спокойно работать, даже если одновременно считают 8 человек.

А если вычисления запустят все десять? Им понадобится 40 ядер, а в сервере 32. Ничего не сломается: процессорное время поделится между всеми, и каждый получит примерно 3,2 ядра вместо 4. Расчёты у всех пойдут медленнее, примерно на 20%, пока нагрузка не спадёт. Если команде нужно гарантированно давать каждому 4 ядра даже в пике, закладывают полный объём — 40 ядер и больше.

Оперативная память. С памятью так не получится: её нельзя «поделить по очереди». Датасет, загруженный в память, занимает её, пока пользователь не остановит ядро Jupyter, даже если он в это время ничего не считает. Поэтому память считают на всех без скидки: 10 × 16 ГБ = 160 ГБ. Сверху добавляют 20–30% для операционной системы, сервисов JupyterHub и файлового кэша — получается 192–256 ГБ.

Что будет, если кому-то понадобится больше 16 ГБ? Сработает лимит: перезапустится только ядро этого пользователя, и его несохранённые результаты в памяти пропадут. Остальные продолжат работать. Без лимитов сервер при нехватке памяти начнёт принудительно завершать процессы, и пострадать могут все. Поэтому лимиты памяти на пользователя задают обязательно, а тем, кто работает с большими данными, выделяют отдельный профиль с увеличенной памятью.

Диски для личных файлов. 100 ГБ на человека хватает на код, ноутбуки, установленные библиотеки и промежуточные результаты. Для 10 человек это 1 ТБ. Лучше SSD: при открытии ноутбуков и установке библиотек идёт много мелких операций с файлами. Если пользователь заполнит свои 100 ГБ, он не сможет сохранять новые файлы, пока не освободит место, — на остальных это не повлияет.

Общие датасеты. Большие наборы данных не копируют каждому пользователю, а хранят один раз и подключают ко всем средам. Объём равен сумме датасетов с запасом на рост: например, если данных 2 ТБ, берут 4 ТБ. Если JupyterHub работает на одном сервере, датасеты кладут на быстрые NVMe-диски внутри него. Если серверов несколько, нужно сетевое хранилище, доступное всем.

GPU. Видеокарты считают не по числу людей, а по числу задач обучения, которые идут одновременно. Если в команде из 10 человек модели одновременно обучают трое, нужны три видеокарты. Для небольших экспериментов одну мощную карту можно разделить на части (об этом ниже). Если задач больше, чем карт, они встают в очередь и ждут, пока освободится GPU.

Помогает и автоматическое отключение неактивных сред: сервис idle culler останавливает серверы пользователей, которые не работали, например, больше часа, и освобождает память и GPU.

Как поделить GPU между пользователями

Видеокарта — самый дорогой и дефицитный ресурс. Способы распределения:

  • Выделенная карта на время сессии. Пользователь, выбравший профиль с GPU, получает карту целиком. Просто, но карта простаивает, пока человек пишет код.
  • Профили ресурсов. При входе пользователь выбирает среду: «CPU, 8 ГБ», «CPU, 32 ГБ» или «GPU». В Kubernetes-варианте это настраивается через список профилей.
  • Деление карты. Технология MIG на A100 и H100 делит одну карту на несколько изолированных частей с собственной памятью. Для небольших экспериментов это эффективнее, чем выдавать карту целиком.
  • Разделение обучения и экспериментов. В JupyterHub пишут и проверяют код, а долгое обучение запускают отдельными задачами на выделенных GPU, чтобы не блокировать карты открытыми ноутбуками.

Хранение данных и окружения

Личные файлы. У каждого пользователя постоянная домашняя папка, которая сохраняется между сессиями.

Общие данные. Датасеты подключают к средам всех пользователей, часто в режиме только для чтения, чтобы никто случайно не испортил общий набор.

Окружения. Библиотеки фиксируют в Docker-образах или окружениях conda. Лучше иметь несколько готовых образов — для анализа данных, для глубокого обучения с поддержкой GPU — и обновлять их централизованно. Тогда результат, полученный одним сотрудником, воспроизведёт любой другой.

Безопасность

  • Корпоративный вход. Подключите JupyterHub к Active Directory, LDAP или единому входу компании, чтобы доступ закрывался вместе с увольнением сотрудника.
  • Изоляция пользователей. Контейнеры не позволяют одному пользователю видеть файлы и процессы другого.
  • Без прав администратора. Пользовательские среды не должны работать с правами root.
  • Секреты вне ноутбуков. Пароли от баз данных не должны храниться в тексте ноутбуков: их передают через переменные окружения или хранилище секретов.
  • HTTPS и закрытый доступ. JupyterHub не публикуют в интернет без защиты: доступ — через VPN или защищённый канал.

Как развернуть JupyterHub для команды: порядок действий

  • Определите, сколько человек и какие задачи будут решать в JupyterHub.
  • Посчитайте ресурсы: память на пользователя, процессор с учётом одновременности, GPU.
  • Выберите вариант установки: TLJH, Docker или Kubernetes.
  • Подключите корпоративную аутентификацию.
  • Подготовьте образы окружений и общие хранилища данных.
  • Настройте лимиты ресурсов, профили и отключение неактивных сред.
  • Настройте резервное копирование домашних папок и мониторинг.

Типичные ошибки

  • Нет лимитов памяти. Один пользователь загружает огромный датасет, и падают среды всех остальных.
  • GPU закреплены за открытыми ноутбуками. Карты заняты, но ничего не считают.
  • Каждый ставит библиотеки сам. Через месяц у всех разные версии и невоспроизводимые результаты.
  • Данные только в домашних папках. Одни и те же датасеты скопированы десять раз.
  • JupyterHub открыт в интернет без защиты. Доступ к серверу с данными и выполнением кода получает кто угодно.
  • Нет резервных копий домашних папок. Сбой диска уничтожает результаты месяцев работы.

JupyterHub в Иркутске: чем поможет Интерфоника

Интерфоника — технологический провайдер из Иркутска с собственной оптической сетью и двумя ЦОДами. Среди услуг для IT-специалистов — JupyterHub: рабочие окружения для разработки, анализа данных и обучения моделей.

  • JupyterHub — общая среда для ML и разработки на инфраструктуре Интерфоники.
  • Серверы с GPU для машинного обучения, ИИ и сложных вычислений.
  • Кластеры Kubernetes с автомасштабированием, мониторингом, резервным копированием и диагностикой уязвимостей — основа для JupyterHub в крупных командах.
  • Собственные ЦОДы с двойным электропитанием, продуманным охлаждением и пожаротушением.
  • Быстрый доступ к данным. Бесплатное прямое подключение к ЦОДу по оптике до 100 Гбит/с: большие датасеты из офиса попадают в среду без долгого ожидания.
  • Бесплатная площадка для экспериментов. IT-специалистам Интерфоника выделяет свободные ресурсы под тестовые среды — можно попробовать JupyterHub с командой до принятия решения.


Интерфоника работает и с образовательными организациями: сотрудничество с ИрГУПС началось с предложения предоставить университету вычислительные ресурсы для научных и академических задач. Об этом в отзыве на сайте рассказывает начальник управления информатизацией университета.

Настроим JupyterHub для вашей команды

Расскажите, сколько человек будет работать в среде и какие задачи они решают, — инженер предложит конфигурацию ресурсов и вариант размещения.

Оставить заявку

Частые вопросы

Что такое JupyterHub?
Это многопользовательский сервер, который запускает для каждого участника команды отдельную среду Jupyter в браузере. Все работают на общем оборудовании, с общими данными и одинаковыми библиотеками, но изолированно друг от друга.

Чем JupyterHub отличается от JupyterLab?
JupyterLab — среда разработки для одного пользователя. JupyterHub управляет множеством таких сред: авторизует пользователей, запускает для каждого свой JupyterLab и выделяет ресурсы.

Сколько ресурсов нужно для JupyterHub на 10 человек?
Для анализа данных и обучения небольших моделей ориентир — 24–32 ядра, 192–256 ГБ оперативной памяти, быстрые диски и 1–4 видеокарты, если нужны вычисления на GPU. Точные цифры зависят от объёма данных и задач.

Можно ли дать нескольким пользователям одну видеокарту?
Да. Можно выдавать карту по очереди на время сессии или делить её на изолированные части с помощью MIG на картах уровня A100 и H100. Долгое обучение лучше запускать отдельными задачами, чтобы не блокировать GPU.

Какой вариант установки JupyterHub выбрать?
Для небольшой команды на одном сервере — The Littlest JupyterHub или JupyterHub с Docker. Для крупных команд, нескольких серверов и общего пула GPU — JupyterHub на Kubernetes.

Где разместить JupyterHub в Иркутске?
Если нужны мощные серверы и GPU, среду размещают в дата-центре. Интерфоника предоставляет JupyterHub, серверы с GPU и кластеры Kubernetes в собственных ЦОДах в Иркутске с бесплатным прямым подключением по оптике до 100 Гбит/с.
15.10.2026