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

В этом сообщении блога мы обучим простую регрессионную модель на наборе данных о жилье в США. Но прежде чем мы начнем, давайте посмотрим, как специалисты по данным используют ML Aide и какие компоненты содержит ML Aide.

Специалист по данным разрабатывает приложение для машинного обучения (зеленый прямоугольник), как обычно. Приложение машинного обучения отправляет все параметры, показатели и артефакты обучения (включая обученную модель) на веб-сервер ML Aide. Веб-сервер хранит эти данные в MongoDB и/или в S3. ML Aide может использовать любое хранилище, совместимое с S3 (например, min.io), и не ограничивается использованием AWS S3. Кроме того, ML Aide предоставляет пользовательский веб-интерфейс. Этот интерфейс обеспечивает доступ ко всем записанным экспериментам и сохраненным артефактам. ML Aide использует преимущества интеграции с любым поставщиком удостоверений (например, Active Directory, Google, Auth0, Keycloak и т. д.). Через поставщика удостоверений ML Aide может ограничить доступ к определенным пользователям или группам.

Помощник по настройке машинного обучения

Установить Докер

ML Aide разработан для облачных сред и работает на Docker и Docker Compose. Поэтому Докер должен быть установлен. В Windows и macOS Docker Compose будет автоматически установлен вместе с Docker. В системах Linux Docker Compose должен быть установлен отдельно.

Скачайте и запустите ML Aide в Docker

ML Aide поставляет конфигурацию Docker Compose. Конфигурация предназначена для локальных тестовых сред и содержит веб-сервер ML Aide, веб-интерфейс, MongoDB, min.io S3 и Keycloak в качестве поставщика удостоверений.

В рабочей среде вы, скорее всего, будете использовать существующего поставщика удостоверений вашей компании. Поставщик удостоверений должен быть доступен по доменному имени (а не по локальному хосту или IP-адресу). В противном случае MLAide не сможет выполнить вход OAuth2. Поэтому просто прописываем псевдоним в локальном hosts файле. Добавьте следующую запись в файл hosts. Файл расположен по адресу /etc/hosts (Unix) или C:\Windows\System32\drivers\etc\hosts (Windows).

127.0.0.1 keycloak.mlaide

В системах Unix вы можете использовать следующую команду, чтобы добавить запись в файл hosts.

echo ‘127.0.0.1 keycloak.mlaide’ | sudo tee -a /etc/hosts

Домен keycloak.mlaide будет преобразован в 127.0.0.1. Это означает, что теперь мы можем получить доступ к серверу Keycloak, работающему на локальном хосте, через keycloak.mlaide.

Загрузите и выполните Учебный сценарий ML Aide с github.com, чтобы легко запустить ML Aide в локальной среде Docker. Сценарий оболочки загрузит некоторые файлы конфигурации для запуска MongoDB, min.io и Keycloak. После загрузки скрипт запустит все службы, включая ML Aide.

mkdir ~/mlaide-tutorial
cd ~/mlaide-tutorial
curl https://raw.githubusercontent.com/MLAide/MLAide/master/demo/run-mlaide.sh --output ./run-mlaide.sh
./run-mlaide.sh

Теперь ML Aide должен быть запущен. Вы можете получить доступ к веб-интерфейсу на http://localhost:8880. Вы можете использовать один из следующих логинов:

  • имя пользователя=adam — пароль=adam1
  • имя пользователя=bob — пароль=bob1
  • имя пользователя=eve — пароль=eve1

Веб-сервер работает на http://localhost:8881. Вы также можете получить доступ к Keycloak через http://localhost:8884. Вы можете добавлять новых пользователей в Keycloak, используя учетную запись администратора (имя пользователя=admin — пароль=admin).

Установите клиент ML Aide Python

Обычно приложения Python всегда следует устанавливать в новой чистой среде. Для этого руководства мы рекомендуем диспетчер среды Python, такой как virtualenv в сочетании с pyenv. Конечно, вам не обязательно использовать virtualenv или вы можете использовать любой другой менеджер среды. Но во всех случаях вы должны установить зависимости pip dependencies.

# Open a terminal and navigate to the project directory
cd ~/mlaide-tutorial
# Install Python 3.9 (if not already present) via pyenv
pyenv install
# Install virtualenv (if not already present)
pip install virtualenv
# Create virtual environment
virtualenv .venv
# Activate virtual environment
source .venv/bin/activate
# Install all dependencies (including mlaide)
pip install scikit-learn pandas numpy mlaide

Подготовка учебника

Для обучения модели нам необходимо скачать Набор данных о жилищном секторе США. Сохраните файл в подкаталоге с именем data.

mkdir data
curl https://raw.githubusercontent.com/MLAide/docs/master/docs/tutorial/housing.csv --output ./data/housing.csv

MLAide структурирует все эксперименты внутри проектов. Проекты содержат эксперименты, запуски и артефакты. Для этого урока нам нужно создать новый проект с именем USA Housing. MLAide автоматически установит ключ проекта на usa-housing.

Как вы узнали на предыдущем шаге, ML Aide использует Keycloak для авторизации пользователей. Авторизоваться из веб-интерфейса легко, просто используя один из указанных выше учетных данных. Чтобы авторизовать ваше приложение машинного обучения Python в ML Aide, вам понадобится ключ API. Ключ API позволяет получить доступ к ML Aide без ввода учетных данных. Чтобы получить ключ API, выполните следующие действия:

  • В правом верхнем углу нажмите на адам › Настройки
  • Перейдите к ключам API в левой панели навигации.
  • Нажмите «Добавить ключ API».
  • Введите любое описание и нажмите «Создать».
  • Скопируйте ключ show API и сохраните его в надежном месте. Ключ API больше не будет отображаться. Если вы потеряете ключ API, вам придется создать новый.

Обучите модель ML с помощью ML Aide

Подготовка данных

Наша подготовка данных будет реализована в data_preparation.py. Поэтому создайте новый файл с этим именем. Чтобы создать соединение с веб-сервером ML Aide с клиентами Python, вы должны использовать mlaide.MLAideClient. Объект этого класса является основной точкой входа для всех видов операций. Замените api_key своим ключом API, который вы создали с помощью веб-интерфейса ML Aide.

from mlaide import MLAideClient, ConnectionOptions
import pandas as pd
options = ConnectionOptions(
    server_url='http://localhost:8881/api/v1', # the ML Aide demo server runs on port 8881 per default
    api_key='<your api key>'
)
mlaide_client = MLAideClient(project_key='usa-housing', options=options)

Прежде чем мы прочитаем или обработаем что-либо, мы должны начать отслеживать всю соответствующую информацию в ML Aide. В ML Aide прогон является ключевой концепцией для отслеживания параметров, метрик, артефактов и моделей. Все прогоны относятся к одному или нескольким экспериментам.

run_data_preparation = mlaide_client.start_new_run(experiment_key='linear-regression', run_name='data preparation')

Теперь мы можем прочитать и обработать этот набор данных. Также мы можем зарегистрировать набор данных как артефакт в ML Aide. Это дает нам возможность воспроизвести следующие шаги — даже если набор данных потерян, удален или изменен. Артефакт можно использовать в других прогонах в качестве входных данных. Это помогает отследить происхождение модели машинного обучения до ее корня. В конце не забудьте отметить прогон как выполненный.

housing_data = pd.read_csv('data/housing.csv')
# add dataset as artifact
artifact = run_data_preparation.create_artifact(name="USA housing dataset", artifact_type="dataset", metadata={})
run_data_preparation.add_artifact_file(artifact, 'data/housing.csv')
run_data_preparation.set_completed_status()

Запустите свой скрипт Python, используя вашу оболочку с python data_preparation.py. После завершения скрипта проверьте веб-интерфейс, чтобы увидеть созданный запуск и артефакт.

Обучение модели

Код для обучения модели будет записан в новый файл с именем training.py. Вначале нам понадобится импорт, и мы создадим подключение к веб-серверу ML Aide.

from mlaide import MLAideClient, ConnectionOptions, ArtifactRef
import pandas as pd
import numpy as np
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, Lasso
from sklearn import metrics
options = ConnectionOptions(
    server_url='http://localhost:8881/api/v1', # the ML Aide demo server runs on port 8881 per default
    api_key='<your api key>'
)
mlaide_client = MLAideClient(project_key='usa-housing', options=options)

Как видите, мы реализуем эти шаги в другом файле, чем предварительная обработка данных. Поэтому нам как-то нужно получить наши входные данные. Мы могли бы снова прочитать CSV. Или мы можем получить CSV-файл от ML Aide. В этом случае мы будем читать содержимое файла из ML Aide. На предыдущем шаге мы сохранили файл как артефакт с именем «Набор данных о жилье в США». Отсутствие версии означает, что мы хотим получить последнюю версию артефакта.

dataset_bytes = mlaide_client.get_artifact('USA housing dataset', version=None).load('data/housing.csv')
housing_data = pd.read_csv(dataset_bytes)

Обычно разделение производится случайным образом. ML Aide поможет вам сохранить воспроизводимость.

Мы начинаем новый прогон, чтобы отследить раскол. Кроме того, мы устанавливаем набор данных в качестве входного артефакта.

artifact_ref = ArtifactRef(name="USA housing dataset", version=1)
run_pipeline_setup = mlaide_client.start_new_run(experiment_key='linear-regression', run_name='pipeline setup', used_artifacts=[artifact_ref])

Теперь мы разделяем наш набор данных и связываем всю информацию, связанную с разделением, с нашим прогоном. В этом случае мы хотим отслеживать все аргументы (test_size и random_state) функции train_test_split().

X = housing_data[['Avg. Area Income', 'Avg. Area House Age', 'Avg. Area Number of Rooms', 'Avg. Area Number of Bedrooms', 'Area Population']]
y = housing_data['Price']
test_size=0.3
random_state=42
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)
run_pipeline_setup.log_parameter('test_size', test_size)
run_pipeline_setup.log_parameter('random_state', random_state)

Если вы внимательно посмотрите на данные, вы увидите, что все значения X должны быть масштабированы, прежде чем мы сможем их использовать. Мы используем StandardScaler sklearn. Масштабатор, который будет здесь установлен, также должен использоваться позже для прогнозирования новых значений. ML Aide упрощает эту задачу, просто сохраняя масштабировщик (или весь конвейер) в ML Aide как артефакт. Артефакт можно загрузить позже в отдельном процессе прогнозирования.

pipeline = Pipeline([('std_scalar', StandardScaler())])
X_train = pipeline.fit_transform(X_train)
X_test = pipeline.transform(X_test)
run_pipeline_setup.log_model(pipeline, model_name="pipeline")
run_pipeline_setup.set_completed_status()

После разделения поезд-тест мы можем подобрать модель линейной регрессии. Мы запускаем новый запуск и связываем набор данных и конвейер как входные артефакты.

dataset_artifact_ref = ArtifactRef(name="USA housing dataset", version=1)
pipeline_artifact_ref = ArtifactRef(name="pipeline", version=1)
run_linear_regression = mlaide_client.start_new_run(experiment_key='linear-regression', run_name='linear regression', used_artifacts=[dataset_artifact_ref, pipeline_artifact_ref])

Теперь просто установите свою модель, как обычно. После этого вы можете зарегистрировать модель с log_model() в ML Aide.

lin_reg = LinearRegression(normalize=True)
lin_reg.fit(X_train,y_train)
run_linear_regression.log_model(lin_reg, 'linear regression')

Наконец, мы вычисляем некоторые метрики модели. Метрики также будут отслеживаться в ML Aide.

test_pred = lin_reg.predict(X_test)
train_pred = lin_reg.predict(X_train)
mae = metrics.mean_absolute_error(y_test, test_pred)
mse = metrics.mean_squared_error(y_test, test_pred)
rmse = np.sqrt(metrics.mean_squared_error(y_test, test_pred))
r2 = metrics.r2_score(y_test, test_pred)
cross_validation = cross_val_score(LinearRegression(), X, y, cv=10).mean()
run_linear_regression.log_metric('mae', mae) run_linear_regression.log_metric('mse', mse) run_linear_regression.log_metric('rmse', rmse) run_linear_regression.log_metric('r2', r2) run_linear_regression.log_metric('cross validation', cross_validation)
run_linear_regression.set_completed_status()

До сих пор мы создали три прогона (data preparation, pipeline setup и linear regression). Все эти прогоны относятся к эксперименту linear-regression.

Теперь мы обучаем другой тип модели — модель лассо-регрессии. Но мы хотим повторно использовать результаты подготовки данных и настройки пайплайна. С помощью ML Aide этого можно добиться, просто используя новый experiment_key и предоставляя артефакты предыдущих прогонов через used_artifacts.

dataset_artifact_ref = ArtifactRef(name="USA housing dataset", version=1)
pipeline_artifact_ref = ArtifactRef(name="pipeline", version=1)
run_lasso = mlaide_client.start_new_run(experiment_key='lasso-regression', run_name='lasso regression', used_artifacts=[dataset_artifact_ref, pipeline_artifact_ref])

Мы подходим к нашей модели, как обычно.

alpha = 0.1
precompute = True
positive = True
selection = 'random'
random_state = 42
run_lasso.log_parameter('alpha', alpha) run_lasso.log_parameter('precompute', precompute) run_lasso.log_parameter('positive', positive) run_lasso.log_parameter('selection', selection) run_lasso.log_parameter('random state', random_state)
model = Lasso(alpha=alpha, precompute=precompute, positive=positive, selection=selection, random_state=random_state)
model.fit(X_train, y_train)
run_lasso.log_model(model, 'lasso')

А теперь посчитаем некоторые метрики и для этой модели.

test_pred = model.predict(X_test)
train_pred = model.predict(X_train)
mae = metrics.mean_absolute_error(y_test, test_pred)
mse = metrics.mean_squared_error(y_test, test_pred)
rmse = np.sqrt(metrics.mean_squared_error(y_test, test_pred))
r2 = metrics.r2_score(y_test, test_pred)
cross_validation = cross_val_score(Lasso(), X, y, cv=10).mean()
run_lasso.log_metric('mae', mae)
run_lasso.log_metric('mse', mse)
run_lasso.log_metric('rmse', rmse)
run_lasso.log_metric('r2', r2)
run_lasso.log_metric('cross validation', cross_validation)
run_lasso.set_completed_status()

Запустите свой скрипт Python, используя вашу оболочку с python training.py. После завершения скрипта проверьте веб-интерфейс, чтобы увидеть созданные прогоны и артефакт.

Оценка модели

Сравнить прогоны

Ключевой особенностью ML Aide является сравнение нескольких прогонов с их параметрами и метриками. Поэтому откройте веб-интерфейс и выберите все прогоны, которые нужно сравнить. В данном случае мы хотим сравнить linear regression и lasso model. Установите два флажка и нажмите кнопку Compare в верхней части таблицы.

Вы увидите все параметры и метрики двух прогонов. Все значения, которые не равны, будут выделены.

Визуализация родословной

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

Перейдите в представление эксперимента и выберите эксперимент. Вы увидите все прогоны (синий цвет) и все артефакты ввода/вывода (красный цвет).

В таблице ниже показаны все прогоны и артефакты. Из таблицы запусков вы можете перейти к подробностям запуска или к сравнению запусков.

Постановка модели

В этом очень простом примере мы видим, что обе модели очень похожи. Мы можем выбрать любую из этих моделей и пометить ее как «готовую к производству». Это помогает отслеживать модели, которые используются в производстве, все еще находятся в стадии разработки (или контроля качества) или уже устарели.

ML Aide предоставляет следующие этапы для моделей:

  • Никто
  • Постановка
  • Производство
  • Устаревший
  • Заброшенный

Обслуживание моделей

До сих пор мы обучили две модели и оценили их. Теперь мы перезагрузим модель линейной регрессии, чтобы сделать некоторые прогнозы.

Наш код будет записан в новый файл с именем serving.py. Вначале мы создадим подключение к веб-серверу ML Aide.

from mlaide import MLAideClient, ConnectionOptions
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LinearRegression
import numpy as np
options = ConnectionOptions(
    server_url='http://localhost:8881/api/v1', # the ML Aide demo server runs on port 8881 per default
     api_key='<your api key>')
mlaide_client = MLAideClient(project_key='usa-housing', options=options)

Чтобы сделать некоторые прогнозы, мы хотим использовать модель линейной регрессии. Но прежде чем мы предскажем значения с помощью модели, мы должны использовать конвейер sklearn для преобразования наших входных векторов. Конвейер также хранился в ML Aide. Таким образом, мы можем загрузить оба из ML Aide.

# read the model
lin_reg: LinearRegression = mlaide_client.load_model('linear regression')
# read the pipeline containing the standard scaler
pipeline: Pipeline = mlaide_client.load_model('pipeline')

Теперь мы готовы использовать нашу модель. В этом случае мы жестко закодируем область дома для нашего прогноза. В реальных сценариях мы получили бы входные данные от HTTP-запросов или чего-то подобного.

# create some data for prediction
data = np.array([[80000, 6.32, 7.4, 4.24, 25000]])
# The values are
# - Avg. Area Income
# - Avg. Area House Age
# - Avg. Area Number of Rooms
# - Avg. Area Number of Bedrooms
# - Area Population
# predict the house price
data = pipeline.transform(data)
pred = lin_reg.predict(data)
print(pred) # output is: [1415072.9471789]

Вывод

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