Пошаговое руководство по обучению, анализу и развертыванию контейнерного приложения машинного обучения 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.

Вы можете найти исходный код этого руководства в этом репо.