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))
Вывод
В этом блоге мы увидели, как экспериментировать с моделями и параметрами, отслеживать наши эксперименты, управлять моделями машинного обучения, регистрировать окончательные модели в реестре моделей и делиться ими на предприятии. В следующем блоге мы увидим, как развернуть нашу модель для онлайн-обслуживания.
использованная литература
- Млфлоу
- Руководство по MLflow — Документация по Databricks
- Управление жизненным циклом модели
- Обмен моделями в рабочей области
Спасибо за чтение!! Если вам понравилось, хлопайте и делитесь !! Чтобы увидеть похожие сообщения, подпишитесь на меня в Medium, Blogger и LinkedIn.