Data Scientist и инженеры по машинному обучению — самая востребованная работа в этом десятилетии. Чтобы получить одну из этих ролей, необходимо обладать знаниями и опытом в области наук о данных, начиная со статистики, обработки данных и заканчивая выбором модели, построением модели и ее развертыванием. Идеальным Data Scientist для большинства компаний будет тот, кто формулирует проблему данных, извлекает и обрабатывает данные, строит лучшую модель ML на основе бизнес-требований или требований к данным, а также создает сложный конвейер ML, который может автоматически получать последние фактические данные. настройте модель и дайте лучший прогноз на ходу. И желательно, чтобы все это делалось на облачных технологиях, чтобы смягчить головную боль, связанную с инфраструктурой.

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

Архитектура конвейера машинного обучения в Azure DataBricks

На приведенном выше рисунке показана архитектура конвейера машинного обучения. Давайте рассмотрим каждый компонент и функции один за другим

1. Настройщик моделей:

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

Существует несколько способов автоматической настройки и получения наилучших параметров для любой модели.

Пример автоматической настройки модели SARIMAX на Azure DataBricks показан в этой статье.

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



2. Озеро данных Azure (ADL):

Как только лучшие гиперпараметры найдены с помощью тюнера, они сохраняются в таблице SQL в озере данных Azure.

На изображении ниже показаны лучшие параметры, полученные для модели SARIMAX. Подробный код можно найти здесь

Эту таблицу можно сохранить в файле ADLS, выполнив приведенный ниже код.

3. Конструктор моделей:

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

4. Эксперименты ML Flow:

Каждый раз при построении моделей модель вместе с параметром и выходной метрикой модели сохраняются в экспериментах Azure MLFlow. Эксперименты Azure MLFlow подобны контейнерам, в которых можно хранить все запуски модели, а конкретный запуск модели можно зарегистрировать в реестре моделей.

Перейдите по ссылке ниже, чтобы понять, как создать эксперимент MLFlow.



columns=['Cosmatics', 'Processed_Food','Furniture','Books']
flow=[i for i in df['areacode'].unique()] 
experiment_id=4561542935716881  #-- experiment_id is the ID for the MLFlow experiment
for f in flow:
  data=df[df['areacode']==f]
  with mlflow.start_run(experiment_id=experiment_id):  # ----- Step1
    forecast=pd.DataFrame()
    for y_col in columns:
      smx = SARIMAX(
            data[c],
              order=best_param.loc[(best_param['area']==f) & (best_param['product']==y_col)]['pdq'].iloc[0],
              seasonal_order=best_param.loc[(best_param['area']==f) & (best_param['product']==y_col)]['pdqs'].iloc[0],
              enforce_stationarity=False,
              enforce_invertibility=False
          )
      model = smx.fit()                  # ----- Step 2
      
      #logging the model                 # ---- Step 3
      model_name="My-model-"+f+"-"+y_col
      print('logging :')
      print(model_name)
      mlflow.statsmodels.log_model(model, model_name)
    #logging model params                #  ---- Step 4
    mlflow.log_param("params",params[flow])
    mlflow.log_param("flow",flow)
    mlflow.log_param("exog","no")

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

Шаг 1. Запустите эксперимент MLflow. Модели машинного обучения будут зарегистрированы внутри этого эксперимента.

Шаг 2: Используйте параметр best_parameter, чтобы построить модели и сопоставить их с последними данными.

Шаг 3. Регистрация модели в эксперименте MLFlow.

Шаг 4: Зарегистрируйте все параметры, связанные с моделью, чтобы отслеживать их.

5. Регистратор моделей:

После того, как модели построены и сохранены в экспериментах MLFlow, регистратор моделей ищет и выбирает лучшие и последние модели из эксперимента и регистрирует их в реестре моделей в требуемой среде (Staging, Production или Archived).

6. Реестр моделей:

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

В приведенной ниже статье подробно объясняется, как переместить модель из эксперимента MLFlow в реестр моделей MLFlow и установить рабочую среду для каждой модели.



7. Прогноз модели:

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

columns=['Cosmatics', 'Processed_Food','Furniture','Books']
areas=[i for i in df['areacode'].unique()]
steps=10
#-- specify the model stage . This will help to load the model of this stage to make production. values can be Production and Staging
model_stage = 'Production'
#Get the forecast for number of steps
forecast=pd.DataFrame()
for t in areas:
  df_forecast=pd.DataFrame()
  for ctype in columns:
    # --- Create the model name dynamically 
    model_name='my-model-'+t+'-'+ctype   
    
    # -- create model uri to call the model from registry
    logged_model="models:/{model_name}/{model_stage}".format(model_name=model_name, model_stage=model_stage)    
    #logged_model=models[t][ctype]
    print("Predicting from :")
    print(model_name)
    
    #  -- load model from MLFlow model registry
    loded_model=mlflow.statsmodels.load_model(logged_model)
    
    # -- make predictions
    predictions = loded_model.get_forecast(steps=steps).predicted_mean
    
    # -- store model prediction in a dataframe
    df_pred = pd.DataFrame(predictions)
    df_pred.columns=[ctype]
    df_pred=df_pred.abs()
    df_forecast=pd.concat([df_forecast, df_pred], axis=1)
  df_forecast['Areas']=t
  forecast=forecast.append(df_forecast)

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

(Сценарий использования, объясняющий приведенный выше код, можно найти в этой статье)

С помощью вышеуказанной архитектуры можно обеспечить непрерывную интеграцию и развертывание конвейера машинного обучения с использованием Azure MLFLow.

Существует множество документов Databricks, объясняющих использование MLFLow. Если у вас есть какие-либо сомнения и вы хотите узнать о дополнительных методах выбора модели в MLFlow, пожалуйста, оставьте комментарий. Я постараюсь на них ответить.