Последние несколько месяцев мы усердно работали над завершением выпуска 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.