
Привет! Меня зовут Алексей Архипенко, я руковожу группой разработки ML‑инфраструктуры в команде YTsaurus. Мы часть Yandex Infrastructure и предоставляем пользователям внутри Яндекса инфраструктурный фундамент для самых разных задач машинного обучения.
YTsaurus — основная платформа для хранения и обработки данных Яндекса, которая доступна на GitHub под лицензией Apache 2.0. Это позволяет всем желающим загрузить систему на свои серверы, а также дорабатывать её под свои нужды. Мы уже писали в прошлых постах про её выход в опенсорс и дальнейшее развитие, а также кейсы использования в рекламе. Сегодня расскажу, как Яндекс запускает в ней почти все ML‑обучения и batch‑инференс.
На конференции Yandex Scale в сентябре 2025 года Никита Семёнов показал, как использовать YTsaurus для разработки интеллекта автономного транспорта. Но это лишь часть более общего тренда: платформа используется в ML‑проектах разного масштаба. Чем в них полезен YTsaurus:
позволяет распараллеливать обучение и batch‑инференс от одной до тысяч GPU,
автоматически распределяет доступные вычислительные ресурсы между задачами,
даёт возможность работать с данными — от подготовки до хранения — единым способом.
За счёт этого мы улучшаем совместимость разных ML‑проектов и снижаем операционные издержки. Для Яндекса важно, что благодаря этому можно добиться постоянного использования имеющихся GPU и CPU, и поддерживать одну систему вместо нескольких.
В этом материале покажем, как попробовать возможности платформы самостоятельно. Внутри статьи вы также найдёте полную инструкцию с подробным описанием пяти сценариев практического воркшопа.
Как в YTsaurus появился ML
YTsaurus используется в Яндексе как платформа для хранения и обработки больших данных. Изначально он решал вполне классические задачи: надёжное хранение данных и запуск массовых batch‑вычислений. Мы прошли длинный путь оптимизации использования серверов — научились поддерживать необходимые гарантии для сервисов и при этом избегать простоев серверов.

Когда в Яндексе начал активно развиваться ML, всё больше сервисов стали использовать обучение моделей и batch‑инференс, а вместе с этим начала расти потребность в GPU. На первых порах ML‑нагрузки существовали отдельно от YTsaurus: для них поднимались специализированные кластеры, писались свои обвязки и инструменты запуска. Но быстро стало понятно, что ML понадобится практически всем сервисам Яндекса.
В разных командах для обучения моделей существовали разные подходы и инструменты, GPU использовались точечно и часто были привязаны к отдельным системам. Это усложняло развитие ML‑нагрузок и мешало эффективно использовать дорогостоящие ресурсы. Постепенно стало очевидно, что для обучения моделей нужен единый инфраструктурный фундамент — с понятным планированием, гарантиями и тесной связью с данными, которые уже хранятся и обрабатываются в YTsaurus.
Так появилась идея добавить поддержку GPU в YTsaurus. Однако запуск задач для GPU заметно отличается от запуска классических MapReduce‑вычислений, под которые был заточен планировщик YTsaurus. Во‑первых, в ML‑задачах одну и ту же GPU, как правило, нельзя использовать совместно: некоторые задачи требуют всего один процессор, другим нужно сразу несколько, а третьим — целый хост со всеми доступными на нём GPU. Поэтому остро встаёт проблема фрагментации ресурсов, когда в кластере свободно некоторое количество GPU, нужное для запуска очередной задачи, но они разбросаны по разным хостам, и выделить их невозможно. Во‑вторых, существуют распределённые обучения, которым требуется сразу несколько хостов. Для таких обучений планировщику необходимо учитывать сетевую топологию кластера, чтобы все участники коллектива могли обмениваться информацией с минимальными задержками.
С ростом числа таких задач увеличивались и масштабы обучений — у нас есть обучения, в которых задействованы уже тысячи GPU. Всё это потребовало доработок планировщика YTsaurus, и с внедрением поддержки GPU‑планирования машинное обучение и batch‑инференс начали постепенно переезжать в YTsaurus. Сегодня внутри Яндекса практически все такие задачи запускаются в нём.
Так YTsaurus стал не просто системой хранения и batch‑вычислений, а базой для построения ML‑инфраструктуры. Вокруг него начали формироваться инструменты для запуска обучений, batch‑инференса, работы с данными и мониторинга — всё в рамках одной экосистемы.
Поддержка GPU-нагрузок стала доступна и в открытой версии платформы, так что предлагаем вам поэкспериментировать с этим.
Что можно запустить самому
На воркшопе Yandex Scale 2025 мы предлагали участникам самостоятельно обучить модель и запустить batch‑инференс в кластере YTsaurus. А потом проанализировать результаты с помощью CHYT и DataLens.
Покажу, как самостоятельно выполнить практическую часть воркшопа: обучить модель, запустить batch‑инференс и проанализировать результаты в опенсорс‑версии YTsaurus, на демостенде YTsaurus или в вашем кластере Managed Service for YTsaurus в Yandex Cloud. Выполнив все шаги, вы поймёте, как YTsaurus работает с типовыми ML‑задачами.
В качестве примера будем использовать опенсорсную нейросеть ultralytics YOLO, которая умеет распознавать объекты на изображениях — например, животных, здания, еду и так далее. Датасет с изображениями, а также код обучения и код запуска модели мы подготовили заранее.
Вы будете запускать обучение, обнаружение объектов и анализ результатов из JupyterLab, а вся обработка и хранение данных будет происходить в кластере YTsaurus.
YTsaurus позволяет выводить изображения и структурированные данные прямо в UI просмотра таблиц. Можно использовать это для просмотра результатов обнаружения объектов на изображениях:

На скриншоте вы видите таблицу, в одной колонке которой хранятся изображения, а в другой — структурированные данные (JSON).
С чего начинаем
Выбор кластера YTsaurus
Чтобы приступить к работе, создайте кластер или получите доступ к существующему. Это можно сделать одним из трёх способов:
запросить доступ к демостенду (самый простой вариант на сегодня);
создать опенсорс‑кластер самостоятельно на своих серверах или виртуальных машинах в облаке поверх Kubernetes;
Настройка кластера
Если вы используете демостенд, то дополнительной настройки не требуется — можно сразу открывать JupyterLab по ссылке, которая пришла вам в почте. Найдите в нём папку ML workshop, внутри него Workbook, и в нём вы увидите ссылку на инструкцию.
Если вы создали кластер YTsaurus самостоятельно, его нужно подготовить — чек-лист под спойлером.
Готовим свой кластер
Убедитесь, что в вашем кластере настроен CHYT и есть клика с
alias=ch_public. Это позволит вам выполнять CHYT‑запросы. Можно проверить в UI YTsaurus в разделе Cliques и создать клику по руководству (укажитеalias=ch_publicи не менее 26 Gb RAM).Вам потребуется JupyterLab с доступом к кластеру:
Если вы установили свой опенсорс‑кластер, вам также необходимо установить JupyterLab. Вы можете как запустить его отдельно от YTsaurus, так и внутри кластера YTsaurus.
Если вы создали свой кластер в Yandex Cloud, вы можете использовать JupyterLab, входящий в состав DataSphere, или установить свой JupyterLab вне облака.
В воркшопе используется DataLens для демонстрации возможности анализа данных YTsaurus в BI‑системе. Вам потребуется инсталляция DataLens, если вы хотите пройти сценарий по анализу результатов запуска нейросети:
В Yandex Cloud для индивидуальной работы DataLens можно использовать бесплатно. Для командной действует единый тариф с оплатой по рабочим местам.
Альтернативно вы можете установить свою версию DataLens вне облака.
Вам потребуется как минимум 10 Гб памяти на exec‑ноде кластера YTsaurus для обучения и инференса используемой в воркшопе модели без GPU. Пример конфигурации можно посмотреть здесь.
Чтобы при запуске операций в YTsaurus у вас в консоли выводились ссылки на ваш кластер, вы можете выполнить следующую команду, заменив
<ytsaurus-endpoint>на адрес вашего кластера (напримерyt-7b25376a.demo.ytsaurus.tech) и<cluster-name>на название вашего кластера (напримерcluster):echo '{ "query_link_template" = "https://<ytsaurus-endpoint>/<cluster-name>/queries/{id}"; "enable_proxy_discovery" = %false; "http_proxy_discovery_url" = "api/v4/discover_proxies?type=http"; "operation_link_template" = "https://<ytsaurus-endpoint>/<cluster-name>/operations/{id}/details"; }' | yt set //sys/client_config/defaultВ кластере должен быть настроен CRI. Чтобы вы могли скачивать большие ML‑образы для прохождения сценариев, увеличьте
apiRetryTimeoutSecondsдля таймаута job на exe‑нодах до 600 секунд или больше по рекомендациям здесь.
Запускаем сценарии ML-обучения и инференса
Теперь, когда кластер готов, можно переходить к запуску в нём ML‑обучения и инференса. Всего в практической части мы предлагаем пять сценариев:
Обучение нейросети в YTsaurus.
Запуск нейросети в YQL‑запросе.
Запуск нейросети из Python API (например, для повторяющихся запусков по расписанию).
Анализ результатов работы нейросети в CHYT.
Визуализация результатов в DataLens.
Подробное пошаговое прохождение каждого из сценариев вы найдёте в инструкции.
А далее я покажу пару конкретных сценариев работы, которые можно будет попробовать, обозначу их возможности и ограничения. Затем пройдёмся по конкретным шагам для запуска вручную ML‑экспериментов с помощью YQL‑запроса.
Обучение ML-модели в YTsaurus
В этом сценарии можно запустить обучение нейросети в YTsaurus с помощью Python API из JupyterLab. YTsaurus создаст операцию Vanilla с одной джобой, в ней — контейнер из docker‑образа ultralytics, а затем запустит в нём скрипт обучения train.sh, который скачает датасет в виде файла coco128.zip из Кипариса (распределённой файловой системы YTsaurus). В конце YTsaurus запишет результирующие веса модели обратно в Кипарис (файл yolo‑starter.pt):

В этом скрипте мы обучаем модель с нуля на маленьком датасете COCO128, который можно скачать здесь. Обучение происходит в несколько эпох — это не полное обучение, а только его начало для демонстрации. На выходе получится не до конца обученная модель.
Демонстрационный пример показывает способ запуска обучения в YTsaurus. В реальных сценариях, например, если датасет большой, мы обычно храним его в виде таблицы, чтобы скачивать частями, а не весь датасет одним файлом.
Дальше я рассмотрю сценарий, где мы будем использовать модель, которая прошла всё обучение на полном датасете.
Запуск нейросети в YQL-запросе
В таком сценарии можно запустить нейросеть в YTsaurus в YQL‑запросе. Этот способ удобен для экспериментирования вручную и комбинации разных этапов в одном запросе: например, подготовки датасета, запуска нейросети и анализа результатов.
Чтобы не вводить запрос вручную, мы сгенерируем его из файла yql-infer.sql в ноутбуке JupyterLab. YQL‑запрос запустит Map‑операцию, в которой каждая джоба запустит yql-infer.py в указанном docker‑образе и передаст каждое изображение из входной таблицы images в python‑функцию find_objects. Функция find_objects отправляет изображения в нейросеть и возвращает аннотированные изображения и обнаруженные объекты в выходную таблицу objects.

Мы будем использовать веса нейросети, которая обучалась так же, как в сценарии выше, но на полном датасете.
Пройдём эксперимент по шагам
Шаг 1. Прежде чем запускать нейросеть, посмотрим на датасет из картинок, которые будем подавать на вход модели. Откроем заранее подготовленный кластер YTsaurus: в списке это единственный кластер, кликнем по нему:

Шаг 2. Мы попали в навигацию по Кипарису — файловой системе кластера. Кликнем home, затем datasets, затем images, чтобы открыть изображения:

Шаг 3. Все картинки находятся в колонке image_data в таблице. Кликнем на иконку с глазом для просмотра одного из изображений:

Пример изображения:

Шаг 4. Теперь можно запускать обучение. Вернёмся в JupyterLab и откроем ноутбук Workshop.ipynb. В нём запустим ячейку «Запуск нейросети в YQL‑запросе», чтобы сгенерировать и запустить YQL‑запрос:

В выводе увидим ссылку на запрос следующего вида:
Operation started:
https://cnkms40n96dajboecgcv.ui.ytsaurus.yandexcloud.net/cluster/queries/...Шаг 5. Кликнем на появившуюся в выводе ссылку, после чего откроется окошко для ввода запросов. Там увидим сгенерированный запрос:

Чтобы отследить прогресс выполнения запроса, кликнем на вкладку Progress. Для просмотра детальной информации по запуску нейросети в операции Map кликнем YtMap:

Кликнем Jobs для просмотра детальной информации по каждой джобе, которая обрабатывает свою часть данных:

В списке джобов можно кликнуть Stderr для просмотра консольного вывода запуска нейросети. Это особенно пригодится, если в джобе произошла ошибка.
Если вы не видите джобов, измените фильтр State на All. Так вы увидите джобы, которые выполняются или уже завершились с ошибкой или без ошибки:

Также можно посмотреть, как ваша операция конкурирует с другими операциями на кластере. Для этого откроем вкладку Scheduling в меню слева и пролистаем вниз. На скриншоте видны объёмы ресурсов, запрошенные (Demand) и выданные (Usage) операциям других пользователей.

Шаг 6. Когда YQL‑запрос завершится успешно, результаты появятся в нижней вкладке. Если результатов много, вы увидите здесь только часть. Кликнем на иконку глаза, чтобы посмотреть размеченное изображение:

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

Шаг 7. Перейдём по дереву папок в свою папку //home/users/test, которую указали в YQL‑скрипте. Найдём в ней таблицу objects. В ней увидим обнаруженные объекты для каждого изображения в формате json и размеченные изображения.

Кликнем по иконке с глазом, чтобы просмотреть размеченное изображение:

Также в полной инструкции есть сценарий, где вы сможете запустить такой же инференс, напрямую (без использования YQL) с помощью Python API. Такой способ удобен, чтобы запускать нейросеть по расписанию или интегрироваться с существующим кодом.
Анализ результатов работы нейросети
Мы предлагаем два сценария для анализа результатов работы нейросети:
Визуализация с помощью CHYT‑запроса. Это самый простой и быстрый способ проанализировать и визуализировать данные.
Визуализация в BI‑системе на примере DataLens. Это более гибкий способ визуализации, который требует больше действий.
Покажу, как выглядит аналитика с использованием DataLens: система может подключаться к YTsaurus и использовать CHYT для быстрого доступа к данным.
В этом сценарии воркшопа вы соберёте дашборд с анализом результатов запуска нейросети. Для этого создаётся несколько компонентов в DataLens, и в результате данные визуализируются:

Пошагово эти сценарии также описаны в инструкции к воркшопу.
Что можно реализовать ещё
В этой статье я показал простой пример обучения в одной джобе. Яндекс таким же образом запускает большие распределённые обучения на сотни джобов, используя такие фреймворки, как pytorch. Это можете делать и вы.
Если вы хотите обсудить возможный сценарий применения YTsaurus или задать вопросы по примерам использования, пишите в комментарии или на почту info@ytsaurus.tech. А также присоединяйтесь к сообществу в Telegram — где мы обсуждаем опыт использования YTsaurus для решения разных задач.
