Уроки машинного обучения, которые я усвоил за этот месяц

Автор: Дмитрий Иванов [Команда P9X]

~8 минут чтения

В машинном обучении всё то же самое.

Кодинг, ожидание результатов, их интерпретация, возвращение к кодингу. Плюс несколько промежуточных презентаций прогресса. Но то, что в основном всё одинаково, не означает, что учиться нечему. Скорее наоборот! Два-три года назад у меня появилась привычка ежедневно записывать уроки, которые я извлёк из своей работы в сфере машинного обучения. Просматривая некоторые из уроков этого месяца, я нашёл три практических урока, которые выделяются:

  1. Использование документов README для себя.
  2. Запрос срезов MIG вместо полных GPU.
  3. Распределение движений в течение дня.

Ведите README — для себя в будущем

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

Напишите один и для себя — особенно для себя в будущем.

Когда вы находитесь в середине проекта, все пути, команды и тонкие настройки живут в вашей голове. После паузы — уже не так. Недавно я столкнулся с этим, когда мне пришлось подготовить обновление для статьи. В исследованиях машинного обучения обзоры часто занимают месяцы. За это время вы переходите к следующему проекту с новыми наборами данных, новым кодом, новыми соглашениями. Когда наконец приходит отзыв, вы возвращаетесь к старому проекту и… тратите полдня на восстановление того, какой скрипт создал какую фигуру.

Это большой стресс, если скоро приближается дедлайн.

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

Что нужно зафиксировать (для вас)

Будьте практичны. Ваше будущее «я» не хочет прозы; им нужно «как»:

  • Быстрый старт проекта. Настройка среды, точная версия Python, файл env или команды conda/pip.
  • Расположение данных. Где находятся необработанные и обработанные данные; как загружать, кэшировать и проверять контрольные суммы. Обратите внимание на любые подводные камни (например, «плитки NDVI переворачиваются с юга на север после повторной выборки», как указано в моих старых постах).
  • Воспроизведение результатов. Одна команда на артефакт: фигуры, таблицы и контрольные точки.
  • Обучение и оценка. Точные команды для запуска основных экспериментов; как возобновить; как установить начальные числа.
  • Поиск гиперпараметров. Команда, которую вы фактически использовали, с диапазонами; где регистрируются результаты.
  • Распространённые ошибки. Всё, что вы знаете, что забудете (необходимые переменные среды, флаги GPU, соглашения об именах файлов).
  • Журнал изменений. Однострочные пули значимых изменений.

Минимальный общий шаблон, который вы можете адаптировать для всех проектов:

# <Название проекта>

## Быстрый старт
# env
conda create -n proj python=3.10 -y
conda activate proj
pip install -r requirements.txt

## Данные
# загрузка и предварительная обработка
python tools/download_data.py --out data/raw
python tools/preprocess.py --in data/raw --out data/processed

## Обучение
python train.py --cfg cfgs/base.yaml --seed 42

## Оценка
python eval.py --ckpt runs/exp123/best.ckpt --split test

## Воспроизведение рисунков
python scripts/fig_1.py  # выводит в figs/fig_1.png
python scripts/tab_2.py  # записывает tables/tab_2.csv

## Поиск гиперпараметров
python sweep.py --study local.pkl --n-trials 100

## Примечания / Ошибки
- Требуется CUDA 12.1
- Установите `WANDB_MODE=offline`, если нет интернета

Срезы MIG для быстрого планирования

Для обучения текущему поколению больших языковых моделей требуются сотни (или тысячи) высокопроизводительных графических процессоров. Но большинство повседневных задач в сфере машинного обучения не требуют моделей масштаба LLM. Многие проблемы решаются с помощью компактных CNN или небольших MLP — и им не нужен полный GPU A100/H100.

Запрос целого GPU для крошечной модели приводит к нерациональному использованию ресурсов и ставит вас в конец очереди. Я заново выучил это на собственном горьком опыте в этом месяце: я обучал четырёхслойный MLP и ждал очень долго, чтобы попасть в расписание. В своих запросах на планирование я запрашивал полный высокопроизводительный GPU. Конечно, они пользуются большим спросом у тех заданий, которые действительно в них нуждаются (например, тонкая настройка LLM).

Как только я переключился на срез MIG, задания начали выполняться немедленно, и скорость моих итераций резко возросла.

Что такое MIG и зачем его использовать?

MIG (Multi-Instance GPU) позволяет вам разделить недавний графический процессор NVIDIA на несколько изолированных «срезов». Один большой GPU становится до семи меньших виртуальных GPU, и полная оперативная память распределяется между этими срезами. По сути, каждый срез — это меньший GPU. И для многих рабочих нагрузок этих небольших срезов более чем достаточно.

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

Чтобы применить это на практике

  • Проверьте доступность. Спросите своих администраторов кластера или посмотрите в документации планировщика имена разделов MIG (например, 1g.10gb, 2g.20gb).
  • Подберите размер вашего запроса. Начните с малого. Если VRAM переполняется, увеличьте размер на один. Не устанавливайте по умолчанию полные GPU.
  • Профилируйте память заранее. Запустите небольшую партию, чтобы прочитать пиковую VRAM; выберите наименьший срез, который оставляет ~10–20% запаса.
  • Оформите шаблон вашего задания. Ведите скрипт задания для MIG и один для полных GPU; переключайтесь по флагу.

Борьба с длительным сидением с помощью движений

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

Это не лучшая позиция для длительного удержания, но в наши дни она довольно распространена. Для специалистов по машинному обучению компьютеры — это наш набор инструментов, и мы (должны) проводить значительное время с этим набором инструментов.

К счастью, нам не нужно проводить время в плохой позе, когда мы работаем на экране (нет, эти два понятия не связаны по определению).

Я понял это (опять же, потому что, похоже, я возвращаюсь к старым привычкам) в этом месяце: часы чтения, кодирования и встреч выдвинули мои плечи вперёд и заблокировали верхнюю часть спины. Затем, после нескольких дней интенсивного чтения статей, мои плечи напомнили мне, что нужно что-то изменить.

Решением, как оказалось, было легко, и оно не требует спортзала или полноценной тренировки. Оно просто требует чередования поз и кратковременных перекусов движением.

Я собрал небольшую программу, части которой использовал в течение дня (проверьте YouTube, если вы не знаете этих упражнений. Это метазнания, которые могут помочь вам выполнять свою работу лучше, дольше и здоровее):

  • Аудиовстречи: встаньте и походите. Если вы должны оставаться у стола, переходите в расщеплённую стойку (одна нога вперёд), чтобы раскрыть бёдра.
  • Двухминутные перезагрузки (например, после перерыва на кофе или после возвращения из принтера и т. д.):
    • Тяга к аудиодорожке или тяга к лицу (10–15 повторений)
    • Растяжка грудных мышц у стены (по 30–45 секунд с каждой стороны)
    • Растяжка сгибателей бедра / растяжка на диване (по 30–45 секунд с каждой стороны)
  • Блоки чтения стоя: распечатайте статью или читайте на планшете стоя; чередуйте блоки стояния и сидения.

Помимо этого, я обнаружил, что короткая утренняя сессия заставляет мои плечи чувствовать себя лучше и улучшает концентрацию в течение дня — приятный бонус, поскольку работа в сфере машинного обучения требует концентрации:

  • 5 мин лёгкого кардио (ходьба или подъём по лестнице)
  • 5 мин мобильности (вращения грудного отдела, круги плечами, глубокое приседание)
  • 5 мин лёгкой нагрузки (выпады, отжимания от стола, тяги с эспандером)

Часто выдвигаемый аргумент: разве все работы не выполняются перед нами? Или, другими словами: какая работа требует, чтобы мы работали руками за спиной? Верно, за исключением, возможно, гимнастов, практически все работы выполняются перед нами. Ведь именно там находятся наши глаза! Но: некомпьютерные работы разнообразят движения в течение дня: что-то снять с полки, что-то перетащить и т. д. Имеет значение именно чередование.