Как пропустить уже выполненные шаги в конвейере kubeflow?
Я создаю конвейер машинного обучения в Kubeflow, и у меня есть вопрос. Есть ли что-нибудь из коробки, что позволяет мне настроить мой конвейер, чтобы шаг не запускался повторно, если его результат существует? Я подумал о способах сделать это вручную (либо проверка существующих выходов при компиляции конвейера, либо начальный шаг, который возвращает список шагов для запуска, либо ручная настройка, какие шаги запускать в качестве входного параметра) но я не могу найти собственный способ справиться с этим.
Обычным вариантом использования для меня было бы повторное выполнение шага модели без повторного запуска какой-либо предварительной обработки данных; но без необходимости иметь конкретный конвейер "разработки модели", который отличался бы от более общего продукта, который включал бы этап предварительной обработки данных. Или, возможно, я повторяю этап оценки, и мне даже не нужно переучивать, но я все равно хотел бы использовать тот же конвейер. Прямо сейчас коллеги используют несколько конвейеров, каждый из которых запускается на отдельном этапе, чтобы обойти это.
Я подхожу к этому с точки зрения уменьшения карты, где это тривиально - фреймворк автоматически определяет, какие выходные данные присутствуют, и не перестраивает их по умолчанию, но легко дает вам возможность перестроить некоторые или все из них. Может быть, это искажает мой способ работы с kubeflow?
Любая помощь приветствуется!
1 ответ
Хорошо, я подумал, что поставлю здесь то, что нашел, чтобы решить эту проблему.
По состоянию на сентябрь 2019 года, это не функция Kubeflow (по словам людей, работающих над ней), но в разработке есть функция кеширования, которая не должна повторно запускать какие-либо шаги, выходы которых существуют.
Тем временем я вручную реализовал его через pipelineParam 'startStep', из которого все нужно было перезапустить. Что-то вроде этого:
with dsl.Condition(first_step_to_run == "prep"):
create_ops(StartingStep.prep)
with dsl.Condition(first_step_to_run == "train"):
create_ops(StartingStep.train)
with dsl.Condition(first_step_to_run == "evaluate"):
create_ops(StartingStep.evaluate)
с методом create_ops, который понимает, в каком порядке создавать шаги, и соответствующим образом связывает их (на самом деле у нас семь шагов, поэтому я действительно хотел избежать копирования / вставки повсюду).