Машинное обучение Microsoft Azure — это надежное предложение от Microsoft для улучшения операций машинного обучения в организациях. Это аналог Kubeflow от Microsoft, который упрощает управление, развертывание и обслуживание рабочих нагрузок машинного обучения. Короче говоря, организациям легче правильно использовать ML Ops. Однако текущее воплощение Машинного обучения Azure не очень хорошо задокументировано, предположительно, поскольку в настоящее время оно находится в стадии интенсивной разработки с частыми выпусками новых функций. Особенно интересной новой функцией, которая в настоящее время находится в предварительной версии, является интеграция между Azure Logic Apps и Машинным обучением Azure. В этой короткой статье показано, как отправить сообщение в канал Microsoft Teams в случае сбоя конвейера. Дополнительную информацию можно найти здесь: https://docs.microsoft.com/en-us/azure/machine-learning/how-to-use-event-grid

Разработка приложения логики

Обратите внимание, что мне пришлось вручную включить «Microsoft.Web» и «Microsoft.EventGrid» в моей подписке, которая является подпиской MSDN, которую я использую для тестирования. Ваш пробег может варьироваться в зависимости от конкретной конфигурации подписки. Вы можете включить поставщиков ресурсов на вкладке "Поставщики ресурсов" в сведениях о подписке.

Сначала перейдите в меню «События» вашего рабочего пространства:

Щелкните значок приложения логики. Приложение логики — это простой облачный обработчик событий с приятным графическим интерфейсом. Он будет использовать событие, созданное службой Azure, обрабатывать его и запускать некоторые действия, такие как отправка электронной почты, загрузка файла или подобное. В нашем случае приложение логики перехватит событие машинного обучения Azure типа Microsoft.MachineLearningServices.RunStatusChanged, проанализирует информацию, предоставленную в этом событии, и отправит сообщение в Microsoft Teams. Щелкнув значок Logic Apps в нашей рабочей области машинного обучения, вы перейдете к Logic Apps Designer. Сначала вы должны определить брокера сообщений. Здесь мы будем использовать сетку событий. К счастью, конструктор приложений логики настроен на это по умолчанию, поэтому нет необходимости настраивать его самостоятельно. Мы просто входим в систему, как показано на скриншоте ниже.

Это подводит нас к важной части: разработке логики обработки событий, отправляемых Машинным обучением Azure. Первое, что нам нужно сделать, это настроить тип событий, которые мы хотим обрабатывать. Это видно на скриншоте ниже. Мы хотим настроить таргетинг на тип ресурса Workspaces, так как мы используем Машинное обучение Azure, и тип события RunStatusChanged, поскольку мы хотим инициировать действие в сбойном конвейере. Вы можете найти «Имя ресурса» на панели «Свойства» в рабочей области машинного обучения — здесь оно должно называться «Идентификатор ресурса».

Перед дальнейшим уточнением логики рекомендуется изучить событие RunStatusChanged. Сериализацию такого события в формате JSON можно увидеть ниже.

{
    "headers": {
        "Connection": "close",
        "Accept-Encoding": "gzip,deflate",
        "Host": "prod-47.northeurope.logic.azure.com",
        "aeg-subscription-name": "XXX",
        "aeg-delivery-count": "0",
        "aeg-data-version": "2",
        "aeg-metadata-version": "1",
        "aeg-event-type": "Notification",
        "Content-Length": "983",
        "Content-Type": "application/json; charset=utf-8"
    },
    "body": {
        "topic": "/subscriptions/XXX/resourceGroups/Logic_app_test/providers/Microsoft.MachineLearningServices/workspaces/my_workspace",
        "eventType": "Microsoft.MachineLearningServices.RunStatusChanged",
        "subject": "experiments/a4badd35-1c73-4322-822a-a097442cedd4/runs/2a7b95bb-9a26-442e-8de7-93f451c8019f",
        "id": "1280a0fd-90dc-52d2-b26a-8baf5e268b26",
        "data": {
            "runStatus": "Completed",
            "experimentId": "a4badd35-1c73-4322-822a-a097442cedd4",
            "experimentName": "My-pipeline",
            "runId": "2a7b95bb-9a26-442e-8de7-93f451c8019f",
            "runType": "azureml.PipelineRun",
            "runTags": {
                "azureml.pipelineid": "47a6a7c1-3adb-4ad1-930f-b85d9e740ba7",
                "azureml.pipelineComponent": "pipelinerun"
            },
            "runProperties": {
                "azureml.runsource": "azureml.PipelineRun",
                "runSource": "Unavailable",
                "runType": "Schedule",
                "azureml.parameters": "{}",
                "azureml.pipelineid": "47a6a7c1-3adb-4ad1-930f-b85d9e740ba7"
            }
        },
        "dataVersion": "2",
        "metadataVersion": "1",
        "eventTime": "2021-04-28T04:33:45.5390469Z"
    }
}

Важным элементом здесь является тело. Поле «данные» в теле содержит необходимую нам информацию. В частности, нам нужно разобрать событие JSON и инициировать действие, когда выполняются три условия: runStatus — Failed, ExperimentName — My-pipeline, поскольку мы хотим только запустить его. для определенного конвейера, а runType — azureml.PipelineRun. Если бы у нас не было этого последнего условия, наше приложение логики запускалось бы дважды, поскольку каждый отдельный шаг в конвейере также создает событие. Обратите внимание, что приведенный выше пример взят из запланированного запуска, как показано в поле runProperties runType. Таким образом, мы могли бы дополнительно указать, чтобы запускались только запланированные запуски, а не одноразовые.

Следующим шагом является выбор операции «Разбор JSON» в категории «Операции с данными». Мы хотим работать непосредственно с полем данных, поэтому определяем это в поле содержимого. Нам нужно указать ожидаемую схему — для удобства я вставил ее сюда:

{
   "properties":{
      "experimentId":{
         "type":"string"
      },
      "experimentName":{
         "type":"string"
      },
      "runId":{
         "type":"string"
      },
      "runProperties":{
         "properties":{
            "_azureml.ComputeTargetType":{
               "type":"string"
            },
            "azureml.moduleid":{
               "type":"string"
            },
            "azureml.nodeid":{
               "type":"string"
            },
            "azureml.pipelinerunid":{
               "type":"string"
            },
            "azureml.runsource":{
               "type":"string"
            },
            "computeTargetType":{
               "type":"string"
            },
            "contentSnapshotId":{
               "type":"string"
            },
            "stepType":{
               "type":"string"
            }
         },
         "type":"object"
      },
      "runStatus":{
         "type":"string"
      },
      "runTags":{
         "properties":{
            "azureml.nodeid":{
               "type":"string"
            },
            "azureml.pipeline":{
               "type":"string"
            },
            "azureml.pipelineComponent":{
               "type":"string"
            },
            "azureml.pipelinerunid":{
               "type":"string"
            }
         },
         "type":"object"
      },
      "runType":{
         "type":"string"
      }
   },
   "type":"object"
}

Мы вставляем приведенную выше схему JSON для поля данных в операцию синтаксического анализа JSON, как показано на рисунке ниже:

Для всех будущих шагов, поскольку мы указали ожидаемую схему JSON, данные в поле данных доступны как динамическое содержимое. Поскольку наш вариант использования довольно прост, мы используем операцию Condition из категории Control. Кроме того, мы хотим опубликовать сообщение от Microsoft Teams, когда условие оценивается как True. Ниже показано, как это будет выглядеть:

И это все! Конечно, вы также можете отправить сообщение Slack или электронное письмо. Logic Apps имеет множество интеграций и является достаточно гибким и интуитивно понятным. Вам не нужно быть экспертом по Azure благодаря графическому интерфейсу, предоставленному в конструкторе.