Как сделать ML-эксперимент переносимым... без боли

ML-эксперимент уже готов, код работает, зависимости установлены, но теперь нужно запустить обучение на мощных GPU, которые... где-то в другом кластере. Знакомая ситуация?

И нужно не просто скопировать в целевой кластер пару рабочих скриптов, но и воспроизвести Python-окружение, разобраться с тяжёлыми CUDA и PyTorch, решить проблемы совместимости.

Долго, больно, косячно(

Вообще, существует несколько подходов к решению этой задачи.

Наиболее распространенный - сохраняем описание зависимостей в requirements.txt (или любой аналог для соответствующего пакетного менеджера) и заново скачиваем и ставим их в целевом кластере. Этот подход медленный и сильно зависящий от стабильности и доступности пакетного индекса.

Капитальный вариант - Docker-образ. Здесь мы в известной степени не зависим даже от операционной системы. Но пересобирать образ при частых изменениях кода и окружения и хранить разные версии образов весьма накладно.

Более продвинутый подход - conda-pack - плагин к популярному менеджеру пакетов и окружений Conda. Он упаковывает в переносимый архив даже бинарные зависимости. Однако привязка к определенной версии операционной системы сохраняется. И архив всё равно получается тяжёлым, но гораздо легче Docker-образа.

Самый быстрый вариант - venv-pack (от создателей conda-pack). Он упаковывает в переносимый архив Python-окружения, созданные через venv. Системные бинарные зависимости тут, конечно, остаются за бортом. Рассчитывать приходится только на их предустановку на сервер в целевом кластере.

У всех этих вариантов есть как плюсы, так и существенные минусы. Но можно придумать и свой подход;)

11