Большие надежды становятся нативными для Kubernetes

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

Отказ от ответственности: я не эксперт! Для меня это процесс обучения, поэтому то, что я здесь реализую, скорее всего, не самое оптимальное решение. Great Expectations имеет прямую интеграцию с Prefect и Dagster, поэтому теоретически его будет проще использовать с этими инструментами. Мне просто нравится Арго.

1. Настройка нашей среды

Для этого проекта я запускаю все на кластере Minikube. Я не буду подробно останавливаться на каждом аспекте и предполагаю, что у вас установлены kubectl и helm 3.

Сначала запустите свой кластер minikube:

minikube start --cpus 4

Я запускаю свой с 4 процессорами для других проектов, но это не обязательно для нашего примера, поэтому аргумент «процессор» является необязательным.

Затем установите рабочие процессы Argo:

kubectl create ns argo
kubectl apply -n argo -f https://raw.githubusercontent.com/argoproj/argo-workflows/master/manifests/quick-start-postgres.yaml

Нам нужно немного подождать, пока все встанет и заработает. Если вы видите какие-либо статусы «Ошибка» и «CrashBackLoopOff» для ваших модулей, не беспокойтесь, обычно это проходит само по себе в течение ~ 5 минут.

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

kubectl port-forward svc/argo-server 2746:2746 -n argo

Теперь перейдите на https://localhost:2746. Вы получите предупреждение системы безопасности от Chrome (к счастью, это не производственная система). Вы должны увидеть стартовый экран Argo Workflows.

Нажмите «ОТПРАВИТЬ НОВЫЙ РАБОЧИЙ ПРОЦЕСС», а затем «Редактировать, используя полные параметры рабочего процесса». Это даст вам пример Hello World, который вы можете запустить, нажав «+ Создать». Если все пойдет хорошо, вы должны увидеть что-то вроде следующего:

Нам все еще нужно кое-что сделать, чтобы получить удаленный доступ к нашему серверу Argo. Как ни странно, если я буду следовать документации Argo, это не сработает, поэтому вот модифицированная версия, которая должна позволить вам отправлять рабочие процессы из Hera.

kubectl create role hera --verb=list,update,create --resource=workflows.argoproj.io -n argo
kubectl create sa hera -n argo
kubectl create rolebinding hera --role=hera --serviceaccount=argo:hera -n argo
SECRET=$(kubectl -n argo get sa hera -o=jsonpath='{.secrets[0].name}')
kubectl -n argo get secret $SECRET -o=jsonpath='{.data.token}' | base64 --decode

Теперь следите за этим токеном. Теперь у нас есть рабочая установка Argo Workflows! Следующим шагом будет запуск экземпляра Minio в minikube. Это может быть легко достигнуто с помощью карт руля.

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install ge-minio bitnami/minio --namespace argo

В данном случае я решил установить его в пространство имен argo, просто чтобы не загромождать себя. Последняя команда выдаст некоторый вывод о том, как получить ваши учетные данные Minio. Запустите эти команды и сохраните результат где-нибудь. Теперь мы готовы создать корзину проекта. Чтобы убедиться, что у вас есть правильные учетные данные, и получить представление о Minio, перенаправьте его службу и перейдите на localhost:9001.

kubectl port-forward svc/ge-minio 9001:9001 -n argo

Здесь я создал корзину под названием «большие ожидания».

Наконец, давайте установим пакет Hera для создания рабочих процессов Argo на python.

pip install hera-workflows

Теперь мы настроены!

2. Компоненты конвейера

После этого давайте поговорим о нашем примере конвейера проверки данных.

  1. Faker: пакет Python для быстрого создания поддельных наборов данных.
  2. Большие надежды: пакет Python для проверки данных.
  3. Minio: Объектное хранилище по аналогии с Amazon S3.

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

С помощью Faker мы хотим сгенерировать пример Pandas Dataframe того, что может быть входными данными для конвейера обработки данных. Мы можем сделать это просто с помощью faker:

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

Теперь пришло время программно сгенерировать ожидания на основе этих данных. Я лично нашел это немного сложным, но я думаю, что мы доберемся до этого!

Теперь готовим на газу. У нас есть возможность генерировать поддельные данные, создавать из них набор проверки и запускать набор проверки. Чтобы добавить Minio, нужно просто заархивировать каталог /ge-store и поместить файл в нашу корзину с помощью python SDK. Хороший обзор представлен в Документации Minio.

3. Трубопроводы Арго

В последней части этого мы будем использовать Hera для создания и запуска наших тестовых пайплайнов. Чтобы правильно использовать Hera, нам нужен образ Docker, который покрывает все наши зависимости. Я сделал простой образ lambertsbennett/argo-ge:v1, чтобы запустить наш конвейер. Он основан на образе Python, поэтому он довольно большой.

Теперь давайте начнем с написания конвейера 1 для генерации и хранения наших ожиданий.

После множества мелких ошибок вот код, который сохраняет наш пакет Great Expectations в виде архива в корзине Minio.

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

Теперь, если мы перейдем к Minio и загрузим наш «ge-results.tar.gz» и заглянем внутрь, мы увидим подробные результаты наших усилий по проверке данных. Внутри архива в /uncommitted/data_docs/local_site мы видим index.html.

В этом наборе ожиданий есть несколько невероятно строгих правил, поэтому наша проверка не удалась.

Ну, я надеюсь, что это было интересно читать для кого-то. Код доступен на Github @ https://github.com/lambertsbennett/argo-great-expectations. Большие надежды кажутся очень мощными, но они очень сложные. К счастью, их документация довольно хороша. В будущем я буду работать над другими темами MLOP/Data Engineering/Data Science с использованием стеков на основе kubernetes и надеюсь написать об этом больше. Спасибо за чтение и, пожалуйста, оставьте комментарий, если у вас есть проблемы или идеи по улучшению!