Последние несколько месяцев мы усердно работали над завершением выпуска 0.5.0, и мы очень рады, наконец, поделиться с вами некоторыми подробностями об этой совершенно новой версии ZenML!

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

Полностью переработанный API

Если вы знакомы с предыдущими версиями ZenML, вас ждет огромный сюрприз. Больше никаких утомительных подклассов для каждого шага конвейера машинного обучения. Новый функциональный API ZenML позволяет просто украшать существующие функции, чтобы запускать их в конвейере ZenML. Пока входные и выходные данные ваших функций являются частью постоянно расширяющегося набора поддерживаемых типов данных, ZenML автоматически позаботится о сериализации и десериализации выходных данных ваших шагов. И если тип данных в настоящее время не поддерживается, ZenML позволяет вам легко создать собственный материализатор для запуска вашего кода в любом случае.

Давайте рассмотрим простой шаг, который нормализует изображения для обучения, чтобы увидеть, как новый API выглядит на практике:

@step
def normalize(images: np.ndarray) -> np.ndarray:
    """Normalize images so the values are between 0 and 1."""
    return images / 255.0

Обратите внимание на @step над функцией нормализации? Это все, что было необходимо для преобразования этого шага в ZenML, который можно использовать во всех ваших пайплайнах. Теперь все, что осталось сделать, это создать конвейер, использующий этот шаг, и запустить его:

@step
def load_data() -> np.ndarray:
    ...

@pipeline
def load_and_normalize_pipeline(
    load_data_step,
    normalize_step,
):
    # Connect the inputs and outputs of our pipeline steps
    images = load_data_step()
    normalize_step(images=images)

# Create and run our pipeline
load_and_normalize_pipeline(load_data(), normalize()).run()

Наше краткое руководство и краткое руководство — идеальное место, если вы хотите узнать больше о нашем новом API.

Стеки

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

  • Хранилище метаданных: хранит метаданные, такие как имена конвейеров и параметры, используемые для выполнения шагов конвейера.
  • Хранилище артефактов: хранит выходные данные всех шагов, выполненных как часть конвейера.
  • Оркестратор: выполняет конвейер локально или в облачной среде.

На диаграммах ниже показаны два примерных стека и их компоненты:

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

После настройки нескольких стеков для разработки и производства это так же просто, как позвонить

zenml stack set production_stack

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

Новый рабочий процесс после выполнения

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

# Get a pipeline from our ZenML repository
pipeline = Repository().get_pipeline(pipeline_name="my_pipeline")
# Get the latest run of our pipeline
pipeline_run = pipeline.runs[-1]
# Get a specific step of the pipeline run
evaluation_step = pipeline_run.get_step(name="evaluation_step")

# Use the step parameters or outputs
class_weights = evaluation_step.parameters["class_weights"]
evaluation_accuracy = evaluation_step.output.read()

В будущих версиях это будет основой, на которой мы будем строить визуализации, которые позволят вам легко сравнивать различные прогоны конвейера, улавливать дрейф данных и многое другое!

Тип подсказки

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

То, что лежит впереди

Переработка всего API ZenML потребовала огромных усилий, но мы очень довольны тем, что получилось (присоединяйтесь к нашему Slack, чтобы сообщить нам, согласны ли вы или у вас есть предложения по его улучшению)!

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

Майкл Шустер (Michael Schuster) — инженер по машинному обучению в ZenML.