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

Ой! Да, я заявляю о машинном обучении Microsoft Azure, которое ускоряет сквозной жизненный цикл машинного обучения и быстро создает и развертывает модели машинного обучения с помощью инструментов, отвечающих вашим потребностям, независимо от уровня навыков. Кроме того, вы можете взаимодействовать со службой машинного обучения в любой среде Python, включая Jupyter Notebooks, Visual Studio Code или вашу любимую IDE Python с помощью Azure Machine Learning SDK. В этой статье я часто использовал SDK Azure ML, и он просто относится к пакету разработки программного обеспечения машинного обучения Azure.

Давайте перейдем к основной теме и обсудим, как я использовал пакет SDK машинного обучения Azure для прогнозирования ежемесячного дохода сотрудника? Вы можете найти полный проект в моем репозитории Github. Прежде чем приступить к работе, убедитесь, что вы выполнили следующие предварительные условия:

  • Учетная запись Microsoft Azure (достаточно бесплатной пробной версии).
  • Среда разработки Python.
  • Стабильный Интернет, действительно.
  • Azure ML SDK, установленный на вашей рабочей станции/ноутбуке.

Создать рабочую область и группу ресурсов:

Рабочая область — это фундаментальный объект, используемый в Azure ML. Давайте посмотрим, как создать его с помощью Azure ML SDK.

"""
Created on Tue Jun 22 17:24:45 2021

@author: hemachandrandhinakaran
"""
from hashlib import new
from os import path
from azureml.core import Workspace, Datastore, Dataset, Experiment

# create workspace
ws = Workspace.create(
    name="Demosdkmlworkspace",
    subscription_id="Your Subscription ID",
    resource_group="demosdkamlRG",
    create_resource_group=True,
    location="eastus2",
)
# write config
ws.write_config(path="/Users/hemz/Documents/GitHub/Machine_Learning/azuremlsdk/")

Это создаст рабочую область Demosdkmlworkspace. При создании рабочей области метод «write_config» сохранит конфигурацию рабочей области в нашем локальном каталоге, т.е. path = «/to/ какое-то/место”.

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

Создание эксперимента и RF-модели:

Главный девиз практикующего/инженера машинного обучения: «Экспериментируйте… Экспериментируйте… Экспериментируйте…». Microsoft предоставляет платформу для экспериментов для обучения всех ваших экспериментов с машинным обучением в ML Studio, а с помощью AzureML SDK для создания эксперимента достаточно всего нескольких строк кода. Давайте посмотрим, как создать его с помощью Azure ML SDK.

"""
Created on Tue Jun 22 17:24:45 2021

@author: hemachandrandhinakaran
"""
# -----------------------------------------------------
# This script will submit the experiment run to the
# local compute target and create the pkl files for
# column index object as well as the trained model.
# -----------------------------------------------------

# -----------------------------------------------------
# Import required classes from Azureml
# -----------------------------------------------------
from azureml.core import Workspace, Dataset, Experiment


# -----------------------------------------------------
# Access the Workspace and Datasets
# -----------------------------------------------------
print("Accessing the workspace....")
ws = Workspace.from_config("./config")

print("Accessing the dataset....")
az_dataset = Dataset.get_by_name(ws, "Adult Income")


# -----------------------------------------------------
# Create/Access an experiment object
# -----------------------------------------------------
print("Accessing/Creating the experiment...")
experiment = Experiment(workspace=ws, name="Webservice-exp001")


# -----------------------------------------------------
# Run an experiment using start_logging method
# -----------------------------------------------------
print("Start Experiment using Start Logging method...")
new_run = experiment.start_logging()


# --------------------------------------------------------
# Do your stuff here
# --------------------------------------------------------
import pandas as pd

# Load the data from the local files
print("Loading the dataset to pandas dataframe...")
df = az_dataset.to_pandas_dataframe()


# Create X and Y Variables
X = df.iloc[:, :-1]
Y = df.iloc[:, -1:]


# Create dummy variables
X = pd.get_dummies(X)


# Extract column names including dummy variables
train_enc_columns = X.columns


# Transform Categorical columns in Y dataset to dummy
Y = pd.get_dummies(Y)
Y = Y.iloc[:, -1]


# Split Data - X and Y datasets are training and testing sets
from sklearn.model_selection import train_test_split

X_train, X_test, Y_train, Y_test = train_test_split(
    X, Y, test_size=0.3, random_state=1234, stratify=Y
)


# Build the Random Forest model
from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(random_state=1234)


# Fit the data to the Random Forest object - Train Model
trained_model = rfc.fit(X_train, Y_train)


# Predict the outcome using Test data - Score Model
Y_predict = rfc.predict(X_test)

# Get the probability score - Scored Probabilities
Y_prob = rfc.predict_proba(X_test)[:, 1]

# Get Confusion matrix and the accuracy/score - Evaluate
from sklearn.metrics import confusion_matrix

cm = confusion_matrix(Y_test, Y_predict)
score = rfc.score(X_test, Y_test)


# Always log the primary metric
new_run.log("accuracy", score)


# -------------------------------------------------------
# Save all the transformations and models
# -------------------------------------------------------
import joblib

model_file = "./outputs/models.pkl"

joblib.dump(value=[train_enc_columns, trained_model], filename=model_file)


# Complete the run
new_run.complete()


# Get the Run IDs from the experiment
list(experiment.get_runs())

Этот файл Python создает эксперимент, получая доступ к рабочей области при обращении к файлу config.json, который мы создали на этапе создания рабочей области. И вы можете увидеть этапы обучения модели и регистрации метрик в одном файле. Теперь, когда мы создали и обучили модель, она готова к регистрации, для этого ее необходимо упаковать в совместимый формат. Это можно сделать с помощью библиотеки joblib или pickle.

Созданный нами эксперимент можно найти в разделе «Эксперименты» на левой панели.

Давайте посмотрим подробности запуска эксперимента,

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

А выходные данные модели, которые готовы к регистрации, можно найти на вкладке выходные данные+журналы под экспериментом.

Регистрация модели:

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

"""
Created on Tue Jun 22 17:24:45 2021

@author: hemachandrandhinakaran
"""
#!/usr/bin/env python3

from azureml.core import Workspace, Dataset, Experiment, Model

# accessing the workspace
print("Accessing the workspace")

my_azureml_sdk_dir = "/Users/hemz/Documents/GitHub/Machine_Learning/azuremlsdk/"

ws = Workspace.from_config(my_azureml_sdk_dir + "config")

# Access the run using run_id
new_run = ws.get_run("****run ID****")


# --------------------------------------------------------------------
# Register the model using the run object and uploaded pkl file
# --------------------------------------------------------------------
new_run.register_model(
    model_path="outputs/models.pkl",
    model_name="AdultIncome_models",
    tags={"source": "SDK Run", "algorithm": "RandomForest"},
    properties={"Accuracy": new_run.get_metrics()["accuracy"]},
    description="Combined Models from Run",
)


# =============================================================================
# # --------------------------------------------------------------------
# # Register the model using Model Class and Local pkl file
# # --------------------------------------------------------------------
# from azureml.core import Model
#
# Model.register(workspace=ws,
#                model_path='./outputs/models.pkl', # local path
#                model_name='AdultIncome_model_local',
#                tags={'source':'SDK-Local', 'algorithm':'RandomForest'},
#                properties={'Accuracy': 0.7866},
#                description='AdultIncome model from Local'
#                )
# =============================================================================


# --------------------------------------------------------------------
# Retrieve the registered models
# --------------------------------------------------------------------
Model.list(ws)

for model in Model.list(ws):

    print("\n", model.name, "version:", model.version)
    print("\t", "Run_ID : ", model.run_id)
    for prop_name in model.properties:
        prop = model.properties[prop_name]
        print("\t", prop_name, ":", prop)

    for tags in model.tags:
        tag = model.tags[tags]
        print("\t", tags, ":", tag)

Мы можем зарегистрировать модель с помощью объекта запуска или с помощью класса модели и локального файла pkl. Идите вперед и сравните идентификатор запуска, показанный во фрагменте ниже, с приведенным выше фрагментом запуска эксперимента (подробности webservice-exp001).

Как вы можете видеть другие детали, такие как,

  • Идентификатор запуска
  • Точность
  • Источник
  • Используемый алгоритм

Здесь я зарегистрировал модель как AdultIncome_models.

Ваше здоровье! мы на полпути... Давайте перейдем к следующему.

Конфигурация развертывания:

Надеюсь, вы уже поняли. Если вы угадали что-то, связанное с развертыванием, вы правы на 100%. Когда мы проходим через первую вершину, мы сталкиваемся с большим хаосом, с которым сталкиваются такие разработчики, как заставить обученную модель потреблять данные в реальном времени с возможностями вывода. Поверьте мне… я был там время от времени, пока не наткнулся на этот удивительный кластер Kubernetes (AKS) в Azure.. Эй, я шучу. Это кластер Azure Kubernetes (AKS)😜

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

  • Создать пользовательскую среду
  • Создание кластера AKS
  • Настройка конфигурации логического вывода
  • Конфигурация развертывания службы установки

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

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Jun 22 17:24:45 2021

@author: hemachandrandhinakaran
"""


# Import the Azure ML classes
from azureml.core import Workspace

# Access the workspace using config.json
print("Accessing the workspace from job....")
ws = Workspace.from_config("./config")


# -------------------------------------------------
# Create custom environment
# -------------------------------------------------
from azureml.core import Environment
from azureml.core.environment import CondaDependencies

# Create the environment
myenv = Environment(name="HemzEnvironment")

# Create the dependencies object
print("Creating dependencies....")
myenv_dep = CondaDependencies.create(
    conda_packages=["scikit-learn", "pip"], pip_packages=["azureml-defaults"]
)

myenv.python.conda_dependencies = myenv_dep

# Register the environment
print("Registering the environment...")
myenv.register(ws)


# -------------------------------------------------------------
# Create an Azure Kubernets Cluster
# -------------------------------------------------------------
from azureml.core.compute import AksCompute, ComputeTarget

cluster_name = "aks-cluster-001"

if cluster_name not in ws.compute_targets:
    print(cluster_name, "does not exist. Creating a new one...")
    print("Creating provisioniong config for Aks cluster....")

    aks_config = AksCompute.provisioning_configuration(
        location="eastus",
        vm_size="STANDARD_D11_V2",
        agent_count=1,
        cluster_purpose="DevTest",
    )

    print("Creating the AKS Cluster...")
    production_cluster = ComputeTarget.create(ws, cluster_name, aks_config)
    production_cluster.wait_for_completion(show_output=True)
else:
    print(cluster_name, "exists. Using it...")
    production_cluster = ws.compute_targets[cluster_name]


# -------------------------------------------------
# Create Inference Configuration
# -------------------------------------------------
from azureml.core.model import InferenceConfig

print("Creating Inference Configuration...")
inference_config = InferenceConfig(
    source_directory="/Users/hemz/Documents/GitHub/Machine_Learning/azuremlsdk/",
    entry_script="scoring_script.py",
    environment=myenv,
)


# -------------------------------------------------
# Create service deployment configuration
# -------------------------------------------------
from azureml.core.webservice import AksWebservice

print("Creating the Deployment configuration for webservice...")
deploy_config = AksWebservice.deploy_configuration(cpu_cores=1, memory_gb=1)


# -------------------------------------------------
# Create and deploy the webservice
# -------------------------------------------------
from azureml.core.model import Model

model = ws.models["AdultIncome_models"]

print("Deploying the web service....")
service = Model.deploy(
    workspace=ws,
    name="adultincome-service",
    models=[model],
    inference_config=inference_config,
    deployment_config=deploy_config,
    deployment_target=production_cluster,
)

service.wait_for_deployment(show_output=True)

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

Примечание 🔑. Убедитесь, что состояние развертывания «Здорово», в противном случае попробуйте выполнить повторное развертывание.

Использование веб-службы:

Очевидно, что помимо развертывания необходимо получать и видеть результаты с данными в реальном времени. Microsoft Azure предоставляет нам широкие возможности для использования веб-службы,

  • Использование вкладки "Использование" ML Studio
  • Использование доступа к рабочей области
  • Использование конечных точек API

Пробовал все три варианта, все отлично.

"""
Created on Tue Jun 22 17:24:45 2021

@author: hemachandrandhinakaran
"""
# -------------------------------------------------------------
# Consume the service end point using workspace access.
# -------------------------------------------------------------

# Import the Azure ML classes
from azureml.core import Workspace

# Access the workspace using config file
print("Accessing the workspace....")
ws = Workspace.from_config("./config")


# Access the service end points
print("Accessing the service end-points")
service = ws.webservices["adultincome-service"]


# Prepare the input data
import json

x_new = {
    "age": [46],
    "wc": ["Private"],
    "education": ["Masters"],
    "marital status": ["Married"],
    "race": ["White"],
    "gender": ["Male"],
    "hours per week": [60],
}

# Convert the dictionary to a serializable list in json
json_data = json.dumps({"data": x_new})

# Call the web service
print("Calling the service...")
response = service.run(input_data=json_data)

# Collect and convert the response in local variable
print("Printing the predicted class...")
predicted_classes = json.loads(response)

print("\n", predicted_classes)

"""
Created on Tue Jun 22 17:24:45 2021

@author: hemachandrandhinakaran
"""
# ----------------------------------------------------------------------
# Consume the webservice using API end points using "requests" library
#
# Steps to use requests module in python
# 1. Get scoring URI
# 2. Prepare the input data and create JSON
# 3. Prepare the headers with authorization key
# 4. Make a POST request to API using URI, headers and data
# 5. Collect the response and deserialize the JSON
# ----------------------------------------------------------------------

import requests
import json

# ------------------------------------------------------
# Set the URI for the web service
# ------------------------------------------------------
scoring_uri = "Endpoint URL"


# ------------------------------------------------------
# Prepare the input data and create the serialized JSON
# ------------------------------------------------------
x_new = {
    "age": [21],
    "wc": ["Private"],
    "education": ["HS-grad"],
    "marital status": ["Married"],
    "race": ["White"],
    "gender": ["Male"],
    "hours per week": [60],
}

# Convert the input data to a serialized JSON
json_data = json.dumps({"data": x_new})


# ---------------------------------------------------
# Create the headers with authorization key
# ---------------------------------------------------
key = "Primary or secondary key"

# Set the content type and authorization
headers = {"Content-Type": "application/json", "Authorization": f"Bearer {key}"}


# ---------------------------------------------------
# Make the request using POST method and collect the response
# ---------------------------------------------------
response = requests.post(scoring_uri, json_data, headers=headers)
predicted_classes = json.loads(response.json())

print("\n", predicted_classes)

Более того, Azure поддерживает множество языков, на которых вы можете работать (Python, R, Javascript).