Исследователи данных и разработчики ИИ по всему миру используют различные инструменты и среды для создания и запуска рабочих процессов машинного обучения. Однако в эту современную эпоху 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).