Пошаговое руководство по обучению, анализу и развертыванию контейнерного приложения машинного обучения Streamlit в Azure Kubernetes (AKS) с использованием Polyaxon.
Цели изучения этого руководства
- Краткое знакомство с контейнерами Kubernetes, Streamlit и Polyaxon.
- Создайте кластер Kubernetes и разверните Polyaxon с Helm.
- Как исследовать наборы данных в Jupyter Notebook, работающем в кластере Kubernetes.
- Как обучить несколько версий модели машинного обучения с помощью Polyaxon на Kubernetes.
- Как сохранить модель машинного обучения.
- Как анализировать модели с помощью пользовательского интерфейса Полаксон.
- Как экспонировать модель с пользовательским интерфейсом с помощью Streamlit и делать новые прогнозы.
Инструменты, необходимые для этого руководства
Что такое контейнер?
Контейнер - это стандартная единица программного обеспечения, которая упаковывает код и все его зависимости, поэтому приложение быстро и надежно перемещается из одной вычислительной среды в другую. Docker - это инструмент, предназначенный для упрощения создания, развертывания и запуска приложений с использованием контейнеров.
В нашем руководстве мы будем использовать контейнеры для упаковки нашего кода и зависимостей и их простого развертывания в Kubernetes.
Что такое Kubernetes?
Kubernetes - мощная распределенная система с открытым исходным кодом для управления контейнерными приложениями. Проще говоря, Kubernetes - это система для запуска и организации контейнерных приложений в кластере машин. Это платформа, предназначенная для полного управления жизненным циклом контейнерных приложений.
Зачем мне использовать Kubernetes.
- Балансировка нагрузки: автоматически распределяет нагрузку между контейнерами.
- Масштабирование: автоматическое масштабирование в сторону увеличения или уменьшения путем добавления или удаления контейнеров при изменении спроса, например в часы пик, выходные и праздничные дни.
- Хранилище. Обеспечивает согласованность хранилища для нескольких экземпляров приложения.
- Самовосстановление. Автоматически перезапускает контейнеры, которые терпят неудачу, и уничтожает контейнеры, не отвечающие на определенную пользователем проверку работоспособности.
- Автоматическое развертывание: вы можете автоматизировать Kubernetes, чтобы создать новые контейнеры для развертывания, удалить существующие контейнеры и перенести все их ресурсы в новый контейнер.
Что такое Streamlit?
Streamlit - это фреймворк с открытым исходным кодом для создания интерактивного красивого приложения для визуализации. Все в питоне!
Streamlit предоставляет множество полезных функций, которые могут быть очень полезны при создании визуализаций для проектов, управляемых данными.
Пример обозревателя Face-GAN с использованием Streamlit
Зачем мне использовать Streamlit?
- Простой и легкий способ создать интерактивный пользовательский интерфейс
- Требуется нулевой опыт разработки
- Приятно использовать разные функции в ваших проектах, основанных на данных :)
- Полная документация
Что такое полиаксон?
Polyaxon - это облачная платформа машинного обучения с открытым исходным кодом, которая предоставляет простые интерфейсы для обучения, мониторинга и управления моделями.
Polyaxon работает поверх Kubernetes, что позволяет увеличивать и уменьшать ресурсы вашего кластера, и предоставляет инструменты для автоматизации процесса экспериментов, отслеживая информацию о моделях, конфигурациях, параметрах и коде.
Почему мне следует использовать Polyaxon?
- Автоматически отслеживайте ключевые метрики модели, гиперпараметры, визуализации, артефакты и ресурсы, а также код и данные для контроля версий.
- Максимально используйте свой кластер, планируя задания и эксперименты с помощью интерфейса командной строки, панели инструментов, пакетов SDK или REST API.
- Используйте алгоритмы оптимизации, чтобы эффективно проводить параллельные эксперименты и находить лучшую модель.
- Визуализируйте, ищите и сравнивайте результаты экспериментов, гиперпараметры, обучающие данные и версии исходного кода, чтобы вы могли быстро проанализировать, что сработало, а что нет.
- Последовательно разрабатывайте, проверяйте, доставляйте и отслеживайте модели для создания конкурентного преимущества.
- При необходимости масштабируйте ресурсы и выполняйте задания и эксперименты на любой платформе (AWS, Microsoft Azure, Google Cloud Platform и локальное оборудование).
Что такое Хельм?
Helm - это менеджер пакетов для Kubernetes, он позволяет нам развертывать и управлять жизненным циклом облачных проектов, таких как Polyaxon.
Служба Azure Kubernetes
В этом руководстве мы будем использовать Службу Azure Kubernetes (AKS), полностью управляемую службу Kubernetes в Azure. Если у вас нет учетной записи в Azure, вы можете зарегистрироваться здесь для получения бесплатной учетной записи.
В будущих публикациях мы предоставим аналогичные инструкции по запуску этого руководства на Google Cloud Platform (GKE) , AWS (EKS) и локальный кластер с Minikube.
Настройка рабочего пространства
Цель этого руководства - получить практический опыт проведения экспериментов с машинным обучением и его развертывания в Kubernetes. Давайте начнем с создания нашей рабочей области.
Шаг 1. Разверните кластер Kubernetes с AKS
Давайте создадим простой кластер Kubernetes на AKS с одним узлом:
az aks create --resource-group myResourceGroup --name streamlit-polyaxon --node-count 1 --enable-addons monitoring --generate-ssh-keys
Чтобы убедиться, что вы находитесь в правильном кластере, вы можете выполнить команду
az aks get-credentials --resource-group myResourceGroup
--name streamlit-polyaxon
Шаг 2 - Установите Helm
Установите Helm на свой локальный компьютер, чтобы иметь возможность управлять Polyaxon, а также другими облачными проектами, которые вы, возможно, захотите запустить в Kubernetes.
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
Шаг 3. Добавьте полиаксонные диаграммы в Helm
helm repo add polyaxon https://charts.polyaxon.com
Шаг 4. Установите Polyaxon CLI
pip install -U polyaxon
Шаг 5 - развертывание Polyaxon в Kubernetes
polyaxon admin deploy
Шаг 6. Подождите, пока развертывания достигнут состояния готовности.
kubectl get deployment -n polyaxon -w
Это займет около 3 минут:
NAME READY UP-TO-DATE AVAILABLE AGE polyaxon-polyaxon-api 1/1 1 1 3m17s polyaxon-polyaxon-gateway 1/1 1 1 3m17s polyaxon-polyaxon-operator 1/1 1 1 3m17s polyaxon-polyaxon-streams 1/1 1 1 3m17s
Шаг 7. Откройте доступ к API и пользовательскому интерфейсу Polyaxon
Polyaxon предоставляет простую команду для безопасного доступа к панели управления и API на вашем локальном хосте:
polyaxon port-forward
Шаг 8 - Создайте проект на Polyaxon
В сеансе терминала, отличном от того, который использовался для отображения панели мониторинга, запустите:
polyaxon project create --name=streamlit-app
Тебе следует увидеть:
Project `streamlit-app` was created successfully. You can view this project on Polyaxon UI: http://localhost:8000/ui/root/streamlit-app/
Теперь мы можем перейти к следующему разделу: обучение и анализ модели.
Обучение модели машинного обучения
В этом уроке мы обучим модель классифицировать виды цветов ириса по их особенностям.
Характеристики радужки: чашелистик, лепесток, длина и ширина
Изучение наборов данных
Сначала мы начнем с изучения набора данных iris в сеансе записной книжки, запущенном в нашем кластере Kubernetes.
Давайте начнем новый сеанс записной книжки и подождем, пока он не перейдет в рабочее состояние:
polyaxon run --hub jupyterlab -w
Polyaxon предоставляет список высокопроизводительных компонентов, называемых концентратором, и позволяет запускать сеанс ноутбука с помощью одной команды. за кулисами Polyaxon создаст развертывание Kubernetes и автономную службу, а также представит службу с помощью API Polyaxon. Для получения более подробной информации посетите Центр открытых исходных кодов Polyaxon.
Через пару секунд ноутбук будет работать.
Примечание: если вы остановили предыдущую команду, вы всегда можете получить последнюю (кешированную) запущенную операцию, выполнив команду:
служба polyaxon ops
Давайте создадим новую записную книжку и начнем с изучения функций набора данных:
Выполненные команды:
from sklearn.datasets import load_iris iris= load_iris() print(iris.feature_names) print(iris.target_names) print(iris.data.shape) print(iris.target.shape) print(iris.target)
Набор данных о цветках ириса:
Изучение модели
Существуют различные классы алгоритмов, которые предлагает scikit-learn, в рамках этого руководства мы будем использовать алгоритм ближайшего соседа.
Прежде чем мы создадим надежный скрипт, мы поиграем с простой моделью в нашем сеансе записной книжки:
Выполненные команды:
from sklearn.neighbors import KNeighborsClassifier X = iris.data y = iris.target classifier = KNeighborsClassifier(n_neighbors=3) # Fit the model classifier.fit(X, y) # Predict new data new_data = [[3, 2, 5.3, 2.9]] print(classifier.predict(new_data)) # Show the results print(iris.target_names[classifier.predict(new_data)])
В этом случае мы использовали n_neighbors=3
и полный набор данных для обучения модели.
Чтобы изучить различные варианты нашей модели, нам нужно создать сценарий для нашей модели и параметризовать входные и выходные данные, чтобы легко изменять такие параметры, как n_neighbors
, нам также необходимо установить некоторый строгий способ оценки производительности модели.
Практический способ сделать это - создать процедуру оценки, в которой мы разделим набор данных на обучение и тестирование. Обучаем модель на обучающей выборке и оцениваем ее на тестовой.
scikit-learn предоставляет методы для разделения набора данных:
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1012)
Изготовление модели обучения
Теперь, когда мы установили некоторые методы, давайте создадим функцию, которая принимает параметры, обучает модель и сохраняет полученный результат:
Выполненные команды:
from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifier from sklearn import metrics from sklearn.datasets import load_iris try: from sklearn.externals import joblib except: pass def train_and_eval( n_neighbors=3, leaf_size=30, metric='minkowski', p=2, weights='uniform', test_size=0.3, random_state=1012, model_path=None, ): iris = load_iris() X = iris.data y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state) classifier = KNeighborsClassifier(n_neighbors=n_neighbors, leaf_size=leaf_size, metric=metric, p=p, weights=weights) classifier.fit(X_train, y_train) y_pred = classifier.predict(X_test) accuracy = metrics.accuracy_score(y_test, y_pred) recall = metrics.recall_score(y_test, y_pred, average='weighted') f1 = metrics.f1_score(y_pred, y_pred, average='weighted') results = { 'accuracy': accuracy, 'recall': recall, 'f1': f1, } if model_path: joblib.dump(classifier, model_path) return results
Теперь у нас есть сценарий, который принимает параметры для оценки модели на основе различных входных данных, сохраняет модель и возвращает результаты, но это все еще выполняется вручную, а для более крупных и сложных моделей это очень непрактично.
Проведение экспериментов с Polyaxon
Вместо того, чтобы запускать модель, вручную изменяя значения в записной книжке, мы создадим сценарий и запустим модель с помощью Polyaxon. Мы также будем регистрировать полученные метрики и модель, используя Модуль отслеживания Polyaxon.
Код модели, которую мы будем обучать, можно найти в этом репозитории на github.
Запуск примера с параметрами по умолчанию:
polyaxon run --url=https://raw.githubusercontent.com/polyaxon/polyaxon-examples/master/in_cluster/sklearn/iris/polyaxonfile.yml -l
Запуск с другими параметрами:
polyaxon run --url=https://raw.githubusercontent.com/polyaxon/polyaxon-examples/master/in_cluster/sklearn/iris/polyaxonfile.yml -l -P n_neighbors=50
Планирование нескольких параллельных экспериментов
Вместо того, чтобы изменять параметры вручную, мы автоматизируем этот процесс, исследуя пространство конфигураций:
polyaxon run --url=https://raw.githubusercontent.com/polyaxon/polyaxon-examples/master/in_cluster/sklearn/iris/hyper-polyaxonfile.yml --eager
Вы увидите, как интерфейс командной строки создает несколько экспериментов, которые будут выполняться параллельно:
Starting eager mode... Creating 15 operations A new run `b6cdaaee8ce74e25bc057e23196b24e6` was created ...
Анализируя эксперименты
Сортировка экспериментов по метрике их точности
Сравнение accuracy
с n_neighbors
Выбор лучшей модели по точности
В нашем скрипте мы использовали Polyaxon для регистрации модели каждый раз, когда запускаем эксперимент:
# Logging the model tracking.log_model(model_path, name="iris-model", framework="scikit-learn")
Развертывание модели как приложения для классификации радужной оболочки глаза
Мы развернем простое приложение с оптимизированной подсветкой, которое загрузит нашу модель и отобразит приложение, которое делает прогноз на основе функций и отображает изображение, соответствующее классу цветов.
import streamlit as st import pandas as pd import joblib import argparse from PIL import Image def load_model(model_path: str): model = open(model_path, "rb") return joblib.load(model) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument( '--model-path', type=str, ) args = parser.parse_args() setosa = Image.open("images/iris-setosa.png") versicolor = Image.open("images/iris-versicolor.png") virginica = Image.open("images/iris-virginica.png") classifier = load_model(args.model_path) print(classifier) st.title("Iris flower species Classification") st.sidebar.title("Features") parameter_list = [ "Sepal length (cm)", "Sepal Width (cm)", "Petal length (cm)", "Petal Width (cm)" ] sliders = [] for parameter, parameter_df in zip(parameter_list, ['5.2', '3.2', '4.2', '1.2']): values = st.sidebar.slider( label=parameter, key=parameter, value=float(parameter_df), min_value=0.0, max_value=8.0, step=0.1 ) sliders.append(values) input_variables = pd.DataFrame([sliders], columns=parameter_list) prediction = classifier.predict(input_variables) if prediction == 0: elif prediction == 1: st.image(versicolor) else: st.image(virginica)
Давайте запланируем приложение с помощью Polyaxon
polyaxon run --url=https://raw.githubusercontent.com/polyaxon/polyaxon-examples/master/in_cluster/sklearn/iris/streamlit-polyaxonfile.yml -P uuid=86ffaea976c647fba813fca9153781ff
Обратите внимание, что uuid 86ffaea976c647fba813fca9153781ff
будет другим в вашем случае использования.
Заключение
В этом руководстве мы прошли сквозной процесс обучения и развертывания простого классификационного приложения с использованием Kubernetes, Streamlit и Polyaxon.
Вы можете найти исходный код этого руководства в этом репо.