Полное руководство по ZenML для начинающих, упрощающее MLOps

Полный курс ZenML для новичков упрощение MLOps

Вы новичок в Data Science, Machine Learning или MLOps и чувствуете себя ошеломленным выбором инструментов? Рассмотрите ZenML – инструмент оркестрации для оптимизации производственных конвейеров. В этой статье мы рассмотрим возможности и функции ZenML для упрощения вашего пути в MLOps.

Цели обучения

  • Понятия и команды ZenML
  • Создание конвейеров с использованием ZenML
  • Отслеживание метаданных, кэширование и версионирование
  • Параметры и конфигурации
  • Расширенные функции ZenML

Эта статья была опубликована в рамках Data Science Blogathon.

Сначала давайте поймем, что такое ZenML, почему он выделяется среди других инструментов и как им пользоваться.

Что такое ZenML?

ZenML является фреймворком с открытым исходным кодом для MLOps (операций машинного обучения) для Data Scientists, ML Engineers и MLOps Developers. Он способствует сотрудничеству при разработке готовых к производству конвейеров машинного обучения. ZenML известен своей простотой, гибкостью и независимостью от инструментов. Он предоставляет интерфейсы и абстракции, специально разработанные для рабочих процессов машинного обучения, позволяя пользователям интегрировать предпочитаемые инструменты без проблем и настраивать рабочие процессы в соответствии с их уникальными требованиями.

Почему мы должны использовать ZenML?

ZenML приносит пользу данных ученым, инженерам по машинному обучению и инженерам MLOps в нескольких ключевых аспектах:

  1. Упрощенное создание конвейера: Легко создавайте конвейеры машинного обучения с помощью ZenML, используя декораторы @step и @pipeline.
  2. Простое отслеживание метаданных и версии: ZenML предоставляет удобную панель инструментов для отслеживания конвейеров, запусков, компонентов и артефактов.
  3. Автоматическое развертывание: ZenML упрощает развертывание модели путем автоматического развертывания ее в случае определения как конвейера, что устраняет необходимость в пользовательских образах Docker.
  4. Гибкость облачных вычислений: Без проблем развертывайте свою модель на любой облачной платформе с помощью простых команд с ZenML.
  5. Стандартизированная инфраструктура MLOps: ZenML позволяет всем членам команды запускать конвейеры, настраивая ZenML как среду стадии и производства, обеспечивая стандартизированную настройку MLOps.
  6. Постоянная интеграция: Легко интегрируйте ZenML с инструментами отслеживания экспериментов, такими как Weights and Biases, MLflow и другими.

Руководство по установке ZenML

Чтобы установить ZenML в терминале, используйте следующие команды:

Установить ZenML:

pip install zenml

Для доступа к локальной панели инструментов установите с опцией server:

pip install "zenml[server]

Чтобы проверить, правильно ли установлен ZenML, и узнать его версию, выполните:

zenml version

Важные понятия ZenML

  1. Конвейер: Серия шагов в рабочем процессе машинного обучения.
  2. Артефакты: Входные и выходные данные из каждого шага в конвейере.
  3. Хранилище артефактов: Версионируемый репозиторий для хранения артефактов, повышающий скорость выполнения конвейера. ZenML по умолчанию предоставляет локальное хранилище, сохраняемое на вашей локальной системе.
  4. Компоненты: Конфигурации для функций, используемых в конвейере машинного обучения.
  5. Стек: Набор компонентов и инфраструктуры. В стандартный стек ZenML входят:
    • Хранилище артефактов
    • Оркестратор

Левая часть этого изображения – это кодовая часть, которую мы сделали в виде конвейера, а правая часть – это инфраструктура. Между ними существует четкое разделение, чтобы было легко изменять среду, в которой выполняется конвейер.

  • Варианты: Решения, созданные путем интеграции других инструментов MLOps с ZenML, расширяющие базовый класс компонентов.
  • Материализаторы: Определяют, как входные и выходные данные передаются между шагами через хранилище артефактов. Все материализаторы относятся к базовому классу Materializer. Вы также можете создавать пользовательские материализаторы для интеграции инструментов, отсутствующих в ZenML.
  • Сервер ZenML: Используется для развертывания моделей машинного обучения и выполнения предсказаний.

Важные команды ZenML

Команда для инициализации нового репозитория:

zenml init

Команда для запуска локальной панели управления:

zenml up

Вывод:

Команда для проверки состояния наших Zenml Pipelines:

zenml show

Команда для просмотра активной конфигурации стека:

zenml stack describe

CLI:

Команда для просмотра списка зарегистрированных стеков:

zenml stack list

Вывод:

Панель управления:

Создание вашего первого конвейера

Сначала нам нужно импортировать конвейер и шаг из ZenML для создания нашего конвейера:

# импортировать необходимые модули для создания шага и конвейера
        из zenml import pipeline, step
# определить шаг и вернуть строку.
        @stepdef sample_step_1() -> str:
            return "Добро пожаловать в"
# принять 2 входных данных и вывести результат.
        @stepdef sample_step_2(input_1: str, input_2: str) -> None:
            print(input_1 + "" + input_2)
# определить конвейер.
    @pipelinedef my_first_pipeline():
        input_1 = sample_step_1()
        sample_step_2(input_1, "Analytics Vidhya")
# выполнить конвейер.
    my_first_pipeline()

В этом образце конвейера мы создали два отдельных шага, которые затем были интегрированы в общий конвейер. Мы сделали это с помощью декораторов @step и @pipeline.

Панель управления: Наслаждайтесь визуализацией вашего конвейера

Параметры и изменение имени конвейера

Вы можете улучшить этот конвейер, введя параметры. Например, я покажу, как изменить имя выполнения конвейера на “Analytics Vidya run”, используя метод with_options(), указав параметр run_name.

# Здесь мы используем метод with_options() для изменения имени выполнения конвейера.
    my_first_pipeline = my_first_pipeline.with_options(
        run_name="Analytics Vidya run")

Вы можете увидеть новое имя здесь, на панели управления:

Если у шага есть несколько выходов, лучше использовать аннотации кортежей. Например:

# Здесь 4 выхода, поэтому мы используем Tuple. Здесь мы используем аннотации, чтобы указать,
 что они означают.
    def train_data() -> Tuple[
        Annotated[pd.DataFrame, "X_train"],
        Annotated[pd.DataFrame, "X_test"],
        Annotated[pd.Series, "Y_train"],
        Annotated[pd.Series, "Y_test"],]:

Мы также можем добавить дату и время.

# Здесь мы используем дату и время внутри заполнителей, которые
# будут автоматически заменены текущей датой и временем.
    my_first_pipeline = my_first_pipeline.with_options(
        run_name="new_run_name_{{date}}_{{time}}")
    my_first_pipeline()

Панель управления:

Кэширование

Кэширование ускоряет процесс выполнения конвейера, используя предыдущие результаты выполнения при отсутствии изменений в коде, экономя время и ресурсы. Чтобы включить кэширование, просто добавьте параметр вместе с декоратором @pipeline.

# здесь кэширование включено как параметр функции. @pipeline(enable_cache=True)def my_first_pipeline():

Иногда нам нужно динамически настраивать наш код или входные данные. В таких случаях вы можете отключить кэширование, установив enable_cache в False.

На панели инструментов уровни иерархии будут выглядеть следующим образом:

Вы можете использовать свойства модели для получения информации о конвейере. Например, в следующем примере мы получаем доступ к названию конвейера, используя model.name.

model=my_first_pipeline.modelprint(model.name)

Последний запуск конвейера можно увидеть по следующему коду:

model = my_first_pipeline.modelprint(model.name)# Теперь мы можем получить доступ к последнему запуску конвейераrun = model.last_runprint("last run is:", run)

Вывод:

Доступ к конвейеру с помощью интерфейса командной строки (CLI)

Вы можете получить конвейер, не полагаясь на определения конвейера, используя метод Client ().get_pipeline ().

Команда:

from zenml.client import Clientpipeline_model = Client().get_pipeline("my_first_pipeline")

Вывод:

Хотя вы можете удобно просматривать все ваши конвейеры и запуски на панели инструментов ZenML, стоит отметить, что вы также можете получить доступ к этой информации через клиента и интерфейс командной строки ZenML.

С помощью Client():

# здесь мы создали экземпляр клиента ZenML для использования метода list_pipelines()pipelines=Client().list_pipelines()

Вывод:

С помощью CLI:

zenml pipeline list

Вывод:

Панель инструментов:

CLI компоненты стека ZenML

Чтобы просмотреть все существующие артефакты, просто выполните следующую команду:

zenml artifact-store list

Вывод:

Панель инструментов:

Чтобы увидеть список оркестраторов,

zenml orchestrator list

Вывод:

Панель инструментов:

Чтобы зарегистрировать новое хранилище артефактов, выполните следующую команду:

zenml artifact-store register my_artifact_store --flavor=local

Вы также можете вносить изменения или удалять текущий хранилище артефактов, заменив ключевое слово “register” на “update” или “delete”. Для получения дополнительных сведений о зарегистрированном стеке вы можете выполнить команду:

zenml artifact-store describe my_artifact_store

Вывод:

Панель управления:

Как мы уже продемонстрировали для хранилища артефактов, вы также можете переключиться на другой активный стек.

zenml stack register my_stack -o default -a my_artifact_store

Как мы уже продемонстрировали для хранилища артефактов, вы также можете переключиться на другой активный стек.

zenml stack set my_stack

Теперь вы можете видеть, что активный стек успешно переключен с “default” на “my_stack”.

Панель управления: Здесь вы можете увидеть новый стек на панели управления.

Рекомендации и хорошие практики

1. Включите надежные практики журналирования в свой проект:

#import необходимых модулейfrom zenml import pipeline, stepfrom zenml.client import Clientfrom zenml.logger import get_loggerlogger=get_logger(__name__)#Здесь мы создаем конвейер с 2 шагами.@stepdef sample_step_1()->str:    return "Добро пожаловать в"@stepdef sample_step_2(input_1:str,input_2:str)->None:    print(input_1+" "+input_2)@pipelinedef my_first_pipeline():#Здесь 'logger' используется для регистрации информационного сообщения    logger.info("Это демонстрационный проект")    input_1=sample_step_1()    sample_step_2(input_1,"Analytics Vidya")my_first_pipeline()

Вывод:

2. Убедитесь, что ваш проект имеет хорошо структурированный шаблон. Чистый шаблон улучшает читаемость кода и упрощает его понимание другими, которые изучают ваш проект.

My_Project/                             # Репозиторий проекта├── data/                               # Папка с наборами данных├── notebook/ .ipynb                    # Файлы блокнотов Jupyter├── pipelines/                          # Папка конвейеров ZenML│   ├── deployment_pipeline.py          # Конвейер развертывания│   ├── training_pipeline.py            # Конвейер обучения│   └── *любые другие файлы├──assets├── src/                                # Папка с исходным кодом├── steps/                              # Папка шагов ZenML├── app.py                              # Веб-приложение├── Dockerfile(* Необязательно)├── requirements.txt                    # Список требуемых пакетов проекта├── README.md                           # Документация проекта└── .zen/

Для создания комплексного проекта MLOps от начала до конца рекомендуется придерживаться этого шаблона проекта. Всегда убедитесь, что ваши файлы шагов и файлы конвейеров организованы в отдельной папке. Включите подробную документацию для улучшения понимания кода. Папка .zen создается автоматически при инициализации ZenML с помощью команды “zenml init”. Вы также можете использовать блокноты для сохранения файлов блокнотов Colab или Jupyter.

3. При работе с несколькими выходами в шаге рекомендуется использовать аннотации Tuple.

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

ZenML Сервер и его развертывание

ZenML Сервер служит в качестве централизованной платформы для хранения, управления и выполнения конвейеров. Вы можете получить всеобъемлющее представление о его функциональности на рисунке ниже:

В этой настройке база данных SQLite хранит все стеки, компоненты и конвейеры. Ключевое слово «развертывание» означает создание прогнозов на основе тренированной модели с использованием данных в режиме реального времени в производственной среде. ZenML предлагает два варианта развертывания: ZenML Cloud и самостоятельное развертывание.

Порядок выполнения шагов

По умолчанию ZenML выполняет шаги в том порядке, в котором они определены. Однако этот порядок можно изменить. Давайте рассмотрим, как это сделать:

from zenml import pipeline@pipelinedef my_first_pipeline():# здесь мы указываем, чтобы шаг 1 выполнился только после шага 2.    sample_step_1 = step_1(after="step_2")    sample_step_2 = step_2()# Затем мы выполним шаг 3 после того, как будут выполнены и шаг 1, и шаг 2.        step_3(sample_step_1, sample_step_2)

В этом сценарии мы изменили порядок выполнения шагов по умолчанию. В частности, мы упорядочили выполнение шага 1 только после выполнения шага 2, а выполнение шага 3 – после выполнения шагов 1 и 2.

Включение/отключение журналов

Вы можете включить или отключить сохранение журналов в хранилище артефактов, изменив параметр “enable_step_logs”. Давайте посмотрим, как это сделать:

# Здесь мы отключаем журналы в шаге, указав параметр.@step(enable_step_logs=False)def sample_step_2(input_1: str, input_2: str) -> None:    print(input_1 + " " + input_2)

Output:

Before Logging:

After logging:

Типы настроек

В ZenML существует два типа настроек:

  1. Общие настройки: Эти настройки могут использоваться во всех конвейерах (например, настройки Docker).
  2. Настройки отдельных компонентов стека: Это настройки конфигурации, специфичные для времени выполнения, и они отличаются от статических настроек регистрации компонентов стека. Как пример, MLFlowTrackingURL является настройкой регистрации, в то время как имя эксперимента и его связанные настройки времени выполнения являются специфичными для компонента стека настроек. Специфические для компонента стека настройки могут быть изменены во время выполнения, но настройки регистрации изменить нельзя.

Планирование моделей по времени

Мы можем автоматизировать развертывание модели машинного обучения, запланировав его запуск в определенное время с помощью cron-задач. Это не только экономит время, но также гарантирует, что процесс будет выполняться в назначенное время без задержек. Давайте рассмотрим, как настроить это:

from zenml.config.schedule import Schedulefrom zenml import step,pipeline# Определяем шаг и возвращаем строку.@stepdef sample_step_1()->str:    return "Добро пожаловать в"# Принимаем 2 входных значения и выводим результат@stepdef sample_step_2(input_1:str,input_2:str)->None:    print(input_1+" "+input_2)    @pipelinedef my_first_pipeline():  logger.info("Это демонстрационный проект")  input_1=sample_step_1()  sample_step_2(input_1,"Analytics Vidya")# Здесь мы используем cron-задачу для планирования наших конвейеров.schedule = Schedule(cron_expression="0 7 * * 1")my_first_pipeline = my_first_pipeline.with_options(schedule=schedule)my_first_pipeline()

В этом контексте выражение CRON задачи имеет формат (минута, час, день месяца, месяц, день недели). Здесь я запланировал выполнение конвейера каждый понедельник в 7 утра.

Как альтернативу мы также можем использовать временные интервалы:

from zenml.config.schedule import Schedulefrom zenml import pipeline@pipelinedef my_first_pipeline():  input_1 = sample_step_1()  sample_step_2(input_1, "Analytics Vidya")#здесь мы используем datetime.now(), чтобы указать текущее время и#interval_second параметр, который используется для указания регулярных интервалов времени, в которые нужно выполняться.schedule = Schedule(start_time=datetime.now(), interval_second=3000)my_first_pipeline = my_first_pipeline.with_options(schedule=schedule)my_first_pipeline()

Я написал код для запуска нашего конвейера, начиная с текущего момента и повторяющегося каждые 5 минут.

Контекст шага

Контекст шага используется для доступа к информации о текущем выполняемом шаге, такой как его имя, имя выполнения и имя конвейера. Эта информация может быть полезна для целей ведения журнала и отладки.

#импорт необходимых модулейfrom zenml import pipeline, stepfrom zenml.client import Clientfrom zenml.logger import get_loggerfrom zenml.config.schedule import Schedulefrom zenml import get_step_context#Получаем объект журнала для текущего модуляlogger = get_logger(__name__)@stepdef sample_step_1() -> str:# получение контекста шага внутри функции шага    step_context = get_step_context()      pipeline_name = step_context.pipeline.name    run_name = step_context.pipeline_run.name    step_name = step_context.step_run.name    logger.info("Имя конвейера: %s", pipeline_name)    logger.info("Имя выполнения: %s", run_name)    logger.info("Имя шага: %s", step_name)    logger.info("Это демонстрационный проект")    return "Добро пожаловать в"@step()def sample_step_2(input_1: str, input_2: str) -> None: # получение контекста шага в этой 2-й функции шага       step_context = get_step_context()      pipeline_name = step_context.pipeline.name    run_name = step_context.pipeline_run.name    step_name = step_context.step_run.name    logger.info("Имя конвейера: %s", pipeline_name)    logger.info("Имя выполнения: %s", run_name)    logger.info("Имя шага: %s", step_name)    print(input_1 + " " + input_2)@pipelinedef my_first_pipeline():    input_1 = sample_step_1()    sample_step_2(input_1, "Analytics Vidya")my_first_pipeline()

Output:

Заключение

В этом исчерпывающем руководстве мы рассмотрели все, что вам нужно знать о ZenML, от его установки до расширенных функций, таких как настройка порядка выполнения, создание временных расписаний и использование контекстов шагов. Мы надеемся, что эти концепции, связанные с ZenML, помогут вам создавать конвейеры машинного обучения более эффективно, упрощая ваш путь в области MLOps.

Выводы

  1. ZenML упрощает создание конвейеров машинного обучения с помощью декораторов, таких как @step и @pipeline, что делает его доступным для начинающих.
  2. Панель управления ZenML предлагает простое отслеживание конвейеров, компонентов стека, артефактов и выполнений, упрощая управление проектом.
  3. ZenML без проблем интегрируется со другими инструментами MLOps, такими как Weights & Biases и MLflow, пополняя ваш набор инструментов.
  4. Контексты шагов предоставляют ценную информацию о текущем шаге, облегчая ведение журнала и отладку.

Часто задаваемые вопросы