【问题标题】:How to parallelize work on an Azure ML Service Compute cluster?如何在 Azure ML 服务计算集群上并行工作?
【发布时间】:2019-12-22 21:36:54
【问题描述】:

我能够使用计算集群向 Azure ML 服务提交作业。它运行良好,自动缩放与自定义环境的良好灵活性相结合似乎正是我所需要的。然而,到目前为止,所有这些作业似乎只使用集群的一个计算节点。理想情况下,我希望使用多个节点进行计算,但我看到的所有方法都依赖于与 azure ML 服务的深度集成。

我的模特案例有点不典型。从之前的实验中,我确定了一组运行良好的架构(预处理步骤的管道 + Scikit-learn 中的估计器)。 使用RandomizedSearchCV 可以相当快(几分钟)对这些估计器之一进行超参数调整。因此,并行化这一步似乎不太有效。

现在我想调整和训练整个架构列表。 这应该很容易并行化,因为所有架构都可以独立训练。

理想情况下,我想要类似(伪代码)

tuned = AzurePool.map(tune_model, [model1, model2,...])

但是,我找不到任何有关如何使用 Azure ML 计算集群实现此目的的资源。 一个可接受的替代方案是以即插即用替代 sklearn 的 CV 调整方法的形式出现,类似于 daskspark 中提供的方法。

【问题讨论】:

    标签: python azure scikit-learn cluster-computing azure-machine-learning-service


    【解决方案1】:

    您可以通过多种方式使用 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 Compute Cluster 上设置 DASK 的示例,以便您可以对其进行交互式工作:https://github.com/danielsc/azureml-and-dask

    【讨论】:

      【解决方案2】:

      还有一个带有 worker_count_per_node 设置的ParallelTaskConfiguration Class,默认为 1。

      【讨论】:

        猜你喜欢
        • 2017-12-06
        • 1970-01-01
        • 2019-12-18
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        • 1970-01-01
        • 2016-09-09
        相关资源
        最近更新 更多