Недостаточно вычислительной мощности?
Удаленное обучение модели за 5 шагов с помощью службы машинного обучения Azure

Зачем тебе это?

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

Этот пост покажет вам, как это сделать за 5 шагов.

Что тебе нужно:

  1. локальная среда python: где-то вы можете запустить python
  2. Подписка Azure, где вы можете развернуть службы машинного обучения Azure в качестве ресурса.

Давайте начнем

  1. Настройка:

Установите azure ml sdk на свой локальный компьютер.

pip install azureml-sdk

Начнем с создания ресурса службы машинного обучения Azure (AML):

Вы можете добавить это с портала

or

использовать питон:

from azureml.core import Workspace
ws = Workspace.create(name = <name of aml service resource>,
                     subscription_id= <your subs id>
                     resource_group= <rg containing the worspace>,
                     location= <closest location >)

Это должно развернуть рабочую область службы AML в вашей группе ресурсов, которая также будет присутствовать в вашей среде выполнения Python как объект (ws).

Если у вас уже есть служба AML, создайте объект рабочей области:

ws = Workspace.get(name = "<name of the service>",
                  subscription_id="xxxxx",
                  resource_group= "<name of the rg>")

2) Создать кластер

from azureml.core.compute import AmlCompute
from azureml.core.compute import ComputeTarget
import os
# A range within which you will scale your cluster
compute_name = "MyCompute"
min_nodes = 0
max_nodes = 3
#I am selecting a simple CPU machine
vm_size = "STANDARD_D2_V2"
#google the Standard_NCx series for GPU machines
#create a configuration object
provisioning_config = AmlCompute.provisioning_configuration(
vm_size = vm_size, 
                                                            min_nodes = min_nodes, 
                                                            max_nodes = max_nodes)
# create the cluster
compute_target = ComputeTarget.create(ws, 
                                      compute_name, 
                                      provisioning_config)

Вы должны увидеть вычисление, созданное на портале:

3) Загрузить данные:

Если ваши данные находятся на локальном компьютере, кластер AML не сможет получить к ним доступ. Таким образом, мы загрузим нужную папку данных в учетную запись хранения. Возможно, вы заметили, что при развертывании AML вместе с ним была развернута учетная запись хранения. Вы можете увидеть его на вкладке «Обзор» вашего рабочего пространства. Это называется хранилищем услуг AML по умолчанию.

Для простоты я собираюсь сделать прогноз сердечно-сосудистых заболеваний с помощью небольшого набора данных и простой модели. Вы можете скачать набор данных здесь: https://www.kaggle.com/ronitf/heart-disease-uci/downloads/heart-disease-uci.zip/1

#Create an object referring to the storage account
ds = ws.get_default_datastore()
#Upload your data folder
ds.upload(src_dir = '<path to your local data folder>',
          target_path='dont_break_my_heart',
          overwrite=True,
          show_progress=True)

4) Подготовьте сценарий обучения:

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

import os
import argparse
import pandas as pd
from azureml.core.run import Run
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.ensemble import GradientBoostingClassifier
#read the storage account mount point as an argument
parser = argparse.ArgumentParser()
parser.add_argument('--data-folder', type=str, dest='data_folder')
args = parser.parse_args()
#access the storage account
data_folder = os.path.join(args.data_folder, 'dont_break_my_heart')
print('Data folder:', data_folder)
#Read the data
df = pd.read_csv(data_folder+'/heart.csv', header = 'infer')
#Crete your train and test set
train, test = train_test_split(df,
                              test_size = 0.2,
                              random_state = 100)
train_x = train.drop('target', axis=1)
train_y = train['target']
test_x = test.drop('target', axis=1)
test_y = test['target']
def myModel():
    algo_name = "GradientBoost" 
         
    model = GradientBoostingClassifier(random_state=100, n_estimators=1000)
  
    model.fit(train_x, train_y)
pred = model.predict(test_x)
acc_score = accuracy_score(pred, test_y) * 100
return model, algo_name, acc_score
#get you model and the parameters.
model, algo_name, acc_score = myModel()
# get hold of the current run
run = Run.get_context()
#log metrics into the Exper
run.log('algo', algo_name)
run.log('accuracy', acc_score)

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

5) Отправьте сценарий:

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

script_folder = '<path to the folder containing train.py>'
from azureml.train.estimator import Estimator
script_params = {'--data-folder': ds.as_mount()}
from azureml.train.estimator import Estimator
est = Estimator(source_directory=script_folder,
                script_params=script_params,
                compute_target=compute_target,
                entry_script='train.py',
                conda_packages=['scikit-learn', 'pandas'])

Примечание. Мы передали расположение большого двоичного объекта в качестве параметра, поскольку с помощью объекта ds легко получить точку монтирования. Если бы вам пришлось включить это в train.py, вам пришлось бы хардкодить это.

Выполняйте работу удаленно

#Create an Experiment
my_experiment = Experiment(ws, 'heart_breaker')
run = my_experiment.submit(config=est)
run.wait_for_completion(show_output=True)

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

Удачи и упорных тренировок!!