Советы по оптимизации процесса обучения

Запуск задачи обучения на кастомном образе возможен только в том случае, если образ, на базе которого она запускается, собран на основе базового образа (подробнее в документации).

Кастомные образы поддерживаются для:

Важно

В базовые образы предустановлены основные библиотеки для машинного обучения (tensorflow, pytorch и т.д.). Мы не рекомендуем менять версии предустановленных базовых библиотек.

Работа на разных регионах размещения ресурсов

Christofari.V100 и Christofari.A100 имеют разные хранилища, поэтому содержимое каталога /home/jovyan не синхронизируется между хранилищами разных регионов размещения ресурсов. При работе в Библиотека client_lib важно обращать внимание на значение параметра region — иначе задачи уйдут в некорректный регион, то же самое касается логов. Подробнее см. в Вопросы и ответы про работу с разными регионами.

Важно выбирать подходящие версии образов для каждого региона. Образы для разных регионов не являются взамозаменяемыми. Например, для Christofari.A100, нужно использовать образы, имеющие в названии в названии префикс -a100 (например, jupyter-cuda11.0-tf2.4.0-pt1.7.1-gpu-a100).

Возникновение ошибки с кодом:

RuntimeError: CUDA error: device kernel image is invalid

означает, что вы пытаетесь запустить образы с версией cu10.* на Christofari.A100. Для запуска на Christofari.V100 и Christofari.A100 предназначены разные версии образов (у образов для Christofari.A100 есть суффикс a100), например:

  • cr.msk.sbercloud.ru/aicloud-jupyter/jupyter-cuda11.2-tf2.6.0-gpu:0.0.80 (для Christofari.V100)

  • cr.msk.sbercloud.ru/aicloud-jupyter/jupyter-cuda11.2-tf2.6.0-gpu-a100:0.0.80 (для Christofari.A100)

Подробнее см. Образы, используемые на платформе.

Кастомные образы

В случае обновления содержимого кастомного образа нужно загрузить его в Docker registry с новым тегом. Если загрузить новое содержимое образа со старым тегом, то обновленный образ может не запуститься.

Подробнее про кастомные образы в документации:

Примечание

Имя образа должно начинаться с маленькой буквы.

Когда первый раз запускается задача на образе (например image:0.0.1) — он попадает в кэш воркер-ноды. Следовательно, даже если в Docker registry повторно загрузить новое содержимое с тем же тегом (image:0.0.1) - на воркер-ноде будет использоваться версия, загруженная ранее. Поэтому нужно использовать разные теги 0.0.2, либо названия образов image1.

Режимы запуска задач обучения

В задачах обучения несколько режимов запуска:

  • horovod

  • pytorch (он же pytorch distributed dataparallel)

  • дополнительный режим binary в котором чуть больше контроля за командой запуска.

Если вы хотите самостоятельно запускать процессы на воркер-ноде, установите у задачи обучения параметр processes_per_worker=1.

Подробнее в разделе Методы для работы с задачами обучения.

Работа с данными

Особенность работы хранилища NFS (горячего файлового хранилища) в том, что оно наиболее эффективно при чтении файлов среднего и крупного размера (файлы размером более 1 МБ).

Предупреждение

Внутри одного каталога желательно хранить не более 10000 файлов размером более 1 МБ.

Например, если нужно хранить короткие текстовые строки или картинки в низком разрешении можно воспользоваться одним из форматов для хранения готовых датасетов:

Также возможно использовать любые бинарные форматы (parquet, hdf5).

Для pytorch dataloader на скорость работы с батчем могут влиять параметры num_workers, pin_memory. Рекомендуется проверить несколько значений для оптимальной работы на выделенном количестве ресурсов.

Ошибка CUDA out of memory

В случае возникновения ошибки CUDA out of memory можно попробовать уменьшить batch_size (подробнее про параметр).

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

В случае, если задача успешно запускается на небольшом количестве ресурсов (например, несколько карт), но останавливается с ошибкой CUDA out of memory на большом количестве карт, то можно попробовать уменьшить batch_size. Так как работы с активациями от большего количества карт занимают много памяти.

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

Диагностика ошибок

Для диагностики проблем с задачами рекомендуется установить параметр CUDA_LAUNCH_BLOCKING=1 через env_variables, подробнее в документации.

По логам можно определить, на каком воркере произошла ошибка, например:

Connection to lm-mpi-job-73933f62-c1d7-407c-8807-cfaa94f5d71c-mpiworker-2.lm-mpi-job-73933f62-c1d7-407c-8807-cfaa94f5d71c closed by remote host.