Databricks — один из лучших вариантов среди специалистов по данным для запуска своих кодов машинного обучения. Чтобы помочь им управлять своими кодами и моделями, MLflow был интегрирован с Databricks.

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

Ниже вы найдете компоненты MLFlow и несколько других важных компонентов, которые были добавлены вместе с ним.

В этом блоге мы рассмотрим несколько компонентов — отслеживание, модели и реестр моделей.

Предпосылка

В этом блоге я использую Azure Databricks Runtime для машинного обучения, в частности бета-версию 8,3 ML.

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

Мы использовали набор данных о диабете индейцев пима (загрузите его здесь, а подробности см. здесь).

df = spark.table ('pima_indians_diabetes')
print(f"""There are {df.count()} records in the dataset.""")
df.show(5)

Обучайте и тестируйте наборы данных

Мы разделим набор данных на обучающие и тестовые наборы.

# Convert Spark DataFrame into Panda DataFrame
import pandas as pd
dataset = df.toPandas()
# Extract features & labels
X = dataset.iloc[:,:-1].values
y = dataset.iloc[:, -1].values
# Splitting the dataset into the Training set and Test set
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = \
    train_test_split(X, y, \
                     test_size = 0.25, \
                     random_state = 0)

Стандартное масштабирование

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

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

Введите Млфлоу

Мы начнем с включения или настройки регистрации всех параметров, метрик и артефактов, вызвав метод mlflow.autolog(). Это позволит избежать явного журналирования моделей, библиотек и параметров.

import mlflow
# Enable MLflow autologging for this notebook
mlflow.autolog()

Начать пробежку

Мы запустим MLflow, вызвав метод start_run.

with mlflow.start_run(run_name='Pima_Indians_Diabetes_KNN') as run:
  from sklearn.neighbors import KNeighborsClassifier
  knn = KNeighborsClassifier(\
                             n_neighbors = 5, \
                             weights = 'uniform', \
                             algorithm = 'auto', \
                             leaf_size = 20, \
                             p = 2, \
                             metric = 'minkowski', \
                             metric_params = None, \
                             n_jobs = None)
  knn.fit(X_train, y_train)
  
  # Predicting the Test set results
  y_pred_knn = knn.predict(X_test)
  
  from sklearn.metrics import accuracy_score
  acc_knn = accuracy_score(y_test, y_pred_knn)
  # Explicitly log the metric (optional)
  mlflow.log_metric("test_accuracy_score", acc_knn)
  print ("Test Accuracy Score: {}".format(acc_knn))

Мы попробуем передать KNeighborsClassifier с разными параметрами и сравним показатель точности. Все эти эксперименты будут отслеживаться Databricks. Нажмите значок Эксперимент в правом верхнем углу записной книжки, чтобы увидеть все запуски записной книжки.

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

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

Сравнение запусков вручную

Мы можем выбрать два/несколько экспериментов и сравнить их.

Databricks MLflow автоматически рассчитывает и регистрирует различные показатели, такие как — training_accuracy_score, training_f1_score, training_log_loss, training_precision_score, training_recall_score, training_roc_auc_score, training_score.

Мы также можем скачать прогоны в формате CSV.

Получить лучшую модель

Мы будем использовать mlflow.search_runs() для поиска и извлечения лучшей модели.

# Sort runs by their test accuracy; 
# in case of ties, use the most recent run
best_run = mlflow.search_runs(
 order_by  = ['metrics.test_accuracy_score DESC', \
                 'start_time DESC'], \
 max_results = 10).iloc[0]
print ("Test Accuracy Score: {}"\
       .format(best_run["metrics.test_accuracy_score"]))

Прогнозирование входных данных с помощью лучшей модели

model_loaded = mlflow.pyfunc.load_model(
  'runs:/{run_id}/model'.format(
    run_id=best_run.run_id
  )
)
 
best_model_predictions = model_loaded.predict(X_test[1:2])
print("Test prediction: {}".format(best_model_predictions))
print("Actual value: {}".format(y_test[1:2]))

Зарегистрируйте финальную модель в Model Registry.

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

import time
 
model_name = "pima_indians_diabetes"
model_uri = best_run.artifact_uri+"/model"
new_model_version = mlflow.register_model(model_uri, model_name)
 
# Registering the model takes a few seconds, 
# so add a delay before continuing with the next cell
time.sleep(5)

print ("Model Name: {}".format(new_model_version.name))
print ("Model Current Stage: {}"\
       .format(new_model_version.current_stage))
print ("Model Version: {}".format(new_model_version.version))

Мы можем просмотреть зарегистрированную модель в меню Models.

Управление жизненным циклом модели

Модель перехода на Staging

Мы можем продвигать код с Нет на Промежуточный или Рабочийс помощью пользовательского интерфейса или кода. Преобразование модели из Нет в Staging с помощью кода:

from mlflow.tracking import MlflowClient
client = MlflowClient()
client.transition_model_version_stage( \
      name=model_name, \
      version=new_model_version.version, \
      stage="Staging"
)

Модель перехода в производство

Мы можем продвигать нашу модель в Production программно или с помощью экрана Models. Мы будем использовать Запросить переход к, а не прямой Переход к.

Совместное использование моделей в рабочих пространствах

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

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

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

Шаг 1. Создайте токен в центральном реестре модели или удаленном реестре

Доступ к централизованному реестру поддерживается с помощью токенов личного доступа (PAT) Databricks. Поделитесь PAT с командами, которые хотят использовать реестр.

Шаг 2. Сохраните удаленный PAT в локальной рабочей области

Нам нужно хранить данную информацию PAT и удаленного хранилища в локальной секретной области Databricks.

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

# Install databricks-cli
pip install databricks-cli
# Configure databricks-cli to connect local workspace
databricks configure

Создайте секретную область (я использую Databricks Standard).

databricks secrets create-scope --scope my_prod_scope --initial-manage-principal users

После создания области необходимо настроить следующие ключи.

databricks secrets put --scope <my_prod_scope> --key <central_model_registry>-host
databricks secrets put --scope <my_prod_scope> --key <central_model_registry>-token
databricks secrets put --scope <my_prod_scope> --key <central_model_registry>-workspace-id

Шаг 3. Код для подключения к удаленному реестру и использования необходимых моделей

Создайте URI удаленного реестра:

#registry_uri = f'databricks://<scope>:<prefix>'
registry_uri = f'databricks://my_prod_scope:central_model_registry'

Укажите в удаленный реестр:

import mlflow
mlflow.set_registry_uri(registry_uri)

Проверьте текущий указанный реестр:

mlflow.get_registry_uri()

Перечислите все модели, доступные в удаленном реестре.

client = MlflowClient(tracking_uri=None, registry_uri=registry_uri)
registered_models = client.list_registered_models()
for model in registered_models:
  print ("Model Name: {}".format(model.name))

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

model = mlflow.pyfunc.load_model(f'models:/pima_indians_diabetes/Production')
import numpy as np
input = np.array([[-0.82986389, -1.26778492, 0.12192245, -0.19524251, -0.37696732, -0.70520517, -0.558692, -0.79908332]])
output = model.predict(input)
print ("Model predicted output:{}".format (output))

Вывод

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

использованная литература

Спасибо за чтение!! Если вам понравилось, хлопайте и делитесь !! Чтобы увидеть похожие сообщения, подпишитесь на меня в Medium, Blogger и LinkedIn.