После успешного завершения обучения в аспирантуре и защиты докторской диссертации (PhD) известный исследователь искусственного интеллекта Янник Килчер (Yannic Kilcher) решил оглянуться на пройденный путь через призму своего профиля на GitHub. Автор критически и с юмором оценивает созданные им утилиты, называя большую часть своего старого кода «мусором», который, тем не менее, решал реальные задачи его лаборатории. Этот ретроспективный разбор позволяет понять, как молодые ученые самостоятельно автоматизировали свои рабочие процессы до появления современных коммерческих платформ.
🛠️ Инструменты на каждый день: от мониторинга GPU до автоматической синхронизации 0:14
Среди ранних проектов автора можно найти весьма разнообразные решения, начиная от генератора музыкальных клипов Clip music video и заканчивая нейросетью для игры в Minecraft, под которую Килчер специально готовил игровой мир. Однако среди множества мелких утилий выделяется проект GPU stat. По признанию исследователя, это самый популярный репозиторий, созданный им за время PhD, поскольку им до сих пор активно пользуются коллеги по лаборатории для мониторинга загрузки видеокарт и серверов.
Другой важной вехой автоматизации рутины стала утилита SRun. Ее логика работы проста:
- Копирование рабочей директории на удаленный сервер через протокол SSH.
- Запуск необходимого тренировочного скрипта непосредственно на сервере.
- Сбор результатов и их копирование обратно в локальную папку
logs.
Несмотря на ежедневное использование SRun, Килчер признается, что на момент написания кода не знал о существовании встроенных инструментов для создания временных директорий (temp dir). Из-за этого утилита обладала критической UX-проблемой: если пользователь случайно запускал команду не из папки с кодом, а из домашнего каталога, скрипт полностью синхронизировал всю домашнюю директорию пользователя на удаленный сервер.
👑 RAT — «корона» академической инженерии Килчера 2:31
Главным и наиболее сложным своим проектом времен аспирантуры Янник Килчер считает систему RAT (Research Automation Tool), предназначенную для комплексного управления экспериментами. Архитектура RAT включала в себя воркера, развернутого на сервере, базу данных MongoDB для хранения кода и очередь задач на базе Redis.
Ключевой особенностью воркера была проверка доступности графического процессора (GPU). Если видеокарта была занята, задача возвращалась обратно в очередь. По словам Килчера, это позволяло не только избегать конфликтов с коллегами, но и эффективно «перехватывать» освобождающиеся ресурсы: как только чужая задача завершалась, воркер RAT мгновенно занимал освободившийся GPU.
Помимо распределения задач, RAT обладал продвинутым функционалом:
- Генерация конфигураций на основе различных гиперпараметров.
- Встроенный оптимизатор гиперпараметров, поддерживающий как сеточный поиск (grid search), так и случайную выборку (random sampling).
- Функция автоматического слияния различных экспериментов.
- Интеграция с Tensorboard, при которой утилита автоматически скачивала файлы событий и переименовывала папки в соответствии с названиями использованных гиперпараметров для удобства анализа.
Автор отмечает, что добавил в систему флаг подтверждения (confirm) и команду полной очистки базы данных (delete all), чтобы защитить себя от случайных критических ошибок. Сегодня RAT, по мнению Килчера, скорее всего, не запустится из-за изменения зависимостей в Redis queue. Он подчеркивает, что создавал RAT вынужденно, так как в те годы популярных сегодня коммерческих платформ вроде Weights & Biases попросту не существовало.
📦 Велосипеды прошлого: YPlot, YPack и библиотека Fountain 5:31
Многие утилиты Килчера создавались для компенсации недостатков существовавшего тогда инструментария. Например, YPlot служила для построения графиков на основе данных из Tensorboard, хотя сейчас от нее осталась полезной лишь функция сглаживания из библиотеки SciPy. Набор рутинных функций для работы с фреймворками Torch и TensorFlow под названием YPack, а также библиотека Deep pool, по оценке автора, сегодня полностью утратили актуальность, так как их возможности стали частью стандартных библиотек.
Для генерации кросс-продуктов конфигураций экспериментов Килчер написал отдельный модуль ConfProd, снабдив его документацией и юнит-тестами. Еще одним амбициозным проектом была Fountain — собственная библиотека для работы с датасетами (по аналогии с CIFAR-10), которая автоматически скачивала и распаковывала данные. Килчер иронично называет ее «бесполезной вещью», поскольку современные экосистемы TorchVision и Hugging Face давно стандартизировали этот процесс.
В эпоху TensorFlow 1 управление чекпоинтами было нетривиальной задачей. Чтобы решить проблему несовпадения размерностей при восстановлении моделей, Килчер написал специальную утилиту, которая автоматически применяла случайную проекцию (random projection) для подгонки шейпов весов, если они не совпадали с новой архитектурой графа.
🔍 Парсеры arXiv и студенческая ностальгия 8:11
Помимо тяжелого ML-инструментария, Килчер разрабатывал мелкие утилиты для повышения личной продуктивности. К ним относится плагин для браузера Chrome, который автоматизировал сбор библиографических данных: он забирал BibTeX-записи из Google Scholar и интегрировал их прямо в интерфейс arXiv. Был написан и собственный парсер arXiv. Исследователь вспоминает, что в свое время задался целью прочитывать аннотации вообще всех новых статей по интересующим его направлениям каждое утро во время поездок в поезде.
Финальной точкой обзора стал самый первый публичный репозиторий Килчера, созданный еще во времена бакалавриата для курса по распознаванию образов. Это был классический классификатор на базе метода опорных векторов (SVM) с поддержкой линейного, полиномиального и RBF-ядер. С улыбкой автор критикует свой прошлый стиль программирования:
- Использование защищенных методов через двойное подчеркивание (dunder), что не рекомендуется в Python без явной архитектурной необходимости.
- Реализация нелинейного SVM без автоматического обратного распространения ошибки (backpropagation).
- Расчет параметров через квадратичное программирование вместо стохастического градиентного спуска (SGD).
Этот первый коммит, по словам автора, предопределил его дальнейшую карьеру в сфере машинного обучения, превратив разбор старых репозиториев в приятное ностальгическое путешествие.