Недостаточно вычислительной мощности?
Удаленное обучение модели за 5 шагов с помощью службы машинного обучения Azure
Зачем тебе это?
Вы начали разработку модели на своем локальном компьютере, но поскольку ваши наборы данных стали больше, а модели усложнились, вам нужно больше вычислений. Было бы здорово, если бы вы могли отправить свою учебную работу на масштабируемый кластер, обладающий всей необходимой вам мощностью.
Этот пост покажет вам, как это сделать за 5 шагов.
Что тебе нужно:
- локальная среда python: где-то вы можете запустить python
- Подписка Azure, где вы можете развернуть службы машинного обучения Azure в качестве ресурса.
Давайте начнем
- Настройка:
Установите 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)
Обучение модели займет некоторое время, вы можете просмотреть статус и результаты на портале.
Удачи и упорных тренировок!!