如何并行处理 Azure ML 服务计算集群上的工作?
How to parallelize work on an Azure ML Service Compute cluster?
我能够使用计算集群将作业提交到 Azure ML 服务。它运行良好,自动缩放与自定义环境的良好灵活性相结合似乎正是我所需要的。然而,到目前为止,所有这些作业似乎只使用集群的一个计算节点。理想情况下,我想使用多个节点进行计算,但我看到的所有方法都依赖于与 azure ML 服务的深度集成。
我的建模案例有点不典型。从之前的实验中,我确定了一组运行良好的架构(预处理步骤流水线 + Scikit-learn 中的估计器)。
使用 RandomizedSearchCV 可以相当快地(几分钟)执行这些估计器之一的超参数调整。所以并行化这一步似乎不太有效。
现在我想调整和训练整个架构列表。
这应该很容易并行化,因为所有架构都可以独立训练。
理想情况下我想要类似的东西(伪代码)
tuned = AzurePool.map(tune_model, [model1, model2,...])
但是,我找不到有关如何使用 Azure ML 计算集群实现此目的的任何资源。
一个可以接受的替代方案是以即插即用的形式替代 sklearn 的 CV 调整方法,类似于 dask or spark.
中提供的方法。
您可以通过多种方式使用 AzureML 解决此问题。最简单的方法是使用 AzureML Python SDK 启动一些作业(基础示例取自 here)
from azureml.train.sklearn import SKLearn
runs = []
for kernel in ['linear', 'rbf', 'poly', 'sigmoid']:
for penalty in [0.5, 1, 1.5]:
print ('submitting run for kernel', kernel, 'penalty', penalty)
script_params = {
'--kernel': kernel,
'--penalty': penalty,
}
estimator = SKLearn(source_directory=project_folder,
script_params=script_params,
compute_target=compute_target,
entry_script='train_iris.py',
pip_packages=['joblib==0.13.2'])
runs.append(experiment.submit(estimator))
以上要求您将训练分解为脚本(或文件夹中的一组脚本)以及所需的 python 包。上面的估算器是使用 Scikit Learn 的便利包装器。还有用于 Tensorflow、Pytorch、Chainer 和通用估计器 (azureml.train.estimator.Estimator
) 的估计器——它们在 Python 包和它们使用的基础 docker 上都不同。
第二个选项,如果你真的在调整参数,是像这样使用 HyperDrive 服务(使用与上面相同的 SKLearn
Estimator):
from azureml.train.sklearn import SKLearn
from azureml.train.hyperdrive.runconfig import HyperDriveConfig
from azureml.train.hyperdrive.sampling import RandomParameterSampling
from azureml.train.hyperdrive.run import PrimaryMetricGoal
from azureml.train.hyperdrive.parameter_expressions import choice
estimator = SKLearn(source_directory=project_folder,
script_params=script_params,
compute_target=compute_target,
entry_script='train_iris.py',
pip_packages=['joblib==0.13.2'])
param_sampling = RandomParameterSampling( {
"--kernel": choice('linear', 'rbf', 'poly', 'sigmoid'),
"--penalty": choice(0.5, 1, 1.5)
}
)
hyperdrive_run_config = HyperDriveConfig(estimator=estimator,
hyperparameter_sampling=param_sampling,
primary_metric_name='Accuracy',
primary_metric_goal=PrimaryMetricGoal.MAXIMIZE,
max_total_runs=12,
max_concurrent_runs=4)
hyperdrive_run = experiment.submit(hyperdrive_run_config)
或者您可以使用 DASK 来安排您提到的工作。以下是如何在 AzureML 计算集群上设置 DASK 的示例,以便您可以在其上进行交互式工作:https://github.com/danielsc/azureml-and-dask
还有一个带有 worker_count_per_node 设置的 ParallelTaskConfiguration Class,默认为 1。
我能够使用计算集群将作业提交到 Azure ML 服务。它运行良好,自动缩放与自定义环境的良好灵活性相结合似乎正是我所需要的。然而,到目前为止,所有这些作业似乎只使用集群的一个计算节点。理想情况下,我想使用多个节点进行计算,但我看到的所有方法都依赖于与 azure ML 服务的深度集成。
我的建模案例有点不典型。从之前的实验中,我确定了一组运行良好的架构(预处理步骤流水线 + Scikit-learn 中的估计器)。 使用 RandomizedSearchCV 可以相当快地(几分钟)执行这些估计器之一的超参数调整。所以并行化这一步似乎不太有效。
现在我想调整和训练整个架构列表。 这应该很容易并行化,因为所有架构都可以独立训练。
理想情况下我想要类似的东西(伪代码)
tuned = AzurePool.map(tune_model, [model1, model2,...])
但是,我找不到有关如何使用 Azure ML 计算集群实现此目的的任何资源。 一个可以接受的替代方案是以即插即用的形式替代 sklearn 的 CV 调整方法,类似于 dask or spark.
中提供的方法。您可以通过多种方式使用 AzureML 解决此问题。最简单的方法是使用 AzureML Python SDK 启动一些作业(基础示例取自 here)
from azureml.train.sklearn import SKLearn
runs = []
for kernel in ['linear', 'rbf', 'poly', 'sigmoid']:
for penalty in [0.5, 1, 1.5]:
print ('submitting run for kernel', kernel, 'penalty', penalty)
script_params = {
'--kernel': kernel,
'--penalty': penalty,
}
estimator = SKLearn(source_directory=project_folder,
script_params=script_params,
compute_target=compute_target,
entry_script='train_iris.py',
pip_packages=['joblib==0.13.2'])
runs.append(experiment.submit(estimator))
以上要求您将训练分解为脚本(或文件夹中的一组脚本)以及所需的 python 包。上面的估算器是使用 Scikit Learn 的便利包装器。还有用于 Tensorflow、Pytorch、Chainer 和通用估计器 (azureml.train.estimator.Estimator
) 的估计器——它们在 Python 包和它们使用的基础 docker 上都不同。
第二个选项,如果你真的在调整参数,是像这样使用 HyperDrive 服务(使用与上面相同的 SKLearn
Estimator):
from azureml.train.sklearn import SKLearn
from azureml.train.hyperdrive.runconfig import HyperDriveConfig
from azureml.train.hyperdrive.sampling import RandomParameterSampling
from azureml.train.hyperdrive.run import PrimaryMetricGoal
from azureml.train.hyperdrive.parameter_expressions import choice
estimator = SKLearn(source_directory=project_folder,
script_params=script_params,
compute_target=compute_target,
entry_script='train_iris.py',
pip_packages=['joblib==0.13.2'])
param_sampling = RandomParameterSampling( {
"--kernel": choice('linear', 'rbf', 'poly', 'sigmoid'),
"--penalty": choice(0.5, 1, 1.5)
}
)
hyperdrive_run_config = HyperDriveConfig(estimator=estimator,
hyperparameter_sampling=param_sampling,
primary_metric_name='Accuracy',
primary_metric_goal=PrimaryMetricGoal.MAXIMIZE,
max_total_runs=12,
max_concurrent_runs=4)
hyperdrive_run = experiment.submit(hyperdrive_run_config)
或者您可以使用 DASK 来安排您提到的工作。以下是如何在 AzureML 计算集群上设置 DASK 的示例,以便您可以在其上进行交互式工作:https://github.com/danielsc/azureml-and-dask
还有一个带有 worker_count_per_node 设置的 ParallelTaskConfiguration Class,默认为 1。